Diana Plugin Migration Guide

IntelliJ IDEA 8.0 (codename "Diana") went through a major refactoring of the plugin API in order to decouple core platform functionality from Java support. This breaks compatibility for many third-party plugins. This page describes the major API changes and the steps required to correct them.

This list is not exhaustive; if you run into a problem which is not described here, feel free to ask for help on the OpenAPI forum.

Language split into extensions

The com.intellij.lang.Language class no longer contains getters for different sub-components of custom language support. Instead, these sub-components are now registered as independent extensions.

before
class MyLanguage extends Language {
  public ParserDefinition getParserDefinition() {
    return new MyParserDefinition();
  }
}
after
<extensions defaultExtensionNs="com.intellij">
  <lang.parserDefinition language="MyLanguage" 
      implementationClass="com.sample.mylanguage.MyParserDefinition"/>
</extensions>
before
element.getLanguage().getParserDefinition()
after
LanguageParserDefinitions.INSTANCE.forLanguage(element.getLanguage())

PsiElementVisitor and PsiRecursiveElementVisitor split

The PsiElementVisitor interface no longer includes members for visiting all Java, JSP and XML elements. Instead, separate classes (JavaElementVisitor, XmlElementVisitor and so on) are used for different languages.

before
class MyVisitor extends PsiRecursiveElementVisitor {
  public void visitMethod(PsiMethod method) {
  }
}
after
class MyVisitor extends JavaRecursiveElementVisitor {
  public void visitMethod(PsiMethod method) {
  }
}

Java dependencies extracted from core PSI classes

Java-related methods moved from PsiManager to JavaPsiFacade, from PsiDirectory to JavaDirectoryService, from CodeStyleManager to JavaCodeStyleManager. PsiElementFactory has been split into multiple factories for different languages.

before
PsiManager.getInstance(project).findClass("java.lang.Object");

PsiManager.getInstance(project).getEffectiveLanguageLevel();

PsiManager.getInstance(project).getElementFactory().createFileFromText()

PsiManager.getInstance(project).getShortNamesCache().getFilesByName("a.txt")

directory.getPackage()

CodeStyleManager.getInstance(project).shortenClassRefeences(element);
after
JavaPsiFacade.getInstance(project).findClass("java.lang.Object");

LanguageLevelProjectExtension.getInstance(project).getLanguageLevel()

PsiFileFactory.getInstance(project).createFileFromText()

FilenameIndex.getFilesByName(project, "a.txt", ProjectScope.getProjectScope(project))

JavaDirectoryService.getInstance().getPackage(directory)

JavaCodeStyleManager.getInstance(project).shortenClassReferences(element);

PSI stuff removed from Project

before
project.getAllScope()
after
ProjectScope.getAllScope(project)

ProjectJdk collapsed into Sdk

Compiler-related methods removed from ModuleRootManager

before
ModuleRootManager.getInstance(module).getCompilerOutputPathUrl();
after
CompilerModuleExtension.getInstance(module).getCompilerOutputUrl();

Execution API refactoring

Charset API refactoring

before
CharsetToolkit.getIDEOptionsCharset()
after
EncodingManager.getInstance().getDefaultCharset()

PeerFactory deprecated

before
PeerFactory.getInstance().getVcsContextFactory()
after
VcsContextFactory.SERVICE.getInstance()

HighlighterColors split

before
HighlighterColors.JAVA_LINE_COMMENT

HighlighterColors.JAVA_SEMICOLON
after
SyntaxHighlighterColors.LINE_COMMENT

JavaHighlighterColors.JAVA_SEMICOLON

KeymapExtension API refactored

VFS decoupled from Module

before
VfsUtil.getModuleForFile()

FileChooserDescriptor.setContextModule(module)
after
ModuleUtil.findModuleForFile()   // works in both 7.0 and 8.0

FileChooserDescriptor.putUserData(LangDataKeys.MODULE_CONTEXT, module)

Labels

 
(None)
  1. Mar 24

    Bas Leijdekkers says:

    JavaDirectoryService.getInstance(directory.getProject()).getPackage(directory) s...

    JavaDirectoryService.getInstance(directory.getProject()).getPackage(directory)
    should be
    JavaDirectoryService.getInstance().getPackage(directory)

    1. Mar 24

      Dmitry Jemerov says:

      Fixed, thanks.

      Fixed, thanks.

  2. Mar 26

    Sascha Weinreuter says:

    The PsiElementVisitor changes are pretty evil because they tend to break existin...

    The PsiElementVisitor changes are pretty evil because they tend to break existing code while it may still compile and even run without throwing obvious errors. I think this should be explicitly mentioned in the above section.

    An even better solution might have been to intoduce a new "PsiElementVisitorBase" and make the old PsiElementVisitor final/deprecated. This would ensure that existing and now incorrect code neither compiles nor runs without throwing some obvious errors (IncompatibleClassChangeError?).

    Sascha

  3. Mar 27

    Sascha Weinreuter says:

    {{HighlighterColors.JAVAKEYWORD}} > {{SyntaxHighlighterColors.KEYWORD}} should b...

    HighlighterColors.JAVA_KEYWORD -> SyntaxHighlighterColors.KEYWORD should be added as well.

  4. Mar 27

    Sascha Weinreuter says:

    {{com.intellij.openapi.vfs.VfsUtil.getModuleForFile()}} has been (re)moved: f...

    com.intellij.openapi.vfs.VfsUtil.getModuleForFile() has been (re)moved:

    final Module module = VfsUtil.getModuleForFile(project, virtualFile);

    ->

    final ProjectFileIndex index = ProjectRootManager.getInstance(project).getFileIndex();
    final Module module = index.getModuleForFile(virtualFile);
  5. Mar 27

    Sascha Weinreuter says:

    It might also be worth to add this: com.intellij.openapi.fileChooser.FileChoo...

    It might also be worth to add this:

    com.intellij.openapi.fileChooser.FileChooserDescriptor#setContextModule(module);

    ->

    com.intellij.openapi.fileChooser.FileChooserDescriptor#putUserData(DataKeys.MODULE_CONTEXT, module);

    This one took a while to figure out.

    1. Mar 28

      Dmitry Jemerov says:

      Added last 3 items, thanks.

      Added last 3 items, thanks.

  6. Apr 14

    Anonymous says:

    com.intellij.openapi.vcs.checkin.CheckinEnvironment has a new method &nbsp;> kee...

    com.intellij.openapi.vcs.checkin.CheckinEnvironment has a new method

     > keepChangeListAfterCommit

    Not sure what to return to have the same behaviour as Demetra ?

    1. Apr 14

      Dmitry Jemerov says:

      return true;

      return true;

Add Comment