Добавить ключевые слова, которые состоят из двух слов в CDT - PullRequest
1 голос
/ 09 июля 2019

Для создания пользовательских ключевых слов я делаю следующее:

  • Определите язык в plugin.xml и расширьте класс GPPLanguage.
  • расширить CLanguageKeywords и переопределить getKeywords, чтобы вернуть super.getKeywords плюс пользовательские ключевые слова:

    public class MyLanguageKeywords extends CLanguageKeywords {
        public MyLanguageKeywords(ParserLanguage language, IScannerExtensionConfiguration config) {
            super(language, config);
        }
    
        @Override
        public String[] getKeywords() {
        String[] cppKeywords = super.getKeywords();
            String[] myKeywords = new String[] {
                "input",
                "output",
                "input port",
                "output port",
            };
            return (String[]) ArrayUtils.addAll(cppKeywords, myKeywords);
        }
    }
    
  • реализовать метод getAdapter () для возврата экземпляра MyLanguageKeywords

Это работает для «input» и «output», но не для «input port» или «output port». Как можно выделить ключевые слова для «порта», но только в комбинациях «входной порт» или «выходной порт»?

1 Ответ

1 голос
/ 10 июля 2019

Я могу придумать два варианта:

  1. Изменить лексер CDT для поддержки ключевых слов, содержащих пробелы. Я не думаю, что это то, что вы можете сделать с помощью общедоступного API, вам придется изменить основные классы CDT, например org.eclipse.cdt.internal.core.parser.scanner.Lexer. (В качестве альтернативы вы можете рассмотреть возможность добавления патча для добавления такой поддержки в лексер.)

  2. Используйте семантическое выделение , чтобы выделить ключевые слова, содержащие пробелы. Существует точка расширения org.eclipse.cdt.ui.semanticHighlighting, позволяющая плагинам обеспечивать пользовательскую семантическую подсветку.

Разница в восприятии пользователя будет заключаться в том, что лексическое выделение применяется сразу после каждого нажатия клавиши, а семантическое выделение применяется после небольшой задержки после остановки ввода (поскольку вычисление обходится дороже). Этот эффект можно увидеть, если сравнить, как ключевые слова override и final в настоящее время подсвечиваются в C ++, по сравнению с другими ключевыми словами: override и final используют семантическое выделение, поскольку они являются контекстно-зависимыми ключевыми словами.

Я должен также упомянуть, что работает ли второй подход, зависит от того, как ваши новые ключевые слова вписываются в грамматику. Их необходимо проанализировать как IASTName, чтобы применить к ним семантическое выделение.

...