Деактивировать все Codan Checkers программно - PullRequest
1 голос
/ 24 сентября 2019

Как я могу деактивировать все Codan Checkers для моего типа контента или внутри моего редактора программно?

Я знаю, что могу отключить Checkers в Window -> Preferences -> C/C++ -> Code Analysis.Но мне нужно сделать это программно.

Один из способов добиться этого - изменить методы runInEditor() и processResource() в org.eclipse.cdt.codan.internal.core.CodanRunner.

public static void runInEditor(Object model, IResource resource, IProgressMonitor monitor) {
    if (resource != null && !resource.toString().endsWith("blub)) {
        processResource(resource, model, CheckerLaunchMode.RUN_AS_YOU_TYPE, monitor);
    }
}

public static void processResource(IResource resource, CheckerLaunchMode checkerLaunchMode, IProgressMonitor monitor) {
    if (resource != null && !resource.toString().endsWith("blub")) {
        processResource(resource, null, checkerLaunchMode, monitor);
    }
}

Для Unresolved Inclusionпредупреждение Я могу перезаписать CPreprocessor и вернуть ничего не делать в переопределенном методе handleProblem().

Есть ли способ подавить Шашки Codan без изменения кода CDT?

1 Ответ

1 голос
/ 25 сентября 2019

Вы должны быть в состоянии сделать это, используя точку расширения org.eclipse.cdt.codan.core.checkerEnablement.

Я не могу найти сгенерированную документацию для него, но вы можете увидеть схему для нее здесь .

Точка расширения позволяет вам указать класс, унаследованный от org.eclipse.cdt.codan.internal.core.ICheckerEnablementVerifier, и предоставить метод boolean isCheckerEnabled(IChecker, IResource, CheckerLaunchMode), который определяет, может ли данная программа проверки работать с данным ресурсом в данном режиме запуска.Если какой-либо верификатор включения возвращает false, средство проверки не запускается.

Зарегистрируйте собственную реализацию ICheckerEnablementVerifier в вашем плагине plugin.xml:

<extension
    point="org.eclipse.cdt.codan.core.checkerEnablement">
  <verifier class="path.to.MyCheckerEnablementVerifier" />
</extension>

Следующая реализация проверяет тип содержимого:

public class MyCheckerEnablementVerifier implements ICheckerEnablementVerifier {

    @Override
    public boolean isCheckerEnabled(IChecker checker, IResource resource, CheckerLaunchMode mode) {
        IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
        IContentType contentType = contentTypeManager.findContentTypeFor(resource.getLocation().toOSString());
        if (contentType.getId().equals("contenttypeid")) {
            return false;
        } else {
            return true;
        }
    }
}
...