From ba3d244c5ef0cab207d8ae34f94d7703b7d1803b Mon Sep 17 00:00:00 2001 From: sougandhs Date: Tue, 17 Sep 2024 14:21:22 +0530 Subject: [PATCH] using method name to find unqualified Stacktraces in Java Stack Trace console - WIP --- .../console/JavaStackTraceAmbiguityTest.java | 73 +++++++++++++++++++ .../testfiles/Ambiguity/a/Sample.java | 37 ++++++++++ .../testfiles/Ambiguity/b/Sample.java | 37 ++++++++++ .../testfiles/Ambiguity/c/Sample.java | 37 ++++++++++ .../jdt/debug/tests/AutomatedSuite.java | 2 + .../ui/console/JavaStackTraceHyperlink.java | 38 +++++++++- 6 files changed, 222 insertions(+), 2 deletions(-) create mode 100644 org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/JavaStackTraceAmbiguityTest.java create mode 100644 org.eclipse.jdt.debug.tests/testfiles/Ambiguity/a/Sample.java create mode 100644 org.eclipse.jdt.debug.tests/testfiles/Ambiguity/b/Sample.java create mode 100644 org.eclipse.jdt.debug.tests/testfiles/Ambiguity/c/Sample.java diff --git a/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/JavaStackTraceAmbiguityTest.java b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/JavaStackTraceAmbiguityTest.java new file mode 100644 index 0000000000..4d947c897a --- /dev/null +++ b/org.eclipse.jdt.debug.tests/console tests/org/eclipse/jdt/debug/tests/console/JavaStackTraceAmbiguityTest.java @@ -0,0 +1,73 @@ +package org.eclipse.jdt.debug.tests.console; + +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.debug.testplugin.JavaProjectHelper; +import org.eclipse.jdt.debug.tests.TestUtil; +import org.eclipse.jface.text.ITextSelection; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.console.IHyperlink; +import org.eclipse.ui.texteditor.ITextEditor; + +public class JavaStackTraceAmbiguityTest extends AbstractJavaStackTraceConsoleTest { + + public JavaStackTraceAmbiguityTest(String name) { + super(name); + } + + public void testLinkAmbiguityNavigationTrue() throws Exception { + String projectName = "StackTest"; + IJavaProject project = createProject(projectName, "testfiles/Ambiguity/", JavaProjectHelper.JAVA_SE_1_8_EE_NAME, false); + waitForBuild(); + waitForJobs(); + consoleDocumentWithText("Sample.tes3(int) line: 31"); + IHyperlink[] hyperlinks = fConsole.getHyperlinks(); + assertEquals("Wrong hyperlinks, listing all links: " + allLinks(), 2, hyperlinks.length); + String expectedText = "System.out.println(\"Expected\");"; + try { + for (IHyperlink hyperlink : hyperlinks) { + closeAllEditors(); + hyperlink.linkActivated(); + IEditorPart editor = waitForEditorOpen(); + String[] selectedText = new String[1]; + sync(() -> selectedText[0] = getSelectedText(editor)); + selectedText[0] = selectedText[0].trim(); + assertEquals("Wrong text selected after hyperlink navigation", expectedText, selectedText[0]); + + } + } finally { + closeAllEditors(); + boolean force = true; + project.getProject().delete(force, new NullProgressMonitor()); + } + } + private void waitForJobs() throws Exception { + TestUtil.waitForJobs(getName(), 250, 1000); + } + private static String getSelectedText(IEditorPart editor) { + ITextEditor textEditor = (ITextEditor) editor; + ISelectionProvider selectionProvider = textEditor.getSelectionProvider(); + ISelection selection = selectionProvider.getSelection(); + ITextSelection textSelection = (ITextSelection) selection; + String selectedText = textSelection.getText(); + return selectedText; + } + + private IEditorPart waitForEditorOpen() throws Exception { + waitForJobs(); + IEditorPart[] editor = new IEditorPart[1]; + sync(() -> editor[0] = getActivePage().getActiveEditor()); + long timeout = 30_000; + long start = System.currentTimeMillis(); + while (editor[0] == null && System.currentTimeMillis() - start < timeout) { + waitForJobs(); + sync(() -> editor[0] = getActivePage().getActiveEditor()); + } + if (editor[0] == null) { + throw new AssertionError("Timeout occurred while waiting for editor to open"); + } + return editor[0]; + } +} diff --git a/org.eclipse.jdt.debug.tests/testfiles/Ambiguity/a/Sample.java b/org.eclipse.jdt.debug.tests/testfiles/Ambiguity/a/Sample.java new file mode 100644 index 0000000000..e995a24bed --- /dev/null +++ b/org.eclipse.jdt.debug.tests/testfiles/Ambiguity/a/Sample.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2024 IBM Corporation and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package a; + +/** + * Test class + */ +public class Sample { + public static void main(String[] args) { + System.out.println("Main Method"); + test(); + } + public static void test() { + System.out.println("Testing.."); + } + public void testMethod() { + System.out.println("Random"); + } + public static void tes3(int x) { + System.out.println("Expected"); + } + public void tes2() { + + } + +} diff --git a/org.eclipse.jdt.debug.tests/testfiles/Ambiguity/b/Sample.java b/org.eclipse.jdt.debug.tests/testfiles/Ambiguity/b/Sample.java new file mode 100644 index 0000000000..bd3726a0e3 --- /dev/null +++ b/org.eclipse.jdt.debug.tests/testfiles/Ambiguity/b/Sample.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2024 IBM Corporation and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package b; + +/** + * Test class + */ +public class Sample { + public static void main(String[] args) { + System.out.println("Main Method"); + test(); + } + public static void test() { + System.out.println("Testing.."); + } + public void testMethod() { + System.out.println("Random"); + } + public static void tes3() { + System.out.println("Expected"); + } + public void tes2() { + + } + +} diff --git a/org.eclipse.jdt.debug.tests/testfiles/Ambiguity/c/Sample.java b/org.eclipse.jdt.debug.tests/testfiles/Ambiguity/c/Sample.java new file mode 100644 index 0000000000..ddc740277e --- /dev/null +++ b/org.eclipse.jdt.debug.tests/testfiles/Ambiguity/c/Sample.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2024 IBM Corporation and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package c; + +/** + * Test class + */ +public class Sample { + public static void main(String[] args) { + System.out.println("Main Method"); + test(); + } + public static void test() { + System.out.println("Testing.."); + } + public void testMethod() { + System.out.println("Random"); + } + public static void tes32() { + System.out.println("Expected"); + } + public void tes2() { + + } + +} diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java index c9615813f3..d9b9f3eff1 100644 --- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java +++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java @@ -56,6 +56,7 @@ import org.eclipse.jdt.debug.tests.console.ConsoleTerminateAllActionTests; import org.eclipse.jdt.debug.tests.console.IOConsoleTests; import org.eclipse.jdt.debug.tests.console.JavaDebugStackTraceConsoleTest; +import org.eclipse.jdt.debug.tests.console.JavaStackTraceAmbiguityTest; import org.eclipse.jdt.debug.tests.console.JavaStackTraceConsoleTest; import org.eclipse.jdt.debug.tests.core.AlternateStratumTests; import org.eclipse.jdt.debug.tests.core.ArgumentTests; @@ -273,6 +274,7 @@ public AutomatedSuite() { addTest(new TestSuite(JavaDebugStackTraceConsoleTest.class)); addTest(new TestSuite(IOConsoleTests.class)); addTest(new TestSuite(ConsoleTerminateAllActionTests.class)); + addTest(new TestSuite(JavaStackTraceAmbiguityTest.class)); //Core tests addTest(new TestSuite(DebugEventTests.class)); diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceHyperlink.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceHyperlink.java index 63d2e41fc5..5f5a02977e 100644 --- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceHyperlink.java +++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/console/JavaStackTraceHyperlink.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2017 IBM Corporation and others. + * Copyright (c) 2024 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -27,12 +27,15 @@ import org.eclipse.debug.core.model.IProcess; import org.eclipse.debug.ui.IDebugModelPresentation; import org.eclipse.debug.ui.IDebugUIConstants; +import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.search.IJavaSearchConstants; import org.eclipse.jdt.core.search.SearchEngine; import org.eclipse.jdt.core.search.TypeNameMatch; import org.eclipse.jdt.core.search.TypeNameMatchRequestor; +import org.eclipse.jdt.internal.core.SourceType; import org.eclipse.jdt.internal.debug.core.JavaDebugUtils; import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin; import org.eclipse.jdt.internal.debug.ui.actions.OpenFromClipboardAction; @@ -57,6 +60,7 @@ public class JavaStackTraceHyperlink implements IHyperlink { private final TextConsole fConsole; + private String originalHyperLink; /** * Constructor @@ -89,6 +93,7 @@ public void linkActivated() { int lineNumber; try { String linkText = getLinkText(); + originalHyperLink = linkText; typeName = getTypeName(linkText); lineNumber = getLineNumber(linkText); } catch (CoreException e1) { @@ -190,8 +195,37 @@ public IStatus runInUIThread(IProgressMonitor monitor) { } else if (source instanceof List) { // ambiguous @SuppressWarnings("unchecked") List matches = (List) source; + List exactMatchesFiltered = new ArrayList<>(); + String originalHyperLink2 = originalHyperLink; + int firstMethodStartIndex = originalHyperLink2.indexOf("."); //$NON-NLS-1$ + int firstMethodClosing = originalHyperLink2.indexOf(")"); //$NON-NLS-1$ + if (firstMethodStartIndex != -1 && firstMethodClosing != -1) { + String firstMethod = originalHyperLink2.substring(firstMethodStartIndex + 1, firstMethodClosing + 1); + for (Object obj : matches) { + @SuppressWarnings("restriction") + SourceType source = (SourceType) obj; + try { + @SuppressWarnings("restriction") + IMethod[] methods = source.getMethods(); + for (IMethod method : methods) { + int indexOfClosing = method.toString().indexOf(")"); //$NON-NLS-1$ + int indexOfStart = method.toString().substring(0,indexOfClosing+1).lastIndexOf(" "); //$NON-NLS-1$ + String methodName = method.toString().substring(indexOfStart + 1, indexOfClosing + 1); + if (methodName.equals(firstMethod)) { + exactMatchesFiltered.add(obj); + } + } + } catch (JavaModelException e) { + JDIDebugUIPlugin.log(e); + } + } + } + if (exactMatchesFiltered.size() == 1) { + processSearchResult(exactMatchesFiltered.get(0), typeName, lineNumber); + return Status.OK_STATUS; + } int line = lineNumber + 1; // lineNumber starts with 0, but line with 1, see #linkActivated - OpenFromClipboardAction.handleMatches(matches, line, typeName, ConsoleMessages.JavaDebugStackTraceHyperlink_dialog_title); + OpenFromClipboardAction.handleMatches(exactMatchesFiltered, line, typeName, ConsoleMessages.JavaDebugStackTraceHyperlink_dialog_title); return Status.OK_STATUS; } else { processSearchResult(source, typeName, lineNumber);