Тогда возникает вопрос, каковы здесь правила игры и где они определены?
Фактическое регулярное выражение можно найти здесь: https://github.com/eclipse/eclipse.jdt.debug/blob/e7932c6319b3a96526134940ca57de0576e9607a/org.eclipse.jdt.debug.ui/plugin.xml#L3371
Это сводится к чему-то вроде
\(\w*\.java:\S*\)
, то есть сопоставляется только часть в скобках.Затем консоль делегирует совпадение org.eclipse.jdt.debug.ui.JavaConsoleTracker
, что является реализацией для IPatternMatchListenerDelegate
.Это создает соответствующий IHyperlink
( JavaStackTraceHyperlink ).Только при нажатии на ссылку фактический синтаксический анализ выполняется, вся строка снова читается, чтобы получить полное имя пакета и т. Д., Который затем ищется в рабочей области.
На случай, если кто-то, как я, нуждаетсячтобы реализовать это поведение за пределами консоли (например, с StyledText
):
Сопоставить ссылки с некоторым регулярным выражением, добавьте соответствующее StyleRange
(ср. SWT.UNDERLINE_LINK
) со свойством data, установленным для данных ссылки.При нажатии найдите фактический файл в рабочей области по пакету / классу с помощью:
SearchEngine search = new SearchEngine();
NullProgressMonitor monitor = new NullProgressMonitor();
TypeNameMatchRequestor collector = result -> {
IPath path = result.getType().getPath();
//handle result, e.g. open editor
};
search.searchAllTypeNames(fullPackageName, SearchPattern.R_EXACT_MATCH, className, IJavaSearchConstants.TYPE, IJavaSearchConstants.TYPE, SearchEngine.createWorkspaceScope(), collector, IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, monitor);