2015-10-29 2 views
1

Я хотел бы расширить плагин языка CDT для gnu c, чтобы создать на нем новый язык.Eclipse CDT расширяется для создания дополнительного языка

Новый язык должен иметь визуальное оформление в редакторе. Я хотел бы покрасить тело метода в серый цвет, если перед ним есть специальная предпроцессорная директива (например, аннотация).

Кто-нибудь знает, где расширить язык GCC для такой модификации?



EDIT1:

В качестве примера я хочу, чтобы цвет тела метода specialFunction быть серым, как причина примера аннотации ->#annotation

#annotation 
int specialFunction(){ 
    return 1; 
} 


EDIT2:

То, что я пробовал до сих пор, заключается в создании «расширенного языка». План состоял в том, чтобы выделить позицию препроцессора, а также сохранить позицию, чтобы следующий метод был окрашен. Мне удалось получить ключевое слово препроцессора, но не как работать с цветом тела метода.

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

«Не то, чего я хочу достичь, потому что я хотел бы сохранить ссылку на выделенный объект для последующих операций». - это не звучит правильно в любых отношениях, вы, как правило, во всех API-интерфейсах в CDT не допускаете ссылок на узлы 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

You должен иметь возможность использовать 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, так что это определенно выполнимо. Не стесняйтесь задавать конкретные вопросы, если они у вас есть.