diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15JLS4Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15JLS4Test.java index 36d047605bd..01a60b2fb15 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15JLS4Test.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15JLS4Test.java @@ -2187,7 +2187,7 @@ public void test0070() throws JavaModelException { SimpleName simpleName2 = (SimpleName) name; typeBinding = simpleName2.resolveTypeBinding(); assertNotNull("No binding", typeBinding); - assertEquals("Wrong name 3", "test0070.Outer", typeBinding.getQualifiedName()); + assertEquals("Wrong name 3", "test0070.Outer", typeBinding.getQualifiedName()); } /** @@ -4001,7 +4001,7 @@ public void test0130() throws CoreException { simpleName = qualifiedType.getName(); typeBinding = simpleName.resolveTypeBinding(); assertNotNull("No binding", typeBinding); - assertEquals("Wrong qualified name 5", "Outer.Inner", typeBinding.getQualifiedName()); + assertEquals("Wrong qualified name 5", "Outer.Inner", typeBinding.getQualifiedName()); type = qualifiedType.getQualifier(); assertTrue("Not a parameterized type", type.isParameterizedType()); parameterizedType = (ParameterizedType) type; @@ -4019,7 +4019,7 @@ public void test0130() throws CoreException { simpleName = (SimpleName) name; typeBinding = simpleName.resolveTypeBinding(); assertNotNull("No binding", typeBinding); - assertEquals("Wrong qualified name 8", "Outer", typeBinding.getQualifiedName()); + assertEquals("Wrong qualified name 8", "Outer", typeBinding.getQualifiedName()); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=84140 diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15JLS8Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15JLS8Test.java index 4788f2b728f..8a6850a9536 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15JLS8Test.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15JLS8Test.java @@ -2183,7 +2183,7 @@ public void test0070() throws JavaModelException { SimpleName simpleName2 = (SimpleName) name; typeBinding = simpleName2.resolveTypeBinding(); assertNotNull("No binding", typeBinding); - assertEquals("Wrong name 3", "test0070.Outer", typeBinding.getQualifiedName()); + assertEquals("Wrong name 3", "test0070.Outer", typeBinding.getQualifiedName()); } /** @@ -3997,7 +3997,7 @@ public void test0130() throws CoreException { simpleName = qualifiedType.getName(); typeBinding = simpleName.resolveTypeBinding(); assertNotNull("No binding", typeBinding); - assertEquals("Wrong qualified name 5", "Outer.Inner", typeBinding.getQualifiedName()); + assertEquals("Wrong qualified name 5", "Outer.Inner", typeBinding.getQualifiedName()); type = qualifiedType.getQualifier(); assertTrue("Not a parameterized type", type.isParameterizedType()); parameterizedType = (ParameterizedType) type; @@ -4015,7 +4015,7 @@ public void test0130() throws CoreException { simpleName = (SimpleName) name; typeBinding = simpleName.resolveTypeBinding(); assertNotNull("No binding", typeBinding); - assertEquals("Wrong qualified name 8", "Outer", typeBinding.getQualifiedName()); + assertEquals("Wrong qualified name 8", "Outer", typeBinding.getQualifiedName()); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=84140 diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15Test.java index d789425e784..63ccfbd1584 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15Test.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15Test.java @@ -2199,7 +2199,7 @@ public void test0070() throws JavaModelException { SimpleName simpleName2 = (SimpleName) name; typeBinding = simpleName2.resolveTypeBinding(); assertNotNull("No binding", typeBinding); - assertEquals("Wrong name 3", "test0070.Outer", typeBinding.getQualifiedName()); + assertEquals("Wrong name 3", "test0070.Outer", typeBinding.getQualifiedName()); } /** @@ -4013,7 +4013,7 @@ public void test0130() throws CoreException { simpleName = qualifiedType.getName(); typeBinding = simpleName.resolveTypeBinding(); assertNotNull("No binding", typeBinding); - assertEquals("Wrong qualified name 5", "Outer.Inner", typeBinding.getQualifiedName()); + assertEquals("Wrong qualified name 5", "Outer.Inner", typeBinding.getQualifiedName()); type = qualifiedType.getQualifier(); assertTrue("Not a parameterized type", type.isParameterizedType()); parameterizedType = (ParameterizedType) type; @@ -4031,7 +4031,7 @@ public void test0130() throws CoreException { simpleName = (SimpleName) name; typeBinding = simpleName.resolveTypeBinding(); assertNotNull("No binding", typeBinding); - assertEquals("Wrong qualified name 8", "Outer", typeBinding.getQualifiedName()); + assertEquals("Wrong qualified name 8", "Outer", typeBinding.getQualifiedName()); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=84140 @@ -11883,4 +11883,52 @@ public void testBug540313() throws JavaModelException { assertNull("Binding", typeBinding); } + public void testGH4344() throws CoreException { + this.workingCopy = getWorkingCopy("/Converter15/src/X.java", true/* resolve */); + String contents = """ + class Sandwich {} + class Outer { + public class Inner { + public class InnerInner { + } + } + } + public class X { + public Outer method1() { + return null; + } + public Outer.Inner.InnerInner method2() { + return null; + } + } + """; + ASTNode node = buildAST(contents, this.workingCopy); + assertNotNull("No node", node); + assertEquals("Not a compilation unit", ASTNode.COMPILATION_UNIT, node.getNodeType()); + CompilationUnit compilationUnit = (CompilationUnit) node; + assertProblemsSize(compilationUnit, 0); + + node = getASTNode(compilationUnit, 2, 0); + assertEquals("Not a method declaration", ASTNode.METHOD_DECLARATION, node.getNodeType()); + MethodDeclaration firstMethodDeclaration = (MethodDeclaration) node; + SimpleType firstSimpleType = (SimpleType) ((ParameterizedType) firstMethodDeclaration.getReturnType2()) + .getType(); + ITypeBinding firstSimpleTypeBinding = (ITypeBinding) firstSimpleType.getName().resolveBinding(); + assertEquals("Outer", firstSimpleTypeBinding.getQualifiedName()); + + node = getASTNode(compilationUnit, 2, 1); + assertEquals("Not a method declaration", ASTNode.METHOD_DECLARATION, node.getNodeType()); + MethodDeclaration secondMethodDeclaration = (MethodDeclaration) node; + SimpleType secondSimpleType = (SimpleType) // + ((ParameterizedType) // + ((QualifiedType) // + ((QualifiedType) // + ((ParameterizedType)secondMethodDeclaration.getReturnType2()).getType()) // + .getQualifier()) // + .getQualifier()) // + .getType(); + ITypeBinding secondSimpleTypeBinding = (ITypeBinding) secondSimpleType.getName().resolveBinding(); + assertEquals("Outer", secondSimpleTypeBinding.getQualifiedName()); + } + } diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java index a1c6084f3d4..0c86b838b11 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java @@ -1080,25 +1080,42 @@ synchronized ITypeBinding resolveTypeBindingForName(Name name) { return this.getTypeBinding(qualifiedTypeReference.resolvedType.leafComponentType()); } else { if (index >= 0) { - BlockScope internalScope = (BlockScope) this.astNodesToBlockScope.get(name); - Binding binding = null; - try { - if (internalScope == null) { - if (this.scope == null) return null; - binding = this.scope.getTypeOrPackage(CharOperation.subarray(qualifiedTypeReference.tokens, 0, index)); - } else { - binding = internalScope.getTypeOrPackage(CharOperation.subarray(qualifiedTypeReference.tokens, 0, index)); + Binding binding = qualifiedTypeReference.resolvedType; + for (int i = 0; i < (qualifiedTypeReference.tokens.length - index); i++) { + if (!(binding instanceof org.eclipse.jdt.internal.compiler.lookup.TypeBinding typeBinding)) { + binding = null; + break; + } + binding = typeBinding.enclosingType(); + if (binding == null) { + break; } - } catch (AbortCompilation e) { - // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=53357 } - if (binding instanceof org.eclipse.jdt.internal.compiler.lookup.PackageBinding) { - return null; - } else if (binding instanceof org.eclipse.jdt.internal.compiler.lookup.TypeBinding) { - // it is a type - return this.getTypeBinding((org.eclipse.jdt.internal.compiler.lookup.TypeBinding)binding); + if (binding != null) { + return this.getTypeBinding((org.eclipse.jdt.internal.compiler.lookup.TypeBinding) binding); } else { - return null; + BlockScope internalScope = (BlockScope) this.astNodesToBlockScope.get(name); + try { + if (internalScope == null) { + if (this.scope == null) + return null; + binding = this.scope.getTypeOrPackage( + CharOperation.subarray(qualifiedTypeReference.tokens, 0, index)); + } else { + binding = internalScope.getTypeOrPackage( + CharOperation.subarray(qualifiedTypeReference.tokens, 0, index)); + } + } catch (AbortCompilation e) { + // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=53357 + } + if (binding instanceof org.eclipse.jdt.internal.compiler.lookup.PackageBinding) { + return null; + } else if (binding instanceof org.eclipse.jdt.internal.compiler.lookup.TypeBinding) { + // it is a type + return this.getTypeBinding((org.eclipse.jdt.internal.compiler.lookup.TypeBinding) binding); + } else { + return null; + } } } } @@ -1313,25 +1330,42 @@ synchronized IBinding resolveName(Name name) { return this.getTypeBinding(qualifiedTypeReference.resolvedType.leafComponentType()); } else { if (index >= 0) { - BlockScope internalScope = (BlockScope) this.astNodesToBlockScope.get(name); - Binding binding = null; - try { - if (internalScope == null) { - if (this.scope == null) return null; - binding = this.scope.getTypeOrPackage(CharOperation.subarray(qualifiedTypeReference.tokens, 0, index)); - } else { - binding = internalScope.getTypeOrPackage(CharOperation.subarray(qualifiedTypeReference.tokens, 0, index)); + Binding binding = qualifiedTypeReference.resolvedType; + for (int i = 0; i < (qualifiedTypeReference.tokens.length - index); i++) { + if (!(binding instanceof org.eclipse.jdt.internal.compiler.lookup.TypeBinding typeBinding)) { + binding = null; + break; + } + binding = typeBinding.enclosingType(); + if (binding == null) { + break; } - } catch (AbortCompilation e) { - // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=53357 } - if (binding instanceof org.eclipse.jdt.internal.compiler.lookup.PackageBinding) { - return getPackageBinding((org.eclipse.jdt.internal.compiler.lookup.PackageBinding)binding); - } else if (binding instanceof org.eclipse.jdt.internal.compiler.lookup.TypeBinding) { - // it is a type + if (binding != null) { return this.getTypeBinding((org.eclipse.jdt.internal.compiler.lookup.TypeBinding)binding); } else { - return null; + BlockScope internalScope = (BlockScope) this.astNodesToBlockScope.get(name); + try { + if (internalScope == null) { + if (this.scope == null) + return null; + binding = this.scope.getTypeOrPackage( + CharOperation.subarray(qualifiedTypeReference.tokens, 0, index)); + } else { + binding = internalScope.getTypeOrPackage( + CharOperation.subarray(qualifiedTypeReference.tokens, 0, index)); + } + } catch (AbortCompilation e) { + // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=53357 + } + if (binding instanceof org.eclipse.jdt.internal.compiler.lookup.PackageBinding) { + return getPackageBinding((org.eclipse.jdt.internal.compiler.lookup.PackageBinding) binding); + } else if (binding instanceof org.eclipse.jdt.internal.compiler.lookup.TypeBinding) { + // it is a type + return this.getTypeBinding((org.eclipse.jdt.internal.compiler.lookup.TypeBinding) binding); + } else { + return null; + } } } }