Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JavaElementHyperlinkDetector: Parser runs into NegativeArraySizeException in some cases #968

Closed
Kademlia opened this issue Apr 13, 2023 · 5 comments · Fixed by #1405
Closed
Assignees
Labels
bug Something isn't working regression Something was broken by a previous change
Milestone

Comments

@Kademlia
Copy link

Kademlia commented Apr 13, 2023

Hey,

CTRL+Leftclick to open a File/Method from Code will break in the whole file if specific generics + switch statements are added.

I include a Code that will no longer allow clicking on Methods/Filenames but NOT show an error in eclipse
In some other files I will get an exception (See video below)
at org.eclipse.jdt.internal.compiler.parser.Parser.consumeEnterVariable(Parser.java:3713) java.lang.NegativeArraySizeException: -1
I was not able to reproduce the error-message in this small example

on Version: 2023-03 (4.27.0) (+ Lombok / Windows 10)
Build id: 20230309-1520

Using var fixes the line again:

// This line breaks the file
TestDraft2<Integer, Integer> draft2 = new TestDraft2(); 
// This line does not
var draft2 = new TestDraft2();

Code example that is working until TestDraft2 in Line 25 is enabled.

package test;

import java.util.concurrent.Callable;

public class OptionActions {

	public enum TestEnum {
		X
	}
	
	public final record TestDraft<T >() {}
	public final record TestDraft2<T, U >() {}
	
	public static final Callable<Void> test = new Callable<>() {
		@Override
		public Void call() throws Exception {
			TestEnum p = TestEnum.X;
			
			Object v = switch (p) {
				case X -> null;
			};
	
			TestDraft<Integer> draft = new TestDraft(); // This line is fine
			// If this line is enabled the whole file will no longer support CTRL+Leftclick (JavaElementHyperlinkDetector)
			// TestDraft2<Integer, Integer> draft2 = new TestDraft2(); 
			return null;
		}
	};
}
Exception being spammend on every mouse-pixel moved in the file
java.lang.NegativeArraySizeException: -1
	at org.eclipse.jdt.internal.compiler.parser.Parser.consumeEnterVariable(Parser.java:3713)
	at org.eclipse.jdt.internal.codeassist.select.SelectionParser.consumeEnterVariable(SelectionParser.java:652)
	at org.eclipse.jdt.internal.compiler.parser.Parser.consumeRule(Parser.java:7140)
	at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:13152)
	at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:13407)
	at org.eclipse.jdt.internal.codeassist.select.SelectionParser.parse(SelectionParser.java:1705)
	at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:13364)
	at org.eclipse.jdt.internal.compiler.parser.Parser.dietParse(Parser.java:11750)
	at org.eclipse.jdt.internal.codeassist.select.SelectionParser.dietParse(SelectionParser.java:1529)
	at org.eclipse.jdt.internal.codeassist.SelectionEngine.select(SelectionEngine.java:994)
	at org.eclipse.jdt.internal.core.Openable.codeSelect(Openable.java:167)
	at org.eclipse.jdt.internal.core.CompilationUnit.codeSelect(CompilationUnit.java:389)
	at org.eclipse.jdt.internal.core.CompilationUnit.codeSelect(CompilationUnit.java:382)
	at org.eclipse.jdt.internal.ui.javaeditor.JavaElementHyperlinkDetector.detectHyperlinks(JavaElementHyperlinkDetector.java:124)
	at org.eclipse.ui.texteditor.HyperlinkDetectorRegistry$HyperlinkDetectorDelegate.detectHyperlinks(HyperlinkDetectorRegistry.java:81)
	at org.eclipse.jface.text.hyperlink.HyperlinkManager.findHyperlinks(HyperlinkManager.java:289)
	at org.eclipse.jface.text.hyperlink.HyperlinkManager.findHyperlinks(HyperlinkManager.java:262)
	at org.eclipse.jface.text.hyperlink.HyperlinkManager.mouseMove(HyperlinkManager.java:457)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:216)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4256)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1066)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4054)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3642)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1155)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1046)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155)
	at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:643)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:550)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:171)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:152)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:136)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:402)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:659)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:596)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1467)
eclipseBug2.mp4
@trancexpress trancexpress added the bug Something isn't working label Apr 13, 2023
@trancexpress
Copy link
Contributor

