Java EclipseCDT扩展以构建附加语言
我想扩展GNUC的CDT语言插件,在此基础上创建某种新的语言 新语言应该在编辑器中具有不同的视觉外观。如果前面有一个特殊的预处理器指令(如注释),我想将方法体涂成灰色 有人知道在哪里扩展GCC语言来进行这样的修改吗Java EclipseCDT扩展以构建附加语言,java,eclipse,eclipse-cdt,Java,Eclipse,Eclipse Cdt,我想扩展GNUC的CDT语言插件,在此基础上创建某种新的语言 新语言应该在编辑器中具有不同的视觉外观。如果前面有一个特殊的预处理器指令(如注释),我想将方法体涂成灰色 有人知道在哪里扩展GCC语言来进行这样的修改吗 编辑1: 作为示例,我希望specialFunction的方法体的颜色为灰色,作为示例注释->#注释的原因 #annotation int specialFunction(){ return 1; } 编辑2: 到目前为止,我一直在尝试构建一种“扩展语言”。计划是突
编辑1: 作为示例,我希望specialFunction的方法体的颜色为灰色,作为示例注释->#注释的原因
#annotation
int specialFunction(){
return 1;
}
编辑2: 到目前为止,我一直在尝试构建一种“扩展语言”。计划是突出显示一个预处理器位置,并保存该位置,以便下面的方法将被着色。我设法使预处理器关键字着色,但不知道如何处理方法体的颜色
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;
}
在上面的示例中,“隐藏”将突出显示
编辑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>
一旦实现,用户可以通过首选项页面C/C++
-编辑器-语法着色:
您应该能够使用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有一个非常丰富的ASTAPI,所以它绝对是可行的。如果您有具体问题,请随时提问。这是一个非常广泛的问题,目前我无法提供完整的答案。看看CDT本身如何使用该扩展点来定义GCC语言变体或其他类似语言(如Qt)。@JonahGraham进一步说明了问题“这不是我想要实现的,因为我希望在以后的操作中保留对高亮显示对象的引用。”--这在任何方面听起来都不正确,通常在CDT中的所有API中都不允许保留对AST节点的引用。您的示例是否应该突出显示从方法MySpecialFunction调用的方法体?我无法让它运行。进一步编辑了我的问题。什么是你设法跑的,而不是跑的。该示例应该突出显示对名为MySpecialFunction的函数的调用,因为我正在检查该节点,以查看它是否是对此类函数的引用。显然,你的情况会有所不同。请发布您实际尝试过的内容,我(希望其他人)将能够提供帮助。我不知道调用会突出显示,我认为方法体会突出显示。再次编辑我的帖子。成功运行了示例。很高兴您运行了示例。不幸的是,你更新的帖子只进一步解释了你的问题,但没有说明你还做了哪些尝试,例如,你是否在consumes()中加入了bp来观察CDT允许你(平凡地)做语义突出显示的事情?我仔细看了一下,我不认为这种(平凡的)方式会是我的方式,正如你在edit3中看到的我的想法。但也许我错了,身体突出的方法只是一步之遥?