自定义Intellij语言构建在XML之上

时间:2015-08-14 18:03:16

标签: intellij-idea intellij-plugin

首先,我的意图是什么。我的项目中有一组XML文件。其中一些是等级的。顶级XML看起来像这样(非常简单的例子)

<RootElement>
  <Element id=1>
  <Element id=2>
  <Element id=3>
<RootElement>

元素本身包含一些其他元素和属性,但在这种情况下它不相关。

有许多具有这种结构的文件:

<RootElement>
  <Element id=1 superId=3>
  <Element id=2 superId=3>
  <Element id=3 superId=2>
<RootElement>

其中superID是根XML文件的索引。我想要实现的是一个插件,我可以在这两个文件之间进行简单的导航。

我的想法是创建一种新的语言,它将扩展XML并添加一些额外的功能。只有具有特定名称(2或3)的文件才会成为该语言的一部分。

我创建了新语言:

public class MyLanguage extends XMLLanguage {

  public static final MyLanguage INSTANCE = new MyLanguage();

  protected MyLanguage() {
      super(XMLLanguage.INSTANCE,"MyLanguage", new String[]{"text/xml"});
  }
}

新文件类型:

public class MyLanguageFileType extends XmlLikeFileType {      
  public static   final MyLanguageFileType INSTANCE = new MyLanguageFileType();

protected MyLanguageFileType() {
  super(MyLanguage.INSTANCE);
}
@Override
public Icon getIcon() {
    return Icons.FILE;
}

新工厂:

public class MyLanguageFileFactory extends XmlFileTypeFactory {
  @Override
  public void createFileTypes(FileTypeConsumer fileTypeConsumer) {
    fileTypeConsumer.consume(MyLanguageFileType.INSTANCE,
            new   FileNameMatcherFactoryImpl().createMatcher("nameOfXML1.xml"),
            new FileNameMatcherFactoryImpl().createMatcher("nameOfXML2.xml")
    );
}

第一个问题是什么?我看到带有正确图标的文件,但是当我创建Anotator并将其注册到MyLanguage时,它不起作用。当我将相同的Annotator注册到XML文件时,注释效果很好。

所以第一个问题是,我做错了什么?

谢谢大家。

P.S。:最小的FileTypeFactory效果很好,因为我可以看到具有特定名称的文件,其中包含我设置的图标。

2 个答案:

答案 0 :(得分:3)

您不需要实施自己的语言来支持导航。您需要做的就是实现一个PsiReferenceContributor,它将引用XML文件的属性。

答案 1 :(得分:0)

如果您只需要代码完成和静态分析,则另一种解决方案是在<xml.schemaProvider implementation="...">文件中使用plugin.xml标记,并使用返回本地XmlSchemaProvider文件的自定义*.xsd与您的插件一起打包。有关如何执行此操作的示例,请参阅JavaFxSchemaProvider