how to build developer tools on top of intellij platform
Post on 19-Oct-2014
3.379 views
DESCRIPTION
Slides from a July 30th webinar on building tools for IntelliJ Platform: * What is IntelliJ Platform? * Who is it suited for? * Why is it better than Eclipse and Netbeans platforms? * How is it different from IntelliJ IDEA Community Edition? * Is it possible to build a commercial product based on IntelliJ Platform? * Plugins for IntelliJ IDEA Community Edition vs products based on IntelliJ Platform. * What steps must be taken to create a product based on IntelliJ Platform? * How you can contribute to IntelliJ Platform?TRANSCRIPT
How to Build Developer Tools on Top
of IntelliJ Platform
Dmitry Jemerov, CTO, JetBrains
Tuesday, July 30, 13
What is IntelliJ Platform
• Foundation of all IntelliJ-based IDEs
• Provides building blocks for developer tools
• Open-source, Apache 2 license
Tuesday, July 30, 13
JetBrains Productson IntelliJ Platform
Tuesday, July 30, 13
IntelliJ IDEA
• Where it all began
• Started as monolithic IDE
• Refactored over the years to modularize and introduce extension points
• For more history: Malmö, September 7,http://www.jetbrains.com/jetbrainsday/
Tuesday, July 30, 13
"Small" IDEs
• PyCharm, RubyMine, WebStorm, PhpStorm, AppCode, C++ IDE, <to be announced>
• Set of bundled plugins + UI customizations
• Same source tree as IntelliJ IDEA
Tuesday, July 30, 13
MPS
• Meta Programming System - IDE for domain specific languages
• Uses IntelliJ IDEA's overall UI framework
• Replaces text editing and PSI-based features with its own DSL framework
Tuesday, July 30, 13
Kotlin Compiler
• Same code for command-line compiler and IDE features in plugin
• Uses low-level parsing/PSI framework and Java PSI
• 7.6M distribution
Tuesday, July 30, 13
UpSource
• http://upsource.jetbrains.com/
• Online code browser
• Uses core PSI, indexing, Java language support (other languages coming soon)
• Web-based UI
Tuesday, July 30, 13
External Productson IntelliJ Platform
Tuesday, July 30, 13
Android Studio
• http://developer.android.com/sdk/installing/studio.html
• Repackaged IntelliJ IDEA Community Edition
• Custom UI for Gradle-based project model
• Developed in partnership with JetBrains
Tuesday, July 30, 13
GuideWire
• http://www.guidewire.com/
• Insurance business
• Gosu programming language
• Lots of domain-specific UI
• Commercial
Tuesday, July 30, 13
mbeddr
• http://mbeddr.wordpress.com/
• MPS-based tool for embedded development (generates C code)
• Open-source
Tuesday, July 30, 13
esn.me
• http://www.planetframework.com/
• Commercial Python framework for real-time Web
• IDE based on PyCharm with custom plugin
• Acquired by EA, no longer supported
Tuesday, July 30, 13
Realaxy
• ActionScript IDE based on MPS
• Commercial
• No longer in development, last released in 2010
Tuesday, July 30, 13
IntelliJ Platform Components
Tuesday, July 30, 13
core
• Virtual file system, lexer, parser, PSI, references
• Utilities: collections, concurrency etc.
• No UI
• No specific language support
Tuesday, July 30, 13
platform
• Action systen
• UI framework: toolwindows, dialogs etc.
• Text editor
• Diff
Tuesday, July 30, 13
lang
• Language-independent implementations of core code insight features
• Highlighting, navigation, completion, refactorings, code formatter and a whole lot more
Tuesday, July 30, 13
Other Platform Modules
• Local history
• Debugger framework
• Test runner framework
• VCS framework
Tuesday, July 30, 13
java-psi
• UI-less part of IntelliJ IDEA's Java support
• Parser, reference resolution, inspections etc.
Tuesday, July 30, 13
xml
• Parsing, DTD/XML Schema/RelaxNG, etc.
• DOM framework for XML-based DSLs
• Recently separated into non-UI and UI parts
Tuesday, July 30, 13
Other Platform Extensions
• Spellchecker
• Images support
• Regular expression support
Tuesday, July 30, 13
Community Edition Plugins
• Version control: Git, Mercurial, Subversion, CVS
• Build systems: Ant, Maven, Gradle
• Tasks / issue tracker integration
• UI Designer
• Terminal
Tuesday, July 30, 13
IntelliJ Platform vs Eclipse/NetBeans RCP
• Not a general-purpose RCP
• Best for code-centric tools, a lot of stuff comes for free
• Not necessarily best for graphics-intensive tools
Tuesday, July 30, 13
Product Opportunities
• Language IDEs: Haskell, Go, Lua, D, Perl, assembly, Verilog/VHDL
• Framework-specific IDEs
• Code analysis/exploration tools
• Game development?
• ERP?
Tuesday, July 30, 13
Plugin vs Product
• Start with plugin in any case
• Product lets you remove what you don't need, change what you don't like
• Product gives you control over branding
• Both plugins and products can use commercial license
Tuesday, July 30, 13
Product Licensing
• IntelliJ Platform is Apache 2 licensed, does not restrict licensing of derivative products
• Talk to us if you need components only available in IntelliJ IDEA Ultimate
Tuesday, July 30, 13
Building a Product
Tuesday, July 30, 13
idea.platform.prefix
• System property used as prefix for names of plugin and application info files
• Set in default VM options
Tuesday, July 30, 13
Product Plugin File
• <idea.platform.prefix>Plugin.xml
• For example, IdeaPlugin.xml for IDEA CE
• Same format as regular plugin.xml file
• Can include chunks of components from platform
Tuesday, July 30, 13
<idea-plugin version="2" xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="/META-INF/IdeaPlugin.xml" xpointer="xpointer(/idea-plugin/*)"/></idea-plugin>
Tuesday, July 30, 13
Application Info File
• <idea.platform.prefix>ApplicationInfo.xml
• For example, IdeaApplicationInfo.xml for IDEA CE
• Single entry point for all branding info
• Patched by build script to include build number etc.
Tuesday, July 30, 13
<component> <version codename="Community Edition" major="13" minor="0" eap="true"/> <company name="JetBrains s.r.o." url="http://www.jetbrains.com/"/> <build number="__BUILD_NUMBER__" date="__BUILD_DATE__"/> <logo url="/idea_community_logo.png"/> <about url="/idea_community_about.png"/></component>
Tuesday, July 30, 13
Building the Product
• build/scripts/dist.gant
• IntelliJ project file built with JPS (JetBrains' homegrown build system)
• Layout tasks used to build structure of product distribution
• Layout has common and OS-specific (Windows, Linux, Mac) parts
Tuesday, July 30, 13
def info = layout(targetDirectory) { dir("lib") { jar("util.jar") { module("util") module("util-rt") }
jar("openapi.jar") { openapiModules.each { module it} } }}
Tuesday, July 30, 13
Windows Launcher
• native/WinLauncher
• tools/LauncherGenerator
• buildWinLauncher() in utils.gant
Tuesday, July 30, 13
Distribution Scripts
• Windows - NSIS installer, scripts currently not open but likely will be
• Mac - DMG build script tied to our environment, roll your own
• Linux - just a .tar.gz
Tuesday, July 30, 13
Server Infrastructure
• Exception reporting
• Automatic updates and patches
• Plugin repository
• Usage statistics
• All URLs in ApplicationInfo.xml
Tuesday, July 30, 13
Contributing to IntelliJ Platform
Tuesday, July 30, 13
Contribution Workflow
• Sign the CLA
• Send us a pull request on GitHub
• Explain the motivation for the change
Tuesday, July 30, 13