Используйте собственный CodeFormatter в плагине Eclipse с CDT - PullRequest
1 голос
/ 08 июля 2019

Я пытаюсь использовать точку расширения org.eclipse.cdt.core.CodeFormatter, но, похоже, это не дает никакого эффекта. К сожалению, я не могу найти ни одного примера. Описание точки расширения не является исчерпывающим.

Мой plugin.xml выглядит так:

<extension
     point="org.eclipse.cdt.core.CodeFormatter">
  <codeFormatter
        class="de.verified.rtt.ide.editors.rts.RTTLCodeFormatter"
        id="de.verified.rtt.ide.editors.rts.codeformatter"
        name="RTTL Code Formatter">
  </codeFormatter>

Это расширение находится на верхнем уровне. Может быть, это связано с языком, ассоциацией файлов, перспективой или чем-то еще?

Подробное описание проблемы:

В моем плагине я использую язык, который расширяет C ++ некоторыми ключевыми словами и понятиями. Для разбора этого файла я пишу свой собственный анализатор исходного кода, который расширяет GNUCPPParser. На данный момент мой парсер создает стандартные IASTDeclarations для токенов, неизвестных CDT. Например, для "@rttConcept {...}" мой синтаксический анализатор использует "ICPPASTNamespaceDefinition", потому что @rttConcept в некоторой степени похож на определение пространства имен. Теперь использование «@rttConcept» больше не создает подсветки синтаксических ошибок в редакторе. При попытке отформатировать этот код с использованием CodeFormatter выдается исключение

org.eclipse.cdt.internal.formatter.AbortFormatting: [1/1] Неожиданный тип токена, ожидаемый: 91, фактический: Тип токена = 1006 image = @ offset = 0 в org.eclipse.cdt.internal.formatter.Scribe.printNextToken (Scribe.java:1653)

Существует проверка, действительно ли NamespaceDefinition соответствует токену "пространство имен" в коде, которого он не делает. Я только хочу использовать свой собственный CodeFormatter, чтобы перехватить исключение AbortFormatting:

@SuppressWarnings("restriction")
public class MyCodeFormatter extends CCodeFormatter {

    public static final String ID = "de.blub.rtt.ide.editors.rts.codeformatter";

    @Override
    public TextEdit[] format(int kind, String source, IRegion[] regions, String lineSeparator) {
        try {
            return super.format(kind, source, regions, lineSeparator);            
        } catch(AbortFormatting ex) {
            return null;
        }
    }
}

1 Ответ

2 голосов
/ 09 июля 2019

Объявление вашего форматера в plugin.xml просто делает его доступным как .

Если вы хотите использовать его как текущий , вам необходимовыберите его в пользовательском интерфейсе настроек («Установки» -> «C / C ++» -> «Стиль кода» -> «Форматтер»; должен быть раскрывающийся список с именем вашего редактора в качестве одного из параметров).

(вышеуказанный выбор влияетвсего рабочего пространства. Вы также можете выбрать форматтер для каждого проекта в Свойства проекта -> C / C ++ General -> Formatter.)

При этом обратите внимание на предостережение в greywolf82 Комментарий.


ОБНОВЛЕНИЕ : Чтобы ответить на ваш комментарий, да, я считаю, что текущий форматер может быть изменен программно с помощью открытого API CDT.Я ожидаю, что что-то вроде следующего будет работать:

HashMap<String, String> options = CCorePlugin.getOptions();
options.put(CCorePreferenceConstants.CODE_FORMATTER,
            "de.verified.rtt.ide.editors.rts.codeformatter");
CCorePlugin.setOptions(options);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...