Eclipse Console - каковы правила, которые делают трассировки стека кликабельными? - PullRequest
11 голосов
/ 08 марта 2011

Я регистрирую довольно много вещей и заметил, что Eclipse Console делает трассировки стека Java кликабельными. Исключение подсвечивается (идет в диалоговом окне «Создать точку останова»), а также выделяются имя файла + цифры (позволяет перейти прямо к этой строке).

Мне было интересно, смогу ли я отформатировать свои обычные строки журнала, чтобы консоль Eclipse сделала с ними то же самое. Возможный подход мог бы сделать их похожими на линии трассировки стека, но чтобы сохранить как можно больше информации, я хотел бы знать точное правило, которое Eclipse использует для обнаружения этих линий, но Eclipse 3.6.2 довольно большой, поэтому геркулесова задача.

Тогда возникает вопрос: Какие здесь правила игры, и , где они определены?


Редактировать: Фрагмент макета шаблона обратного входа - %msg \(%file:%line\)%n

Ответы [ 4 ]

9 голосов
/ 08 марта 2011

Этот фрагмент может помочь.Он может быть размещен в любом месте вашего кода и напечатает «кликабельную» строку на консоли затмения:

StackTraceElement s = Thread.currentThread().getStackTrace()[1];
System.out.printf("%s.%s(%s:%s)%n", s.getClassName(), s.getMethodName(),
            s.getFileName(), s.getLineNumber());

Обновление:

На этот вопрос есть ответ,которые могут включать решение вашей проблемы:

Консоль Eclipse: обнаружение шаблонов предупреждений и ошибок и обеспечение их кликабельности


Вот и мы: мы должны внести свой вкладреализация org.eclipse.ui.console.IPatternMatchListenerDelegate через точку расширения org.eclipse.ui.console.consolePatternMatchListeners.

Вклады, предоставляющие гиперссылки для исключений и номеров строк в трассировке стека, определены в плагине org.eclipse.jdt.debug.ui, реализующие классы находятся в одном пакете.

Правила являются регулярными выражениями и могут быть найдены в plugin.xml соответствующего подключаемого модуля.

3 голосов
/ 08 марта 2011

Если вы напечатаете (filename:lineNumber), Eclipse преобразует его в ссылку.

Пример:

System.out.println("message (Hello.java:2)");

Я не знаю, есть ли другие правила или где они определены.

1 голос
/ 27 июля 2018

Тогда возникает вопрос, каковы здесь правила игры и где они определены?

Фактическое регулярное выражение можно найти здесь: 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);
0 голосов
/ 18 февраля 2016
fullyQualifiedClassName.methodName(fileName:lineNumber)

Без fullyQualifiedClassName Eclipse может выбрать не тот файл.methodName требуется для сопоставления, но не используется - это может быть что угодно.

...