Отключить метки синтаксической ошибки для пользовательских ключевых слов в CDT - PullRequest
1 голос
/ 16 апреля 2019

Разработка с CDT может расстраивать, потому что никто не отвечает на ваши вопросы и почти нет документации. При этом, позвольте мне попробовать это с простым:

В моем плагине eclipse пользователь хочет редактировать файлы на языке, похожем на C ++. Чтобы выделить дополнительные ключевые слова, я создал класс, который расширяет GPPScannerExtensionConfiguration следующим образом:

public class GRASPScannerExtensionConfiguration extends GPPScannerExtensionConfiguration {

    private static GRASPScannerExtensionConfiguration instance;

    public static synchronized GRASPScannerExtensionConfiguration getInstance() {
        if (instance == null)
            instance = new GRASPScannerExtensionConfiguration(version(8, 0));
        return instance;
    }

    public GRASPScannerExtensionConfiguration(int version) {
        super(version);

        /*
         * add GRASP specific configuration
         */
        addKeyword("@func".toCharArray(), IToken.t_void);
        addKeyword("@tag".toCharArray(), IToken.t_void);
    }
}

В этом классе мои ключевые слова @func или @tag выделены как void в C ++. Но редактор подчеркивает эти ключевые слова и говорит: «Синтаксическая ошибка».

Я знаю, что могу деактивировать синтаксическую ошибку в Window -> Preferences -> General -> Editors -> Text Editors -> Annotations, но это: 1.) деактивирует все синтаксические ошибки и 2.) потребует, чтобы пользователи сделали эту настройку вручную.

Как отключить маркировку синтаксической ошибки только для моих собственных дополнительных ключевых слов?

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Как отключить маркировку синтаксической ошибки только для моих собственных дополнительных ключевых слов?

Короткий ответ: вы не можете.

Парсер неесть способ различать «синтаксическую ошибку, вызванную вашим дополнительным ключевым словом» и «синтаксическую ошибку, вызванную чем-то другим», не обучаясь такому способу.У него также нет способа восстановить синтаксический анализ после включения такого ключевого слова, так что последующие части объявления (или выражения или любого контекста, в котором появляется ключевое слово) анализируются правильно, опять же, без обучения.

Чтобы научить синтаксический анализатор этим вещам, вам придется модифицировать / расширить его по-новому.Мне неизвестны текущие точки расширения, которые позволили бы вам сделать это, поэтому вам придется раскошелиться на плагин, предоставляющий синтаксический анализатор, или новые новые точки расширения к нему.

0 голосов
/ 18 апреля 2019

Мне удалось деактивировать синтаксические ошибки, и я хочу кратко записать, как я это сделал:

1.) Написать класс, который расширяет CPreprocessor и переопределяет handleProblem.В моем случае моим ключевым словом является «@func», но оно обозначено как «@» и «func».'@' Помещается в список проблем, который обрабатывается в handleProblem.

import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor;
...
public class GRASPPreprocessor extends CPreprocessor {
    public GRASPPreprocessor(FileContent fileContent, IScannerInfo info, ParserLanguage language, IParserLogService log,
        IScannerExtensionConfiguration configuration, IncludeFileContentProvider readerFactory) {
        super(fileContent, info, language, log, configuration, 
    }

    @Override
    public void handleProblem(int id, char[] arg, int offset, int endOffset) {
        if (new String(arg).equals("@")) {
            this.problem = new ProblemStorage(id, arg, offset, endOffset);
        } else {
            super.handleProblem(id, arg, offset, endOffset);
        }
    }
}

Я создал короткий класс Storage для хранения аргументов.Но вызывайте метод handleProblem суперкласса только в том случае, если за «@» не следует «func».Это делается в nextToken:

@Override
public IToken nextToken() throws EndOfFileException {

    IToken token = super.nextToken();
    if(problem != null && token.getType() == IToken.tIDENTIFIER) {
        if (new String(token.getCharImage()).equals("func")) {
            problem = null;
            return super.nextToken();
        } else {
            super.handleProblem(problem.id, problem.arg, problem.offset, problem.endOffset);
            return token;
        }
    }
    return token;
}

Это в основном игнорирует "@func".Блуждающая буква '@' все равно будет помечена как проблема.

2.) Определите свой собственный языковой класс, расширяя GPPLanguage и переопределяя createScanner:

protected IScanner createScanner(FileContent content, IScannerInfo scanInfo, IncludeFileContentProvider fcp,
        IParserLogService log) {
    return new GRASPPreprocessor(content, scanInfo, getParserLanguage(), log,
            getScannerExtensionConfiguration(scanInfo), fcp);
}

3.) Добавьте расширениек plugin.xml с точкой расширения org.eclipse.cdt.core.language, а также сообщить плагину, какой тип контента должен использоваться для этого языка:

 <extension
     point="org.eclipse.core.contenttype.contentTypes">
  <content-type
        file-extensions="grasp"
        id="de.blub.contenttype.grasp"
        name="GRASP"
        priority="high">
  </content-type>
</extension>
<extension
     point="org.eclipse.cdt.core.language">
  <language
        class="de.blub.language.GRASPLanguage"
        id="de.blub.language.grasp"
        name="Great Alternative Stupid Language">
     <contentType
           id="de.blub.contenttype.grasp">
     </contentType>
  </language>

4.) Я незнать, что не так с привязкой типа контента, но она не работает.Я спросил сообщество здесь об этом.Тем не менее, вы можете определить добавить свою собственную ассоциацию через Window-> Preferences-> General-> Content Types .

...