setDefaultReturnToken混淆了语法高亮

时间:2015-12-21 22:40:41

标签: java eclipse eclipse-plugin syntax-highlighting jface

我正在开发一个带有自定义文本编辑器的eclipse插件,我想为其提供语法高亮显示。因此,我实施了自己的RuleBasedPartitionScanner和相应的SourceViewerConfiguration 当我没有使用PartitionScanner的defaultReturnToken时,一切正常,但是当我尝试设置默认的defaultReturnToken时,语法高亮消失。

My PartitionScanner:

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_CONTENT_TYPE类型,而是类型SQFPartitioScanner.CODE我改变了我的SourceViewerConfiguration,因为我只更改了getPresentationReconciler() - 方法:

public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
        PresentationReconciler reconciler = new PresentationReconciler();

        DefaultDamagerRepairer dr = new DefaultDamagerRepairer(this.getKeywordScanner());
//      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);

        return reconciler;
    }

我是否需要更改语法高亮显示才能将defaultReturnToken设置为SQFPartitionScanner.SQF_CODE

修改
当我取消注释行

//      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_CONTENT_TYPE类型,但它不是SQFPartitionScanner.SQF_CODE类型

1 个答案:

答案 0 :(得分:0)

编辑

我认为问题可能是您需要将两种新内容类型添加到新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 };
}

同时删除commentcode变量并将其替换为SQFPartitionScanner中的最终静态变量,因此您始终引用相同的实例。

<强> -------------------------------------------- ------------

似乎有些内容默认为IDocument.DEFAULT_CONTENT_TYPE以及对contentType的许多依赖项。例如,在PresentationReconciler中,它使用分区的内容类型获取损坏程序和协调程序。根据您使用修理工设置的contentType存储损坏程序。它们是根据分区报告的类型检索的,在某些情况下默认为IDocument.DEFAULT_CONTENT_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。