diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ResolveTests10.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ResolveTests10.java index e9b2eb4406a..39284cf91da 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ResolveTests10.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ResolveTests10.java @@ -178,4 +178,49 @@ private void mat() { selected ); } + + // https://github.com/eclipse-jdt/eclipse.jdt.core/issues/4217 + // NPE: Cannot invoke org.eclipse.jdt.internal.compiler.lookup.BlockScope.getBinding(char[], int, org.eclipse.jdt.internal.compiler.lookup.InvocationSite, boolean) because scope is null" on hyperlink request + public void testIssue4217() throws CoreException { + this.wc = getWorkingCopy("/Resolve/src/X.java", + """ + import java.util.concurrent.Callable; + + public class Test { + + public static void createObjectBinding(final Callable func) { + return; + } + + sealed interface Index { + enum SS implements Index {} + enum TS implements Index {} + } + + public abstract sealed class Entity permits Struct, Time {} + + final class Struct extends Entity {} + + final class Time extends Entity { + Struct getStruct() { + return null; + } + } + + private void setMaterials(Time entity) { + ObjectBinding> selfIllumImage = Bindings.>createObjectBinding(() -> { + var entity2/*here*/ = entity.getStruct() == null ? entity : entity.getStruct(); + return createSlefIlluminationMap(entity.getSpells()); + }); + } + } + """); + String str = this.wc.getSource(); + String selection = "entity2/*here*/"; + int start = str.lastIndexOf(selection); + int length = selection.length(); + + IJavaElement[] selected = this.wc.codeSelect(start, length); + assertEquals(0, selected.length); + } } diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java index 6c58ca81bd2..025b3ea09f5 100644 --- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java +++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java @@ -1410,6 +1410,9 @@ public boolean visit(ConstructorDeclaration constructorDeclaration, ClassScope s public boolean visit( LocalDeclaration localDeclaration, BlockScope scope) { if(localDeclaration instanceof SelectionOnLocalName) { + if (scope == null) { + throw new SelectionNodeFound(); + } localDeclaration.resolve(scope); } if (localDeclaration.type instanceof SingleTypeReference && ((SingleTypeReference)localDeclaration.type).token == assistIdentifier) {