Я хочу сообщить о проблемах для файлов 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 для единицы компиляции. Я не уверен, как связать свои пользовательские маркеры с АСТ компиляционной единицы.