I can't reproduce the logged errors, however I can reproduce the not working selection.

First commit I see this with is: 446877a

Reverting this change at the commit above results in the selection (and e.g. Ctrl+Click) working again:

diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java
index ddd6bf3d1a..910483408a 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2023 IBM Corporation and others.
+ * Copyright (c) 2000, 2022 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -852,11 +852,7 @@ protected void consumeCaseLabelElement(CaseLabelKind kind) {
 
        }
 }
-@Override
-protected void consumeSwitchLabeledExpression() {
-       super.consumeSwitchLabeledExpression();
-       popElement(K_SWITCH_EXPRESSION_DELIMITTER);
-}
+
 private void pushLocalVariableFromRecordPatternOnAstStack(RecordPattern rp) {
        Pattern[] patterns = rp.patterns;
        for (Pattern pattern : patterns) {
@@ -1377,9 +1373,6 @@ protected void consumeToken(int token) {
                                        popElement(K_BETWEEN_CASE_AND_COLONORARROW);
                                }
                                break;
-                       case TokenNameBeginCaseExpr:
-                               pushOnElementStack(K_SWITCH_EXPRESSION_DELIMITTER);
-                               break;
                        case TokenNamereturn:
                                pushOnElementStack(K_INSIDE_RETURN_STATEMENT, this.bracketDepth);
                                break;

On top of current master, this change restores the expected behavior:

diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java
index ddd6bf3d1a..9d3482feed 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java
@@ -855,7 +855,7 @@ protected void consumeCaseLabelElement(CaseLabelKind kind) {
 @Override
 protected void consumeSwitchLabeledExpression() {
        super.consumeSwitchLabeledExpression();
-       popElement(K_SWITCH_EXPRESSION_DELIMITTER);
+//     popElement(K_SWITCH_EXPRESSION_DELIMITTER);
 }
 private void pushLocalVariableFromRecordPatternOnAstStack(RecordPattern rp) {
        Pattern[] patterns = rp.patterns;

A test can be added with:

diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ResolveTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ResolveTests.java
index e13d1a2492..a3ad3f1ffc 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ResolveTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ResolveTests.java
@@ -2733,4 +2733,38 @@ public void testConstantInLocal() throws JavaModelException {
                        "CONSTANT [in Local [in main(String[]) [in X [in [Working copy] Test2.java [in <default> [in src [in Resolve]]]]]]]",
                        elements);
 }
+/**
+ * Ensure working selection for an inner type with generics, after an enhanced switch.
+ * See: https://github.com/eclipse-jdt/eclipse.jdt.core/issues/968
+ */
+public void testSelectInnerTypeAfterSwitchGh968() throws Exception {
+       this.workingCopies = new ICompilationUnit[2];
+       this.workingCopies[0] = getWorkingCopy(
+                       "/Resolve/src/X.java",
+                       """
+                       public class X {
+                               public enum TestEnum {
+                                       TEST
+                               }
+                               static class TestDraft2<T, U> {}
+                               public static void main(String[] args) {
+                                       Object v = switch (TestEnum.TEST) {
+                                               case TEST -> null;
+                                       };
+                                       TestDraft2<Integer, Integer> draft2;
+                               }
+                       }
+                       """);
+
+       String str = this.workingCopies[0].getSource();
+       String selection = "TestDraft2";
+       int start = str.indexOf(selection, str.indexOf("public static void main"));
+       int length = selection.length();
+       IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length, this.wcOwner);
+
+       assertElementsEqual(
+                       "Unexpected elements after selecting static inner type after enhanced switch",
+                       "TestDraft2 [in X [in [Working copy] X.java [in <default> [in src [in Resolve]]]]]",
+                       elements);
+}
 }

@jarthana do you have time to look into this?

@trancexpress trancexpress added the regression Something was broken by a previous change label Apr 13, 2023
@Kademlia
Copy link
Author

Kademlia commented May 16, 2023

Here is another example.
I found out that using CTRL+SHIFT+G will force an Unhandled event loop exception

`
package test;

import java.lang.StackWalker.Option;
import java.util.concurrent.Callable;
import java.util.function.Function;

public class TestEcl {

public static final Callable<Void> test = new Callable<>() {
	@Override
	public Void call() throws Exception {
		Option opt = Option.RETAIN_CLASS_REFERENCE;
		
		boolean a = switch (opt) {
			case RETAIN_CLASS_REFERENCE -> true;
			// Enabling this line breaks eclipse
			// CTRL+SHIFT+G Will throw exception Code resolve error 'java.lang.NegativeArraySizeException: -1'
			//case SHOW_HIDDEN_FRAMES -> true; 
			default -> throw new IllegalArgumentException("Unexpected value");
		};

		boolean b = switch (opt) {
			case RETAIN_CLASS_REFERENCE -> true;
			default -> throw new IllegalArgumentException("Unexpected value");
		};
		return null;
	}
};

public static final Function<Object, Object> test2 = new Function<>() {
	@Override
	public Object apply(Object t) {
		return null;
	}
};

}
`

java.lang.NegativeArraySizeException: -1
at org.eclipse.jdt.internal.compiler.parser.Parser.consumeEnterVariable(Parser.java:3713)
at org.eclipse.jdt.internal.codeassist.select.SelectionParser.consumeEnterVariable(SelectionParser.java:652)
at org.eclipse.jdt.internal.compiler.parser.Parser.consumeRule(Parser.java:7140)
at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:13152)
at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:13407)
at org.eclipse.jdt.internal.codeassist.select.SelectionParser.parse(SelectionParser.java:1705)
at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:13364)
at org.eclipse.jdt.internal.compiler.parser.Parser.dietParse(Parser.java:11750)
at org.eclipse.jdt.internal.codeassist.select.SelectionParser.dietParse(SelectionParser.java:1529)
at org.eclipse.jdt.internal.codeassist.SelectionEngine.select(SelectionEngine.java:994)
at org.eclipse.jdt.internal.core.Openable.codeSelect(Openable.java:167)
at org.eclipse.jdt.internal.core.CompilationUnit.codeSelect(CompilationUnit.java:389)
at org.eclipse.jdt.internal.core.CompilationUnit.codeSelect(CompilationUnit.java:382)
at org.eclipse.jdt.internal.ui.javaeditor.JavaElementHyperlinkDetector.detectHyperlinks(JavaElementHyperlinkDetector.java:124)
at org.eclipse.ui.texteditor.HyperlinkDetectorRegistry$HyperlinkDetectorDelegate.detectHyperlinks(HyperlinkDetectorRegistry.java:81)
at org.eclipse.jface.text.hyperlink.HyperlinkManager.findHyperlinks(HyperlinkManager.java:289)
at org.eclipse.jface.text.hyperlink.HyperlinkManager.findHyperlinks(HyperlinkManager.java:262)
at org.eclipse.jface.text.hyperlink.HyperlinkManager.mouseMove(HyperlinkManager.java:457)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:216)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89)
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4256)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1066)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4054)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3642)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1155)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1046)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155)
at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:643)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:550)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:171)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:152)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:136)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:402)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:659)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:596)
at org.eclipse.equinox.launcher.Main.run(Main.java:1467)

