Я хочу сообщить о проблемах для файлов Java в представлении проблем Eclipse и предоставить им быстрые исправления.
Стандартный способ сделать это - использовать точку расширения org.eclipse.core.resources.markers, чтобы объявить пользовательский маркер и добавить маркеры, вызвав org.eclipse.core.resources.IResource.createMarker(String). Затем можно использовать точку расширения org.eclipse.ui.ide.markerResolution, чтобы обеспечить быстрое исправление для пользовательских маркеров.
Этот подход является независимым от языка методом создания и разрешения маркеров ресурсов. Недостатком является то, что я должен написать код шаблона для решения моих собственных проблем Java. Вместо этого я хотел бы повторно использовать IQuickFixProcessor. То есть, я хотел бы разрешить мои собственные маркеры Java, используя точку расширения org.eclipse.jdt.ui.quickFixProcessors. Используя эту точку расширения, мне больше не нужно разбирать файл Java, в котором найден маркер, мне не нужно создавать привязки и находить AST node, охватывающий маркер. Если я не буду повторно использовать org.eclipse.jdt.internal.ui.text.correction.CorrectionMarkerResolutionGenerator и его зависимости, я в конечном итоге дублирую большую часть.
Как я могу предоставить Quick Fixes для своих пользовательских маркеров Java с использованием инфраструктуры JDT?
Попытка 1:
Я определил свой пользовательский маркер следующим образом:
<extension
id="custom.marker"
name="Custom Java Problem"
point="org.eclipse.core.resources.markers">
<super type="org.eclipse.jdt.core.problem"/>
<super type="org.eclipse.core.resources.problemmarker"/>
<super type="org.eclipse.core.resources.textmarker"/>
<persistent value="true"/>
</extension>
Затем я добавил экземпляры вышеуказанного маркера, вызвав метод IResource.createMarker("custom.marker").
Затем я определил пользовательский Quick Fix-процессор.
<extension
point="org.eclipse.jdt.ui.quickFixProcessors">
<quickFixProcessor
class="quickfixes.CustomQuickFixProcessor"
id="quickfixes.quickFixProcessor">
</quickFixProcessor>
</extension>
Мои настраиваемые маркеры отображаются в представлении "Проблемы" для Eclipse, но когда я нажимаю правой кнопкой мыши на пользовательскую проблему, элемент меню "Быстрое исправление" отключается.
Попытка 2:
Я повторил IMarker marker = resource.createMarker("custom.marker"); на IMarker marker = resource.createMarker(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER);. В результате этого изменения, когда я нажимаю правой кнопкой мыши на пользовательскую проблему в представлении проблем, элемент меню быстрого исправления становится доступным, но когда я его выбираю, появляется диалоговое окно, в котором говорится, что исправления не доступны для выбранного проблема. Тем не менее, я подтвердил, что CustomQuickFixProcessor.hasCorrections(ICompilationUnit, int) вызывается и возвращает true, но CustomQuickFixProcessor.getCorrections(IInvocationContext, IProblemLocation[]) не вызывается.
Попытка 3:
Попытка 3 является продолжением попытки 2. Я устанавливаю IJavaModelMarker.ID настраиваемого маркера следующим образом:
marker.setAttribute(IJavaModelMarker.ID, IProblem.ExternalProblemFixable);
Следовательно, CustomQuickFixProcessor.getCorrections вызывается, когда я наводил курсор на мой пользовательский маркер в редакторе или нажимал на light-build на левом поле редактора Java. Однако, когда я выбираю маркер в представлении проблем, щелкните правой кнопкой мыши маркер и выберите пункт меню быстрого исправления, CustomQuickFixProcessor.getCorrections не будет вызван и появится диалоговое окно, в котором говорится, что нет быстрых исправлений.
Я запускал JDT в режиме отладки, чтобы узнать, почему он не вызывает CustomQuickFixProcessor.getCorrections, когда я вызываю Quick Fix из представления проблем. Оказалось, что CorrectionMarkerResolutionGenerator.internalGetResolutions(IMarker) не находит разрешений, потому что CorrectionMarkerResolutionGenerator.hasProblem (context.getASTRoot().getProblems(), location) не находит пользовательскую проблему в AST для единицы компиляции. Я не уверен, как связать свои пользовательские маркеры с АСТ компиляционной единицы.