建立在 XML 之上的自定义 Intellij 语言
Custom Intellij language built on the top of XML
首先,我的意图是什么。我的项目中有一组 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 时,它不起作用。当我将相同的注释器注册到 XML 文件时,注释效果很好。
所以第一个问题是,我做错了什么?
谢谢大家
P.S.: 至少 FileTypeFactory 运行良好,因为我可以看到具有特定名称的文件以及我为其设置的图标。
您不需要实现自己的语言来支持导航。您需要做的就是实现一个 PsiReferenceContributor,它将引用注入 XML 文件的属性。
如果您只需要代码完成和静态分析,另一种解决方案是在您的 plugin.xml
文件中使用 <xml.schemaProvider implementation="...">
标记,其中自定义 XmlSchemaProvider
returns 一个本地*.xsd
与您的插件一起打包的文件。有关如何执行此操作的示例,请参阅 JavaFxSchemaProvider。
首先,我的意图是什么。我的项目中有一组 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 时,它不起作用。当我将相同的注释器注册到 XML 文件时,注释效果很好。
所以第一个问题是,我做错了什么?
谢谢大家
P.S.: 至少 FileTypeFactory 运行良好,因为我可以看到具有特定名称的文件以及我为其设置的图标。
您不需要实现自己的语言来支持导航。您需要做的就是实现一个 PsiReferenceContributor,它将引用注入 XML 文件的属性。
如果您只需要代码完成和静态分析,另一种解决方案是在您的 plugin.xml
文件中使用 <xml.schemaProvider implementation="...">
标记,其中自定义 XmlSchemaProvider
returns 一个本地*.xsd
与您的插件一起打包的文件。有关如何执行此操作的示例,请参阅 JavaFxSchemaProvider。