@Kademlia
Copy link
Author

Can confirm for Eclipse 2023-09 M1

I was able to create a code-example that will throw an error in the eclipse console when holding CTRL and hoverying over any element (Source lookup popup).

package etm;

public class EclipseEventLoopExeption {

	public enum TestEnum {
		X
	}
	@FunctionalInterface
	public interface Func<C,R>  {
	    R apply(C c) throws Exception;
	}
	public static final Func<Object, Void> func1 = new Func<>() {
		@Override
		public Void apply( Object sup) {
			TestEnum old = TestEnum.X;
			TestEnum next = switch (old) {
				case X -> TestEnum.X;
			};
			return null;
		}
	};
	
	public static final Func<Object, Void> func2 = new Func<>() {
		@Override
		public Void apply(Object sup) {
			return null;
		}
	};
}

image

@Kademlia
Copy link
Author

Can confirm for Version: 2023-09 M3 (4.29.0 M3)

@srikanth-sankaran srikanth-sankaran self-assigned this Sep 18, 2023
@srikanth-sankaran
Copy link
Contributor

I can't reproduce the logged errors, however I can reproduce the not working selection.

First commit I see this with is: 446877a

Reverting this change at the commit above results in the selection (and e.g. Ctrl+Click) working again:

diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java
index ddd6bf3d1a..910483408a 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2023 IBM Corporation and others.
+ * Copyright (c) 2000, 2022 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -852,11 +852,7 @@ protected void consumeCaseLabelElement(CaseLabelKind kind) {
 
        }
 }
