代码之家  ›  专栏  ›  技术社区  ›  Ondrej Havlicek

基于XML构建的自定义Intellij语言

  •  4
  • Ondrej Havlicek  · 技术社区  · 10 年前

    首先,我的意图是什么。我的项目中有一组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")
        );
    }
    

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

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

    谢谢大家。

    P.S.:Minimaly FileTypeFactory工作得很好,因为我可以看到带有特定名称的文件,以及我设置的图标。

    2 回复  |  直到 10 年前
        1
  •  5
  •   yole    10 年前

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

        2
  •  0
  •   breandan    7 年前

    如果您只需要代码完成和静态分析,另一个解决方案是使用 <xml.schemaProvider implementation="..."> 在您的 plugin.xml 具有自定义的文件 XmlSchemaProvider 返回本地 *.xsd 使用插件打包的文件。看见 JavaFxSchemaProvider 以了解如何执行此操作的示例。