Eclipse CDT 扩展以构建附加语言

Eclipse CDT extend to build an additional language

我想扩展 gnu c 的 CDT 语言插件,以此为基础创建某种新语言。

新语言在编辑器中应该有不同的视觉外观。如果前面有一个特殊的预处理器指令(如注释),我想将方法​​体涂成灰色。

有人知道在哪里可以扩展 GCC 语言来进行这样的修改吗?



编辑 1:

例如,我希望 specialFunction 的方法体颜色为灰色,作为示例注释的原因 -> #annotation

#annotation
int specialFunction(){
    return 1;
}


编辑 2:

到目前为止我尝试的是构建一个 "extended language"。计划是突出显示预处理器位置并保存该位置,以便为下面的方法着色。我设法让预处理器关键字着色,但不知道如何处理方法体颜色。

public class OwnKeyWords extends GCCLanguage implements ICLanguageKeywords

@Override
public String[] getPreprocessorKeywords() {
    //System.out.println("Called keywords" + timesPre++);
    return new String[]{
            "hide",
            "show"
    };
}

着色示例:

#hide
int specialFunction(){
    return 1;
}

在上面的示例中 "hide" 将被突出显示。



编辑 3:

我尝试实现 ISemanticHighlighter 并尝试了几种方法来突出显示我的代码:

CVariable
CFunction
ObjectStyleMacro
...

但它们中没有一个适合用预处理器指令或顶部的任何其他内容突出显示方法体。

还有ISemanticHighlighter中的注释:

 * NOTE: Implementors are not allowed to keep a reference on the token or on any object retrieved from the
 * token.

不是我想要达到的效果,因为我想保留高亮对象的引用,方便后面的操作。

也许 org.eclipse.cdt.ui.text.folding.DefaultCFoldingStructureProvider 也是一个选项,在那里我无法为乐器着色,我可以隐藏它。

这听起来不像是语义突出显示的新语言。

CDT 有一个很棒的扩展点 org.eclipse.cdt.ui.semanticHighlighting 允许您定义自定义语义突出显示规则。

这是 plugin.xml 条目的示例:

   <extension
         point="org.eclipse.cdt.ui.semanticHighlighting">
      <semanticHighlighting
            class="com.example.SemanticHighlighter"
            defaultBold="true"
            defaultEnabled="true"
            defaultTextColor="35,0,35"
            displayName="Example Semantic Highlighter"
            id="com.example.SemanticHighlighter"
            preferenceKey="com.example.SemanticHighlighter.pref"
            priority="5">
      </semanticHighlighting>
   </extension>

然后在您的 com.example.SemanticHighlighter 中实现 org.eclipse.cdt.ui.text.ISemanticHighlighter 接口。只有一种方法 consumes 需要 ISemanticToken。分析令牌以查看它是否与您的荧光笔相关,return true 以使其突出显示。

下面是该方法的简单实现:

@Override
public boolean consumes(ISemanticToken token) {
    IBinding binding = token.getBinding();
    if (binding instanceof IFunction) {
        IASTNode node = token.getNode();
        if (binding != null && node instanceof IASTName && ((IASTName) node).isReference()) {
            String n = binding.getName();
            if ("MySpecialFunction".equals(n)) {
                return true;
            }
        }
    }
    return false;
}

实施后,用户可以通过偏好页面修改颜色和适用性C/C++ - Editor - Syntax Coloring:

您应该能够使用 ISemanticHighlighter 进行您想要的那种突出显示。

对于使用特定注释为函数主体着色的示例,它可以像这样工作:

class MyHighlighter implements ISemanticHighlighter {
    @Override
    public boolean consumes(ISemanticToken token) {
        IASTNode node = token.getNode();

        // Walk up the AST to determine if 'node' is inside a function body.
        // If it's not, return false.

        // Navigate the AST some more to examine what comes before the
        // function's declaration. If it's the annotation in question,
        // return true. Otherwise, return false.
    }
}

我省略了如何导航 AST 的细节,但是 CDT 有一个非常丰富的 AST API 所以它绝对可行。如果您有具体问题,请随时提出。