-@Override
-protected void consumeSwitchLabeledExpression() {
-       super.consumeSwitchLabeledExpression();
-       popElement(K_SWITCH_EXPRESSION_DELIMITTER);
-}
+
 private void pushLocalVariableFromRecordPatternOnAstStack(RecordPattern rp) {
        Pattern[] patterns = rp.patterns;
        for (Pattern pattern : patterns) {
@@ -1377,9 +1373,6 @@ protected void consumeToken(int token) {
                                        popElement(K_BETWEEN_CASE_AND_COLONORARROW);
                                }
                                break;
-                       case TokenNameBeginCaseExpr:
-                               pushOnElementStack(K_SWITCH_EXPRESSION_DELIMITTER);
-                               break;
                        case TokenNamereturn:
                                pushOnElementStack(K_INSIDE_RETURN_STATEMENT, this.bracketDepth);
                                break;

On top of current master, this change restores the expected behavior:

diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java
index ddd6bf3d1a..9d3482feed 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/select/SelectionParser.java
@@ -855,7 +855,7 @@ protected void consumeCaseLabelElement(CaseLabelKind kind) {
 @Override
 protected void consumeSwitchLabeledExpression() {
        super.consumeSwitchLabeledExpression();
-       popElement(K_SWITCH_EXPRESSION_DELIMITTER);
+//     popElement(K_SWITCH_EXPRESSION_DELIMITTER);
 }
 private void pushLocalVariableFromRecordPatternOnAstStack(RecordPattern rp) {
        Pattern[] patterns = rp.patterns;

A test can be added with:

diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ResolveTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ResolveTests.java
index e13d1a2492..a3ad3f1ffc 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ResolveTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ResolveTests.java
@@ -2733,4 +2733,38 @@ public void testConstantInLocal() throws JavaModelException {
                        "CONSTANT [in Local [in main(String[]) [in X [in [Working copy] Test2.java [in <default> [in src [in Resolve]]]]]]]",
                        elements);
 }
+/**
+ * Ensure working selection for an inner type with generics, after an enhanced switch.
+ * See: https://github.com/eclipse-jdt/eclipse.jdt.core/issues/968
+ */
+public void testSelectInnerTypeAfterSwitchGh968() throws Exception {
+       this.workingCopies = new ICompilationUnit[2];
+       this.workingCopies[0] = getWorkingCopy(
+                       "/Resolve/src/X.java",
+                       """
+                       public class X {
+                               public enum TestEnum {
+                                       TEST
+                               }
+                               static class TestDraft2<T, U> {}
+                               public static void main(String[] args) {
+                                       Object v = switch (TestEnum.TEST) {
+                                               case TEST -> null;
+                                       };
+                                       TestDraft2<Integer, Integer> draft2;
+                               }
+                       }
+                       """);
+
+       String str = this.workingCopies[0].getSource();
+       String selection = "TestDraft2";
+       int start = str.indexOf(selection, str.indexOf("public static void main"));
+       int length = selection.length();
+       IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length, this.wcOwner);
+
+       assertElementsEqual(
+                       "Unexpected elements after selecting static inner type after enhanced switch",
+                       "TestDraft2 [in X [in [Working copy] X.java [in <default> [in src [in Resolve]]]]]",
+                       elements);
+}
 }

This problem may have been fixed by #1349 - The code segments @trancexpress calls out in earlier comments as being problematic have undergone change in that PR. I will roll the code segments in this ticket into regression tests to see what part of the problem may still remain,

srikanth-sankaran added a commit to srikanth-sankaran/eclipse.jdt.core that referenced this issue Sep 21, 2023
srikanth-sankaran added a commit to srikanth-sankaran/eclipse.jdt.core that referenced this issue Sep 21, 2023
srikanth-sankaran added a commit that referenced this issue Sep 21, 2023
@srikanth-sankaran srikanth-sankaran added this to the 4.30 M1 milestone Sep 21, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working regression Something was broken by a previous change
Projects
None yet
3 participants