【问题标题】:Turn off syntax error marks for custom keywords in CDT关闭 CDT 中自定义关键字的语法错误标记
【发布时间】:2019-04-24 02:32:18
【问题描述】:

使用 CDT 进行开发可能会令人沮丧,因为没有人回答您的问题,而且几乎没有任何文档。话虽如此,让我尝试一个简单的:

在我的 Eclipse 插件中,用户想要使用类似于 C++ 的语言来编辑文件。为了突出显示其他关键字,我创建了一个扩展 GPPScannerExtensionConfiguration 的类,如下所示:

public class GRASPScannerExtensionConfiguration extends GPPScannerExtensionConfiguration {

    private static GRASPScannerExtensionConfiguration instance;

    public static synchronized GRASPScannerExtensionConfiguration getInstance() {
        if (instance == null)
            instance = new GRASPScannerExtensionConfiguration(version(8, 0));
        return instance;
    }

    public GRASPScannerExtensionConfiguration(int version) {
        super(version);

        /*
         * add GRASP specific configuration
         */
        addKeyword("@func".toCharArray(), IToken.t_void);
        addKeyword("@tag".toCharArray(), IToken.t_void);
    }
}

在这个类中,我的关键字 @func@tag 像 C++ 中的 void 一样突出显示。但是编辑器在这些关键字下划线并说“语法错误”。

我知道我可以停用 Window -> Preferences -> General -> Editors -> Text Editors -> Annotations 中的语法错误,但这会 1.) 停用所有语法错误和 2.) 要求用户手动执行此设置。

我怎样才能只为我自己的附加关键字停用语法错误标记?

【问题讨论】:

    标签: java-8 eclipse-plugin eclipse-cdt


    【解决方案1】:

    我怎样才能只为我自己的附加关键字停用语法错误标记?

    简短的回答是你不能。

    解析器没有一种方法来区分“由您的附加关键字引起的语法错误”和“由其他原因引起的语法错误”而没有被教导这种方式。在遇到这样的关键字后,它也没有办法恢复解析,因此声明的后续部分(或表达式或关键字出现的任何上下文)被正确解析,再次没有被教导这种方式。

    要教解析器这些东西,您必须以新的方式修改/扩展它。我不知道当前的扩展点可以让你这样做,所以你必须分叉提供解析器的插件,或者上游新的扩展点。

    【讨论】:

    • 扩展点org.eclipse.cdt.corel.ErrorParser可以在这里帮忙吗?
    • @Sadik IErrorParser 用于解析来自编译器输出的错误消息,以便可以在“问题”视图中显示错误消息。与 CDT 解析器产生的语法错误无关。
    • 扩展GNUCPPSourceParserGPPParserExtensionConfiguration怎么样?
    • 扩展 GNUCPPSourceParser 如果您能够覆盖相关方法,可能会起作用。这些新关键字在语法上出现在哪里?您尝试实现的语言扩展是否有一些文档?
    • 例如@func在函数定义之前,可以与static或volatile组合,如@func static void private_function() {...}另一个是@call,用于调用函数(以某种方式),如@987654329 @。这些已经是最重要的了。它们都以'@'开头。有用户手册,但仅供客户使用。没那么有趣。
    【解决方案2】:

    我成功地解除了语法错误,我想简要写下我是如何做到的:

    1.) 编写一个扩展 CPreprocessor 并覆盖 handleProblem 的类。就我而言,我的关键字是“@func”,但它被标记为“@”和“func”。 '@' 被放入在handleProblem 中处理的问题列表中。

    import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor;
    ...
    public class GRASPPreprocessor extends CPreprocessor {
        public GRASPPreprocessor(FileContent fileContent, IScannerInfo info, ParserLanguage language, IParserLogService log,
            IScannerExtensionConfiguration configuration, IncludeFileContentProvider readerFactory) {
            super(fileContent, info, language, log, configuration, 
        }
    
        @Override
        public void handleProblem(int id, char[] arg, int offset, int endOffset) {
            if (new String(arg).equals("@")) {
                this.problem = new ProblemStorage(id, arg, offset, endOffset);
            } else {
                super.handleProblem(id, arg, offset, endOffset);
            }
        }
    }
    

    我创建了一个简短的 Storage 类来存储参数。但只调用超类的handleProblem 方法,如果“@”后面没有“func”。这是在nextToken 中完成的:

    @Override
    public IToken nextToken() throws EndOfFileException {
    
        IToken token = super.nextToken();
        if(problem != null && token.getType() == IToken.tIDENTIFIER) {
            if (new String(token.getCharImage()).equals("func")) {
                problem = null;
                return super.nextToken();
            } else {
                super.handleProblem(problem.id, problem.arg, problem.offset, problem.endOffset);
                return token;
            }
        }
        return token;
    }
    

    这基本上忽略了“@func”。杂散的“@”仍会被标记为问题。

    2.) 定义您自己的语言类,扩展 GPLanguage 并覆盖 createScanner

    protected IScanner createScanner(FileContent content, IScannerInfo scanInfo, IncludeFileContentProvider fcp,
            IParserLogService log) {
        return new GRASPPreprocessor(content, scanInfo, getParserLanguage(), log,
                getScannerExtensionConfiguration(scanInfo), fcp);
    }
    

    3.) 使用扩展点 org.eclipse.cdt.core.language 向 plugin.xml 添加扩展,并告诉插件该语言必须使用哪种内容类型:

     <extension
         point="org.eclipse.core.contenttype.contentTypes">
      <content-type
            file-extensions="grasp"
            id="de.blub.contenttype.grasp"
            name="GRASP"
            priority="high">
      </content-type>
    </extension>
    <extension
         point="org.eclipse.cdt.core.language">
      <language
            class="de.blub.language.GRASPLanguage"
            id="de.blub.language.grasp"
            name="Great Alternative Stupid Language">
         <contentType
               id="de.blub.contenttype.grasp">
         </contentType>
      </language>
    

    4.) 我不知道内容类型绑定有什么问题,但它不起作用。我向社区here 询问了此事。但是,您可以通过 Window->Preferences->General->Content Types 定义添加自己的关联。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多