This is an automated email from the ASF dual-hosted git repository.
mbien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new 5fc30b25d4 Stacktrace analyzer window fixes
new 5e3d77990f Merge pull request #6841 from
mbien/stacktrace-analyzer-fixes
5fc30b25d4 is described below
commit 5fc30b25d4dcd6310501729e16b40072de4430de
Author: Michael Bien <[email protected]>
AuthorDate: Thu Dec 14 08:27:41 2023 +0100
Stacktrace analyzer window fixes
- update matcher to be more forgiving when traces are pasted from ANSI
decorated sources (some loggers use colors for exception elements)
- some loggers add extra spaces to stack trace lines
- properly escape angle brackets in cell renderer
- some indentation fixes for lines which are rendered without link
(e.g native code calls)
- avoid using deprecated methods
---
java/java.navigation/manifest.mf | 2 +-
.../java/navigation/BreadCrumbsScanningTask.java | 1 -
.../java/navigation/ElementScanningTask.java | 1 -
.../modules/java/navigation/HTMLDocView.java | 2 +-
.../java/stackanalyzer/AnalyserCellRenderer.java | 28 +++--
.../java/stackanalyzer/AnalyzeStackAction.java | 1 +
.../stackanalyzer/AnalyzeStackTopComponent.java | 3 +-
.../java/stackanalyzer/StackLineAnalyser.java | 123 ++++++++++-----------
.../java/stackanalyzer/StackLineAnalyserTest.java | 30 ++++-
9 files changed, 106 insertions(+), 85 deletions(-)
diff --git a/java/java.navigation/manifest.mf b/java/java.navigation/manifest.mf
index 5676d2f62b..e2849f4135 100644
--- a/java/java.navigation/manifest.mf
+++ b/java/java.navigation/manifest.mf
@@ -5,4 +5,4 @@ OpenIDE-Module-Localizing-Bundle:
org/netbeans/modules/java/navigation/Bundle.pr
OpenIDE-Module-Requires: org.openide.windows.WindowManager
OpenIDE-Module-Specification-Version: 1.63
AutoUpdate-Show-In-Client: false
-
+OpenIDE-Module-Java-Dependencies: Java > 11
diff --git
a/java/java.navigation/src/org/netbeans/modules/java/navigation/BreadCrumbsScanningTask.java
b/java/java.navigation/src/org/netbeans/modules/java/navigation/BreadCrumbsScanningTask.java
index 424e72ff09..82824d2c88 100644
---
a/java/java.navigation/src/org/netbeans/modules/java/navigation/BreadCrumbsScanningTask.java
+++
b/java/java.navigation/src/org/netbeans/modules/java/navigation/BreadCrumbsScanningTask.java
@@ -40,7 +40,6 @@ import org.netbeans.modules.parsing.spi.SchedulerEvent;
import org.netbeans.modules.parsing.spi.SchedulerTask;
import org.netbeans.modules.parsing.spi.TaskFactory;
import org.netbeans.modules.parsing.spi.TaskIndexingMode;
-import org.openide.nodes.Node;
/**
*
diff --git
a/java/java.navigation/src/org/netbeans/modules/java/navigation/ElementScanningTask.java
b/java/java.navigation/src/org/netbeans/modules/java/navigation/ElementScanningTask.java
index ab864a47d7..63ddcb6b4b 100644
---
a/java/java.navigation/src/org/netbeans/modules/java/navigation/ElementScanningTask.java
+++
b/java/java.navigation/src/org/netbeans/modules/java/navigation/ElementScanningTask.java
@@ -52,7 +52,6 @@ import javax.lang.model.element.VariableElement;
import javax.lang.model.type.ArrayType;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
-import javax.lang.model.util.Elements;
import javax.lang.model.util.Elements.Origin;
import org.netbeans.api.annotations.common.CheckForNull;
import org.netbeans.api.annotations.common.NonNull;
diff --git
a/java/java.navigation/src/org/netbeans/modules/java/navigation/HTMLDocView.java
b/java/java.navigation/src/org/netbeans/modules/java/navigation/HTMLDocView.java
index 1ffc020aa6..b0c5001849 100644
---
a/java/java.navigation/src/org/netbeans/modules/java/navigation/HTMLDocView.java
+++
b/java/java.navigation/src/org/netbeans/modules/java/navigation/HTMLDocView.java
@@ -39,7 +39,6 @@ import javax.swing.text.html.HTMLEditorKit;
import org.netbeans.api.editor.mimelookup.MimeLookup;
import org.netbeans.api.editor.settings.FontColorNames;
import org.netbeans.api.editor.settings.FontColorSettings;
-import org.netbeans.editor.EditorUI;
/**
* HTML documentation view.
@@ -118,6 +117,7 @@ class HTMLDocView extends JEditorPane {
});
}
+ @Override
protected EditorKit createDefaultEditorKit() {
// it is extremelly slow to init it
if (htmlKit == null){
diff --git
a/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyserCellRenderer.java
b/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyserCellRenderer.java
index 8829b7d0eb..44d0641faf 100644
---
a/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyserCellRenderer.java
+++
b/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyserCellRenderer.java
@@ -98,19 +98,15 @@ class AnalyserCellRenderer extends DefaultListCellRenderer {
if (isSelected) {
sb.append("<style> a.val {text-decoration: underline; color:
"+toRgbText(getForeground())+"} </style><body>");
}
- String prefix = line.substring (0, link.getStartOffset ());
- if (prefix.startsWith("at ")) {
- prefix = " " +
prefix;
- }
- sb.append (prefix);
- sb.append ("<a class=\"val\" href=\"\">");
- sb.append (line.substring (link.getStartOffset (),
link.getEndOffset ()));
- sb.append ("</a>");
- sb.append (line.substring (link.getEndOffset ()));
- sb.append ("</body></html>");
- setText (sb.toString ());
+ sb.append(indentAt(escapeAngleBrackets(line.substring(0,
link.getStartOffset())), " "));
+ sb.append("<a class=\"val\" href=\"\">");
+
sb.append(escapeAngleBrackets(line.substring(link.getStartOffset(),
link.getEndOffset())));
+ sb.append("</a>");
+
sb.append(escapeAngleBrackets(line.substring(link.getEndOffset())));
+ sb.append("</body></html>");
+ setText(sb.toString ());
} else {
- setText (line.trim ());
+ setText(indentAt(line.strip(), " "));
}
setEnabled (list.isEnabled ());
@@ -145,5 +141,13 @@ class AnalyserCellRenderer extends DefaultListCellRenderer
{
private String toRgbText(Color c) {
return String.format("#%02x%02x%02x", c.getRed(), c.getGreen(),
c.getBlue());
}
+
+ private String escapeAngleBrackets(String str) {
+ return str.replace("<", "<");
+ }
+
+ private String indentAt(String str, String indent) {
+ return str.startsWith("at ") ? indent.repeat(8) + str : str;
+ }
}
diff --git
a/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyzeStackAction.java
b/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyzeStackAction.java
index 182a260855..2a4191b27e 100644
---
a/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyzeStackAction.java
+++
b/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyzeStackAction.java
@@ -34,6 +34,7 @@ public class AnalyzeStackAction extends AbstractAction {
// putValue(SMALL_ICON, new
ImageIcon(Utilities.loadImage(AnalyzeStackTopComponent.ICON_PATH, true)));
}
+ @Override
public void actionPerformed(ActionEvent evt) {
TopComponent win = AnalyzeStackTopComponent.findInstance();
win.open();
diff --git
a/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyzeStackTopComponent.java
b/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyzeStackTopComponent.java
index a6a098191b..14aa953deb 100644
---
a/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyzeStackTopComponent.java
+++
b/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyzeStackTopComponent.java
@@ -139,7 +139,8 @@ final class AnalyzeStackTopComponent extends TopComponent {
String lastLine = null;
try {
while ((currentLine = r.readLine()) != null) {
- currentLine = currentLine.trim();
+ // strip ANSI symbols just in case the terminal/clipboard
hasn't done that
+ currentLine =
currentLine.replaceAll("\u001B\\[[\\d;]*[^\\d;]", "").strip();
if (StackLineAnalyser.matches(currentLine)) {
if (lastLine != null) {
model.addElement(lastLine);
diff --git
a/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/StackLineAnalyser.java
b/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/StackLineAnalyser.java
index c7c5bbc29f..e13ef2a5cd 100644
---
a/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/StackLineAnalyser.java
+++
b/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/StackLineAnalyser.java
@@ -27,11 +27,9 @@ import java.util.regex.Pattern;
import javax.swing.text.StyledDocument;
import org.netbeans.api.annotations.common.CheckForNull;
import org.netbeans.api.annotations.common.NullAllowed;
-
import org.netbeans.api.java.classpath.ClassPath;
import org.netbeans.api.java.classpath.GlobalPathRegistry;
import org.netbeans.api.progress.ProgressHandle;
-import org.netbeans.api.progress.ProgressHandleFactory;
import org.netbeans.spi.java.classpath.support.ClassPathSupport;
import org.openide.awt.StatusDisplayer;
import org.openide.cookies.EditorCookie;
@@ -57,11 +55,12 @@ class StackLineAnalyser {
private static final String IDENTIFIER =
"\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*"; //
NOI18N
private static final Pattern LINE_PATTERN = Pattern.compile(
- "at\\s" + // initial at //
NOI18N
+ "at\\s+" + // initial at //
NOI18N
"("+IDENTIFIER+"(?:\\."+IDENTIFIER+")*/)?" + // optional module name
// NOI18N
"(("+IDENTIFIER+"(\\."+IDENTIFIER+")*)\\.)?("+IDENTIFIER+")" + //
class name // NOI18N
-
"\\.("+IDENTIFIER+"|\\<init\\>|\\<clinit\\>)\\((?:"+IDENTIFIER+"(?:\\."+IDENTIFIER+")*/)?"
+IDENTIFIER+"\\.?("+IDENTIFIER+ // method and file name // NOI18N
- ")\\:([0-9]*)\\)"); // line number //
NOI18N
+ "\\.("+IDENTIFIER+"|\\<init\\>|\\<clinit\\>)\\s*"+ // method name
+
"\\((?:"+IDENTIFIER+"(?:\\."+IDENTIFIER+")*/)?"+IDENTIFIER+"(\\.(?:\\p{javaJavaIdentifierPart}+))?"+
// '(File.java' // NOI18N
+ "\\:([0-9]*)\\)"); // ':123)' // NOI18N
static boolean matches(String line) {
Matcher matcher = LINE_PATTERN.matcher(line);
@@ -71,7 +70,7 @@ class StackLineAnalyser {
static Link analyse(String line) {
Matcher matcher = LINE_PATTERN.matcher(line);
if (matcher.find()) {
- int lineNumber = -1;
+ int lineNumber;
try {
lineNumber = Integer.parseInt(matcher.group(8));
} catch (NumberFormatException nfe) {
@@ -81,7 +80,7 @@ class StackLineAnalyser {
if (matcher.group(1) != null) {
moduleStart = matcher.start(1);
}
- String ext = "." + matcher.group(7);
+ String ext = matcher.group(7);
if (matcher.group(2)==null ) {
return new Link(matcher.group(5),
lineNumber,
@@ -144,75 +143,67 @@ class StackLineAnalyser {
resources.add(name + ".java"); //NOI18N
idx = name.lastIndexOf('$');
}
- final ProgressHandle handle = ProgressHandleFactory.createHandle(
+ final ProgressHandle handle = ProgressHandle.createHandle(
NbBundle.getMessage(StackLineAnalyser.class,
"TXT_OpeningSource", resources.get(0)));
handle.start();
- RP.execute(
- new Runnable() {
- @Override
- public void run() {
- DataObject dobj = null;
- try {
- final ClassPath classPath =
ClassPathSupport.createClassPath(
+ RP.execute(() -> {
+ DataObject dobj = null;
+ try {
+ final ClassPath classPath =
ClassPathSupport.createClassPath(
GlobalPathRegistry.getDefault().getSourceRoots().toArray(new FileObject[0]));
- for (String resource : resources) {
- dobj =
findDataObject(classPath.findResource(resource));
- if (dobj != null)
- break;
+ for (String resource : resources) {
+ dobj =
findDataObject(classPath.findResource(resource));
+ if (dobj != null)
+ break;
+ }
+ } finally {
+ final DataObject dataObject = dobj;
+ Mutex.EVENT.readAccess(() -> {
+ try {
+ if (dataObject == null) {
+ StatusDisplayer.getDefault().setStatusText(
+
NbBundle.getMessage(StackLineAnalyser.class,
+
"AnalyzeStackTopComponent.sourceNotFound",
+ new
Object[]{resources.get(0)}));
+ return;
}
- } finally {
- final DataObject dataObject = dobj;
- Mutex.EVENT.readAccess(new Runnable() {
- @Override
- public void run() {
- try {
- if (dataObject == null) {
-
StatusDisplayer.getDefault().setStatusText(
-
NbBundle.getMessage(StackLineAnalyser.class,
-
"AnalyzeStackTopComponent.sourceNotFound",
- new Object[]{resources.get(0)}));
- return;
- }
- try {
- EditorCookie editorCookie =
(EditorCookie) dataObject.getCookie(EditorCookie.class);
- LineCookie lineCookie =
(LineCookie) dataObject.getCookie(LineCookie.class);
- if (editorCookie != null &&
lineCookie != null && lineNumber != -1) {
- StyledDocument doc =
editorCookie.openDocument();
- if (doc != null) {
- if (lineNumber != -1) {
- try {
- Line l =
lineCookie.getLineSet().getCurrent(lineNumber - 1);
-
- if (l != null) {
-
l.show(Line.SHOW_GOTO);
- return;
- }
- } catch
(IndexOutOfBoundsException oob) {
- //line number is
no more valid, do not report as an error
-
StatusDisplayer.getDefault().setStatusText(
-
NbBundle.getMessage(StackLineAnalyser.class,
-
"AnalyzeStackTopComponent.lineNotFound",
- new
Object[]{lineNumber}));
- }
- }
+ try {
+ EditorCookie editorCookie =
dataObject.getLookup().lookup(EditorCookie.class);
+ LineCookie lineCookie =
dataObject.getLookup().lookup(LineCookie.class);
+ if (editorCookie != null && lineCookie != null
&& lineNumber != -1) {
+ StyledDocument doc =
editorCookie.openDocument();
+ if (doc != null) {
+ if (lineNumber != -1) {
+ try {
+ Line l =
lineCookie.getLineSet().getCurrent(lineNumber - 1);
+ if (l != null) {
+
l.show(Line.ShowOpenType.OPEN, Line.ShowVisibilityType.FRONT);
+ return;
}
+ } catch (IndexOutOfBoundsException
oob) {
+ //line number is no more
valid, do not report as an error
+
StatusDisplayer.getDefault().setStatusText(
+
NbBundle.getMessage(StackLineAnalyser.class,
+
"AnalyzeStackTopComponent.lineNotFound",
+ new
Object[]{lineNumber}));
}
- OpenCookie openCookie =
(OpenCookie) dataObject.getCookie(OpenCookie.class);
- if (openCookie != null) {
- openCookie.open();
- return;
- }
- } catch (IOException e) {
- Exceptions.printStackTrace(e);
}
- } finally {
- handle.finish();
}
}
- });
+ OpenCookie openCookie =
dataObject.getLookup().lookup(OpenCookie.class);
+ if (openCookie != null) {
+ openCookie.open();
+ return;
+ }
+ } catch (IOException e) {
+ Exceptions.printStackTrace(e);
+ }
+ } finally {
+ handle.finish();
}
- }
- });
+ });
+ }
+ });
}
}
diff --git
a/java/java.navigation/test/unit/src/org/netbeans/modules/java/stackanalyzer/StackLineAnalyserTest.java
b/java/java.navigation/test/unit/src/org/netbeans/modules/java/stackanalyzer/StackLineAnalyserTest.java
index 7d871e3425..40dbd39f94 100644
---
a/java/java.navigation/test/unit/src/org/netbeans/modules/java/stackanalyzer/StackLineAnalyserTest.java
+++
b/java/java.navigation/test/unit/src/org/netbeans/modules/java/stackanalyzer/StackLineAnalyserTest.java
@@ -48,17 +48,40 @@ public class StackLineAnalyserTest extends NbTestCase {
assertTrue(StackLineAnalyser.matches(" [exec] at
org.openide.filesystems.FileUtil.normalizeFileOnMac(FileUtil.java:1714)"));
assertTrue(StackLineAnalyser.matches("at
java.base/java.lang.String.lastIndexOf(String.java:1627)"));
assertTrue(StackLineAnalyser.matches(" at
java.base/java.lang.String.lastIndexOf(String.java:1627)"));
+ // some loggers (e.g. MavenSimpleLogger until MNG-7970/#1342 which is
maven's default logger) seem to add a space before the '('
+ assertTrue(StackLineAnalyser.matches(" at
java.util.zip.ZipFile$CleanableResource.<init> (ZipFile.java:742)"));
}
@Test
public void testMatchesScalaLines() throws Exception {
- assertTrue(StackLineAnalyser.matches("at
org.enso.compiler.core.ir.MetadataStorage.$anonfun$getUnsafe$1(MetadataStorage.scala:80)"));
- StackLineAnalyser.Link l = StackLineAnalyser.analyse("at
org.enso.compiler.core.ir.MetadataStorage.$anonfun$getUnsafe$1(MetadataStorage.scala:80)");
+ String line = "at
org.enso.compiler.core.ir.MetadataStorage.$anonfun$getUnsafe$1(MetadataStorage.scala:80)";
+ assertTrue(StackLineAnalyser.matches(line));
+ StackLineAnalyser.Link l = StackLineAnalyser.analyse(line);
assertEquals(3, l.getStartOffset());
assertEquals(91, l.getEndOffset());
assertEquals(".scala", l.getExtension());
}
+ @Test
+ public void testMatchesUnknownFileLines() throws Exception {
+ String line = "at org.Unknown(Unknown:80)";
+ assertTrue(StackLineAnalyser.matches(line));
+ StackLineAnalyser.Link l = StackLineAnalyser.analyse(line);
+ assertEquals(3, l.getStartOffset());
+ assertEquals(26, l.getEndOffset());
+ assertEquals(null, l.getExtension());
+ }
+
+ @Test
+ public void testMatchesWithNoPackage() throws Exception {
+ String line = "\tat NewClass.main(NewClass.java:12)";
+ assertTrue(StackLineAnalyser.matches(line));
+ StackLineAnalyser.Link l = StackLineAnalyser.analyse(line);
+ assertEquals(4, l.getStartOffset());
+ assertEquals(35, l.getEndOffset());
+ assertEquals(".java", l.getExtension());
+ }
+
@Test
public void testModuleStackTraceMatches() throws Exception {
assertTrue(StackLineAnalyser.matches("at
library.Library.init(Utilities/Library.java:24)"));
@@ -85,6 +108,9 @@ public class StackLineAnalyserTest extends NbTestCase {
l = StackLineAnalyser.analyse(" at
java.base/java.lang.String.lastIndexOf(String.java:1627)");
assertEquals(4, l.getStartOffset());
assertEquals(60, l.getEndOffset());
+ l = StackLineAnalyser.analyse(" at
java.util.zip.ZipFile$CleanableResource.<init> (ZipFile.java:742)");
+ assertEquals(7, l.getStartOffset());
+ assertEquals(72, l.getEndOffset());
}
@Test
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists