Intellij idea 基于XML的定制Intellij语言

Intellij idea 基于XML的定制Intellij语言,intellij-idea,intellij-plugin,Intellij Idea,Intellij Plugin,首先,我的意图是什么。我的项目中有一组XML文件。其中一些是分级的。顶部的XML如下所示(非常简单的示例) 新文件类型: public class MyLanguageFileType extends XmlLikeFileType { public static final MyLanguageFileType INSTANCE = new MyLanguageFileType(); protected MyLanguageFileType() { super(MyL

首先,我的意图是什么。我的项目中有一组XML文件。其中一些是分级的。顶部的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")
    );
}
第一个问题是什么?我看到带有右图标的文件,但当我创建一个Stator并将其注册到我的语言时,它不起作用。当我向XML文件注册相同的注释器时,注释工作得很好

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

谢谢大家


注意:Minimally FileTypeFactory工作得很好,因为我可以看到带有我设置的图标的特定名称的文件。

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

如果您只需要代码完成和静态分析,另一个解决方案是在
plugin.XML
文件中使用一个
标记和一个返回本地
*.xsd
与插件一起打包的文件。有关如何执行此操作的示例,请参见。

非常感谢,但我有两个问题。是否可以定义在出现多个结果的情况下,如何在弹出窗口中显示引用?我可以在弹出窗口中看到被引用的XmlTag的名称,但我希望看到一个属性的值属于被引用的XmlTag。第二个问题是,当找不到引用时,如何支持“无法解析symbel”警告?谢谢
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")
    );
}