首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setDefaultReturnToken扰乱语法高亮显示

setDefaultReturnToken扰乱语法高亮显示
EN

Stack Overflow用户
提问于 2015-12-21 22:40:40
回答 1查看 58关注 0票数 0

我正在开发一个具有自定义文本编辑器的eclipse插件,我想为它提供语法突出显示。因此,我实现了自己的RuleBasedPartitionScanner和相应的SourceViewerConfiguration

当我不处理defaultReturnToken的PartitionScanner时,一切都很好,但是当我试图设置默认的defaultReturnToken时,语法突出显示就消失了。

我的PartitionScanner:

代码语言:javascript
复制
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()-method):

代码语言:javascript
复制
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

编辑:

当我取消评论的时候

代码语言:javascript
复制
//      reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
//      reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);

和评论

代码语言:javascript
复制
reconciler.setDamager(dr, SQFPartitionScanner.SQF_CODE);
reconciler.setRepairer(dr, SQFPartitionScanner.SQF_CODE);

我仍然没有语法高亮显示。

因此,我怀疑默认令牌没有正确创建,因为显然它不再是IDocument.DEFAULT_CONTENT_TYPE类型了,但它也不是SQFPartitionScanner.SQF_CODE类型

EN

回答 1

Stack Overflow用户

发布于 2015-12-21 23:19:03

编辑

我认为问题可能在于您需要在新的getConfiguredContentTypes中将这两种新内容类型添加到SourceViewerConfiguration方法中。我认为您需要更改SQFPartitionScanner,使其顶部有以下几行:

代码语言:javascript
复制
public static final IToken SQF_Comment_Type = new Token(SQF_COMMENT);
public static final IToken SQF_Code_Type = new Token(SQF_CODE);

将getConfigurationContentTypes更改为:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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插件的源jars添加到您的环境中,并逐步了解并查看在运行时PresentationReconciler中有关内容类型的情况。

另一种方法是从上面暂时取消下列行的注释:

代码语言:javascript
复制
//      reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
//      reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);

因此,您已经为这两种类型注册了dr,并查看突出显示是否返回。如果是这样的话,这就证实了这个问题是围绕着contentType从文档回来的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34405561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档