Java setDefaultReturnToken会弄乱语法高亮显示
我正在开发一个带有自定义文本编辑器的eclipse插件,我想为其提供语法高亮显示。因此,我已经实现了我自己的Java setDefaultReturnToken会弄乱语法高亮显示,java,eclipse,eclipse-plugin,syntax-highlighting,jface,Java,Eclipse,Eclipse Plugin,Syntax Highlighting,Jface,我正在开发一个带有自定义文本编辑器的eclipse插件,我想为其提供语法高亮显示。因此,我已经实现了我自己的基于规则的分区扫描程序和相应的源视图配置 当我没有弄乱PartitionScanner的defaultReturnToken时,一切都正常工作,但是当我尝试设置默认defaultReturnToken时,语法高亮显示消失 我的分区扫描程序: public class SQFPartitionScanner extends RuleBasedPartitionScanner { p
基于规则的分区扫描程序
和相应的源视图配置
当我没有弄乱PartitionScanner的defaultReturnToken时,一切都正常工作,但是当我尝试设置默认defaultReturnToken时,语法高亮显示消失 我的分区扫描程序:
public class SQFPartitionScanner extends RuleBasedPartitionScanner {
public static final String SQF_COMMENT = "__sqf_Comment";
public static final String SQF_CODE = "__sqf_Code";
public SQFPartitionScanner() {
IToken comment = new Token(SQF_COMMENT);
IToken code = new Token(SQF_CODE);
IPredicateRule[] rules = {
//rule for multiLine comments
new MultiLineRule("/*", "*/", comment),
//rule for singleLine comments
new EndOfLineRule("//", comment)
};
this.setPredicateRules(rules);
this.setDefaultReturnToken(code);
}
}
由于生成的此标记不再是IDocument.DEFAULT\u CONTENT\u type
类型,而是类型SQFPartitioScanner.code
我更改了我的SourceViewerConfiguration
,如下所示(我只更改了getPresentationReconciler()
-方法):
要使语法突出显示与设置为SQFPartitionScanner.SQF_code
的defaultReturnToken一起工作,是否还需要修改其他内容
编辑:当我取消对行的注释时
// reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
// reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
和评论
reconciler.setDamager(dr, SQFPartitionScanner.SQF_CODE);
reconciler.setRepairer(dr, SQFPartitionScanner.SQF_CODE);
我仍然没有语法突出显示。因此,我怀疑默认令牌没有正确创建,因为它显然不是
IDocument.default\u CONTENT\u type
类型,但它不是SQFPartitionScanner.SQF\u code
类型,也不是EDIT:
我认为问题可能在于,您需要将这两种新内容类型添加到新SourceViewerConfiguration中的getConfiguredContentTypes方法中。我认为您需要更改SQFPartitionScanner,以便在顶部显示以下行:
public static final IToken SQF_Comment_Type = new Token(SQF_COMMENT);
public static final IToken SQF_Code_Type = new Token(SQF_CODE);
将getConfigurationContentTypes更改为:
public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
return new String[] { IDocument.DEFAULT_CONTENT_TYPE,
SQFPartitionScanner.SQF_Comment_Type, SQFPartitionScanner.SQF_Code_type };
}
同时删除comment
和code
变量,并在SQFPartitionScanner中将它们替换为最终的静态变量,因此您总是引用相同的实例
--------------------------------------------------------------
似乎有些东西默认为IDocument.DEFAULT\u CONTENT\u类型,并且许多依赖于contentType。例如,在PresentationReconciler中,它使用分区的内容类型获取损坏管理器和协调器。损坏器是根据您与修理厂设置的contentType存储的。它们是根据分区报告的类型检索的,在某些情况下默认为IDocument.default\u CONTENT\u type:
if (document instanceof IDocumentExtension3) {
IDocumentExtension3 extension3= (IDocumentExtension3) document;
try {
return extension3.getPartition(partitioning, offset, preferOpenPartitions);
} catch (BadPartitioningException x) {
return new TypedRegion(0, document.getLength(), IDocument.DEFAULT_CONTENT_TYPE);
}
}
所以我怀疑,如果你想拥有自己的内容类型,你需要在整个系统中正常工作。也就是说,我认为您可能有一些不一致的地方,一些内容认为它是默认类型
查看发生了什么的一种方法是将相关eclipse插件的源JAR添加到您的环境中,并逐步查看PresentationReconciler中在运行时发生的关于内容类型的情况
另一种方法是从上面暂时取消注释以下行:
// reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
// reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
因此,您已经为这两种类型注册了dr,并查看高亮显示是否返回。如果是这样,这就证实了问题出在文档返回的contentType上。当我取消注释这些行时,仍然没有语法突出显示再次出现……甚至当我注释将damager和Repair设置为type
SQFPartitionScanner.SQF_code
的两行时,我的假设也是错误的(再次)。是否确保使用添加的类型修改了SourceViewerConfiguration
中的getConfiguredContentTypes()
?尝试了此操作,但getConfiguredContentTypes()
需要一个字符串数组而不是IToken数组,因此我不能在那里使用IToken常量,而仅在SQFPartitionScanner中使用常量对我在getConfiguredContentTypes()中添加新的contentTypes没有帮助
我甚至尝试删除默认内容类型
或其他两种类型中的一种,但结果在所有情况下都是一样的
// reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
// reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);