diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTUtils.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTUtils.java index bf123b23b..7afd7613d 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTUtils.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTUtils.java @@ -452,6 +452,9 @@ public class ASTUtils { } public static boolean isAnyTypeInHierarchy(ITypeBinding binding, Collection typeFqns) { + if (typeFqns.contains(binding.isParameterizedType() ? binding.getBinaryName() : binding.getQualifiedName())) { + return true; + } for (Iterator itr = getSuperTypesFqNamesIterator(binding); itr.hasNext();) { String fqn = itr.next(); if (typeFqns.contains(fqn)) { @@ -463,15 +466,27 @@ public class ASTUtils { public static boolean areAllTypesInHierarchy(ITypeBinding binding, Collection typeFqns) { HashSet notFound = new HashSet<>(typeFqns); + notFound.remove(binding.isParameterizedType() ? binding.getBinaryName() : binding.getQualifiedName()); for (Iterator itr = getSuperTypesFqNamesIterator(binding); itr.hasNext() && !notFound.isEmpty();) { notFound.remove(itr.next()); } return notFound.isEmpty(); } + private static void enqueueSuperTypes(Queue q, ITypeBinding t) { + for (ITypeBinding b : t.getInterfaces()) { + if (b != null) { + q.add(b); + } + } + if (t.getSuperclass() != null) { + q.add(t.getSuperclass()); + } + } + public static Iterator getSuperTypesIterator(ITypeBinding binding) { final Queue q = new ArrayDeque<>(10); - q.add(binding); + enqueueSuperTypes(q, binding); return new Iterator() { @Override @@ -485,14 +500,7 @@ public class ASTUtils { if (t == null) { throw new NoSuchElementException(); } - for (ITypeBinding b : t.getInterfaces()) { - if (b != null) { - q.add(b); - } - } - if (t.getSuperclass() != null) { - q.add(t.getSuperclass()); - } + enqueueSuperTypes(q, t); return t; } diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/ASTUtilsTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/ASTUtilsTest.java index 698b3dcdd..3ba461337 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/ASTUtilsTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/ASTUtilsTest.java @@ -70,7 +70,7 @@ public class ASTUtilsTest { Iterator iter = ASTUtils.getSuperTypesIterator(type.resolveBinding()); assertNotNull(iter); - assertEquals("test.MySimpleMain", iter.next().getQualifiedName()); +// assertEquals("test.MySimpleMain", iter.next().getQualifiedName()); assertEquals("java.lang.Object", iter.next().getQualifiedName()); assertFalse(iter.hasNext()); }); @@ -116,7 +116,7 @@ public class ASTUtilsTest { Iterator iter = ASTUtils.getSuperTypesIterator(type.resolveBinding()); assertNotNull(iter); - assertEquals("test.MyComponent", iter.next().getQualifiedName()); +// assertEquals("test.MyComponent", iter.next().getQualifiedName()); assertEquals("test.MyInterface", iter.next().getQualifiedName()); assertEquals("test.MySuperclass", iter.next().getQualifiedName()); assertEquals("test.MySuperInterface", iter.next().getQualifiedName()); @@ -132,7 +132,7 @@ public class ASTUtilsTest { Iterator iter = ASTUtils.getSuperTypesFqNamesIterator(type.resolveBinding()); assertNotNull(iter); - assertEquals("test.MyComponent", iter.next()); +// assertEquals("test.MyComponent", iter.next()); assertEquals("test.MyInterface", iter.next()); assertEquals("test.MySuperclass", iter.next()); assertEquals("test.MySuperInterface", iter.next()); @@ -194,10 +194,10 @@ public class ASTUtilsTest { Iterator iter = ASTUtils.getSuperTypesFqNamesIterator(type.resolveBinding()); assertNotNull(iter); - assertEquals("test.Second", iter.next()); +// assertEquals("test.Second", iter.next()); assertEquals("test.TestInterface", iter.next()); assertEquals("test.Start", iter.next()); -// assertEquals("test.TestInterface", iter.next()); + assertEquals("test.TestInterface", iter.next()); assertEquals("java.lang.Object", iter.next()); assertFalse(iter.hasNext()); });