Я пытаюсь использовать точку расширения 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;
}
}
}