From 32a9ff77022d95e899a609642ec5501d24ffbbd5 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Tue, 31 Oct 2023 07:40:37 +0100 Subject: [PATCH] Navigate to Scala classes in Analyze Stack Window --- .../java/stackanalyzer/StackLineAnalyser.java | 45 +++++++++++-------- .../stackanalyzer/StackLineAnalyserTest.java | 9 ++++ 2 files changed, 36 insertions(+), 18 deletions(-) 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 0212c1d06aac..c7c5bbc29f62 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 @@ -60,8 +60,8 @@ class StackLineAnalyser { "at\\s" + // initial at // NOI18N "("+IDENTIFIER+"(?:\\."+IDENTIFIER+")*/)?" + // optional module name // NOI18N "(("+IDENTIFIER+"(\\."+IDENTIFIER+")*)\\.)?("+IDENTIFIER+")" + // class name // NOI18N - "\\.("+IDENTIFIER+"|\\|\\)\\((?:"+IDENTIFIER+"(?:\\."+IDENTIFIER+")*/)?" +IDENTIFIER+"\\.java" + // method and file name // NOI18N - "\\:([0-9]*)\\)"); // line number // NOI18N + "\\.("+IDENTIFIER+"|\\|\\)\\((?:"+IDENTIFIER+"(?:\\."+IDENTIFIER+")*/)?" +IDENTIFIER+"\\.?("+IDENTIFIER+ // method and file name // NOI18N + ")\\:([0-9]*)\\)"); // line number // NOI18N static boolean matches(String line) { Matcher matcher = LINE_PATTERN.matcher(line); @@ -73,7 +73,7 @@ static Link analyse(String line) { if (matcher.find()) { int lineNumber = -1; try { - lineNumber = Integer.parseInt(matcher.group(7)); + lineNumber = Integer.parseInt(matcher.group(8)); } catch (NumberFormatException nfe) { return null; } @@ -81,40 +81,43 @@ static Link analyse(String line) { if (matcher.group(1) != null) { moduleStart = matcher.start(1); } + String ext = "." + matcher.group(7); if (matcher.group(2)==null ) { return new Link(matcher.group(5), lineNumber, moduleStart != (-1) ? moduleStart : matcher.start(5), - matcher.end(7)+1 + matcher.end(8)+1, ext ); - + } return new Link(matcher.group(2) + matcher.group(5), lineNumber, moduleStart != (-1) ? moduleStart : matcher.start(2), - matcher.end(7)+1 + matcher.end(8)+1, ext ); } return null; } - static class Link { - - private String className; - private int lineNumber; - private int startOffset; - private int endOffset; - - private Link ( - String className, - int lineNumber, - int startOffset, - int endOffset + static final class Link { + private final String className; + private final int lineNumber; + private final int startOffset; + private final int endOffset; + private final String extension; + + private Link( + String className, + int lineNumber, + int startOffset, + int endOffset, + String extension ) { this.className = className; this.lineNumber = lineNumber; this.startOffset = startOffset; this.endOffset = endOffset; + this.extension = extension; } int getStartOffset () { @@ -125,13 +128,19 @@ int getEndOffset () { return endOffset; } + String getExtension() { + return extension; + } + void show () { String name = className.replace('.', '/'); final List resources = new ArrayList<>(); + resources.add(name + getExtension()); //NOI18N resources.add(name + ".java"); //NOI18N int idx = name.lastIndexOf('$'); while (idx >= 0) { name = name.substring(0, idx); + resources.add(name + getExtension()); //NOI18N resources.add(name + ".java"); //NOI18N idx = name.lastIndexOf('$'); } 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 d60581cb4911..7d871e3425cc 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 @@ -50,6 +50,15 @@ public void testMatches() throws Exception { assertTrue(StackLineAnalyser.matches(" at java.base/java.lang.String.lastIndexOf(String.java:1627)")); } + @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)"); + assertEquals(3, l.getStartOffset()); + assertEquals(91, l.getEndOffset()); + assertEquals(".scala", l.getExtension()); + } + @Test public void testModuleStackTraceMatches() throws Exception { assertTrue(StackLineAnalyser.matches("at library.Library.init(Utilities/Library.java:24)"));