2015-10-29 65 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,所以它絕對可行。如果您有這些問題,請隨時提出具體問題。