2015-10-29 67 views
1

我想扩展gnu c的CDT语言插件,在此基础上创建某种新语言。Eclipse CDT扩展构建附加语言

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

有没有人知道在哪里扩展GCC语言来进行这种修改?



EDIT1:

如实例我想要specialFunction的方法体的颜色是灰色的,作为原因的示例注释的 - >#annotation

#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; 
} 

在上述 “隐藏” 的例子将被突出显示。



EDIT3:

我试图执行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也是一个选项,在那里我不能着色仪器,我可以隐藏它。

+0

这是一个很广泛的问题,按照目前的要求,所以我不能提供一个完整的答案。看一看虽然在http://help.eclipse.org/mars/topic/org.eclipse.cdt.doc.isv/reference/extension-points/org_eclipse_cdt_core_language.html?cp=14_1_1_7和扩展点是如何在使用CDT自己定义GCC语言变体或其他类似的语言,如Qt。 –

+0

@JonahGraham进一步指定了这个问题 –

+0

“这不是我想要实现的目标,因为我想继续参考高亮显示的对象以供日后操作。” - 在任何方面听起来都不对,您通常在CDT的所有API中都不允许保留对AST节点的引用。 –

回答

2

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

CDT有一个很好的扩展点叫做org.eclipse.cdt.ui.semanticHighlighting,它允许你定义自定义的语义高亮规则。

这里是一个插件的例子。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。分析令牌以查看它是否与荧光笔相关,并返回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

highlighting preference page

+0

您的示例应该突出显示从方法MySpecialFunction调用的方法体?我无法让它运行。进一步编辑我的问题。 –

+0

你有什么设法运行,没有运行。该示例应该突出显示对称为MySpecialFunction的函数的调用,因为我正在检查节点以查看它是否是对此类函数的引用。显然你的情况会有所不同。请张贴你实际尝试过的内容,我(和其他人希望)能够提供帮助。 –

+0

我不知道一个电话会突出显示,认为方法的身体会。再次编辑我的帖子。管理让你的例子运行。 –

1

你应该可以使用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,所以它绝对可行。如果您有这些问题,请随时提出具体问题。