diff --git a/javaparser-core/src/main/java/com/github/javaparser/resolution/declarations/ResolvedReferenceTypeDeclaration.java b/javaparser-core/src/main/java/com/github/javaparser/resolution/declarations/ResolvedReferenceTypeDeclaration.java index fef3614abb..1e306489aa 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/resolution/declarations/ResolvedReferenceTypeDeclaration.java +++ b/javaparser-core/src/main/java/com/github/javaparser/resolution/declarations/ResolvedReferenceTypeDeclaration.java @@ -38,7 +38,7 @@ * @author Federico Tomassetti */ public interface ResolvedReferenceTypeDeclaration extends ResolvedTypeDeclaration, - ResolvedTypeParametrizable { + ResolvedTypeParametrizable { @Override default ResolvedReferenceTypeDeclaration asReferenceType() { @@ -50,14 +50,41 @@ default ResolvedReferenceTypeDeclaration asReferenceType() { /// /** - * The list of all the direct ancestors of the current declaration. - * Note that the ancestor can be parametrized types with values specified. For example: + * Resolves the types of all direct ancestors (i.e., the directly extended class and the directly implemented + * interfaces) and returns the list of ancestors as a list of resolved reference types. + *

+ * In case any ancestor cannot be resolved, an {@code UnsolvedSymbolException} is thrown. In order to obtain a list + * of only the resolvable direct ancestors, use {@link #getAncestors(boolean)} and pass the value {@code true}. + *

+ * Note that an ancestor can be parametrized types with values specified. For example: *

* class A implements Comparable<String> {} *

* In this case the ancestor is Comparable<String> + * + * @return The list of resolved ancestors. + * @throws UnsolvedSymbolException if some ancestor could not be resolved. + */ + default List getAncestors() { + return getAncestors(false); + } + + /** + * Resolves the types of all direct ancestors (i.e., the directly extended class and the directly implemented + * interfaces) and returns the list of ancestors as a list of resolved reference types. + *

+ * If {@code acceptIncompleteList} is {@code false}, then an {@code UnsolvedSymbolException} is thrown if any + * ancestor cannot be resolved. Otherwise, a list of only the resolvable direct ancestors is returned. + * + * @param acceptIncompleteList When set to {@code false}, this method throws an {@link UnsolvedSymbolException} if + * one or more ancestor could not be resolved. When set to {@code true}, this method + * does not throw an {@link UnsolvedSymbolException}, but the list of returned ancestors + * may be incomplete in case one or more ancestor could not be resolved. + * @return The list of resolved ancestors. + * @throws UnsolvedSymbolException if some ancestor could not be resolved and {@code acceptIncompleteList} is set to + * {@code false}. */ - List getAncestors(); + List getAncestors(boolean acceptIncompleteList); /** * The list of all the ancestors of the current declaration, direct and indirect. @@ -66,9 +93,9 @@ default ResolvedReferenceTypeDeclaration asReferenceType() { default List getAllAncestors() { List ancestors = new ArrayList<>(); // We want to avoid infinite recursion in case of Object having Object as ancestor - if (!(Object.class.getCanonicalName().equals(getQualifiedName()))) { + if (!(Object.class.getCanonicalName().equals(getQualifiedName()))) { for (ResolvedReferenceType ancestor : getAncestors()) { - ancestors.add(ancestor); + ancestors.add(ancestor); for (ResolvedReferenceType inheritedAncestor : ancestor.getAllAncestors()) { if (!ancestors.contains(inheritedAncestor)) { ancestors.add(inheritedAncestor); @@ -139,8 +166,8 @@ default boolean hasVisibleField(String name) { */ default List getVisibleFields() { return getAllFields().stream() - .filter(f -> f.declaringType().equals(this) || f.accessSpecifier() != AccessSpecifier.PRIVATE) - .collect(Collectors.toList()); + .filter(f -> f.declaringType().equals(this) || f.accessSpecifier() != AccessSpecifier.PRIVATE) + .collect(Collectors.toList()); } /** @@ -162,7 +189,7 @@ default List getAllStaticFields() { */ default List getDeclaredFields() { return getAllFields().stream().filter(it -> it.declaringType().getQualifiedName() - .equals(getQualifiedName())).collect(Collectors.toList()); + .equals(getQualifiedName())).collect(Collectors.toList()); } /// diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/JavaParserTypeDeclarationAdapter.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/JavaParserTypeDeclarationAdapter.java index 0e8b89bfbd..85de9487ec 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/JavaParserTypeDeclarationAdapter.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/JavaParserTypeDeclarationAdapter.java @@ -79,7 +79,7 @@ public SymbolReference solveType(String name, TypeSolve * @return A ResolvedTypeDeclaration matching the {@param name}, null otherwise */ private ResolvedTypeDeclaration checkAncestorsForType(String name, ResolvedReferenceTypeDeclaration declaration) { - for (ResolvedReferenceType ancestor : declaration.getAncestors()) { + for (ResolvedReferenceType ancestor : declaration.getAncestors(true)) { try { for (ResolvedTypeDeclaration internalTypeDeclaration : ancestor.getTypeDeclaration().internalTypes()) { boolean visible = true; @@ -112,7 +112,7 @@ public SymbolReference solveMethod(String name, List< .collect(Collectors.toList()); // We want to avoid infinite recursion in case of Object having Object as ancestor if (!Object.class.getCanonicalName().equals(typeDeclaration.getQualifiedName())) { - for (ResolvedReferenceType ancestor : typeDeclaration.getAncestors()) { + for (ResolvedReferenceType ancestor : typeDeclaration.getAncestors(true)) { // Avoid recursion on self if (typeDeclaration != ancestor.getTypeDeclaration()) { candidateMethods.addAll(ancestor.getAllMethodsVisibleToInheritors() diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserAnnotationDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserAnnotationDeclaration.java index 09f2ca4a83..457fc4183e 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserAnnotationDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserAnnotationDeclaration.java @@ -28,7 +28,7 @@ public JavaParserAnnotationDeclaration(AnnotationDeclaration wrappedNode, TypeSo } @Override - public List getAncestors() { + public List getAncestors(boolean acceptIncompleteList) { throw new UnsupportedOperationException(); } diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserAnonymousClassDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserAnonymousClassDeclaration.java index b1f4a67a69..bc48042e73 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserAnonymousClassDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserAnonymousClassDeclaration.java @@ -95,12 +95,12 @@ public AccessSpecifier accessSpecifier() { } @Override - public List getAncestors() { + public List getAncestors(boolean acceptIncompleteList) { return ImmutableList. builder() .add(getSuperClass()) - .addAll(superTypeDeclaration.asReferenceType().getAncestors()) + .addAll(superTypeDeclaration.asReferenceType().getAncestors(acceptIncompleteList)) .build(); } diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserClassDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserClassDeclaration.java index b5f5da98af..2015ef582a 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserClassDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserClassDeclaration.java @@ -269,30 +269,7 @@ public SymbolReference solveType(String name, TypeSolve return getContext().getParent().solveType(name, typeSolver); } - /** - * Resolves the type of all ancestors (i.e., the extended class and the implemented interfaces) and returns the list - * of ancestors as a list of resolved reference types. - * - * @return The list of resolved ancestors. - * @throws UnsolvedSymbolException if some ancestor could not be resolved. - */ @Override - public List getAncestors() { - return getAncestors(false); - } - - /** - * Resolves the type of all ancestors (i.e., the extended class and the implemented interfaces) and returns the list - * of ancestors as a list of resolved reference types. - * - * @param acceptIncompleteList When set to {@code false}, this method throws an {@link UnsolvedSymbolException} if - * one or more ancestor could not be resolved. When set to {@code true}, this method - * does not throw an {@link UnsolvedSymbolException}, but the list of returned ancestors - * may be incomplete in case one or more ancestor could not be resolved. - * @return The list of resolved ancestors. - * @throws UnsolvedSymbolException if some ancestor could not be resolved and {@code acceptIncompleteList} is set to - * {@code false}. - */ public List getAncestors(boolean acceptIncompleteList) { List ancestors = new ArrayList<>(); diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserEnumDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserEnumDeclaration.java index b0c1bf5d9b..f8a5fd6329 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserEnumDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserEnumDeclaration.java @@ -209,7 +209,7 @@ public List getAllFields() { } @Override - public List getAncestors() { + public List getAncestors(boolean acceptIncompleteList) { List ancestors = new ArrayList<>(); ResolvedReferenceType enumClass = ReflectionFactory.typeUsageFor(Enum.class, typeSolver).asReferenceType(); ResolvedTypeParameterDeclaration eTypeParameter = enumClass.getTypeDeclaration().getTypeParameters().get(0); @@ -218,7 +218,7 @@ public List getAncestors() { if (wrappedNode.getImplementedTypes() != null) { for (ClassOrInterfaceType implementedType : wrappedNode.getImplementedTypes()) { SymbolReference implementedDeclRef = new SymbolSolver(typeSolver).solveTypeInType(this, implementedType.getName().getId()); - if (!implementedDeclRef.isSolved()) { + if (!implementedDeclRef.isSolved() && !acceptIncompleteList) { throw new UnsolvedSymbolException(implementedType.getName().getId()); } ancestors.add(new ReferenceTypeImpl((ResolvedReferenceTypeDeclaration) implementedDeclRef.getCorrespondingDeclaration(), typeSolver)); diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserInterfaceDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserInterfaceDeclaration.java index e41bbd9fe4..b22c73c018 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserInterfaceDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserInterfaceDeclaration.java @@ -242,16 +242,30 @@ public SymbolReference solveType(String name, TypeSolve } @Override - public List getAncestors() { + public List getAncestors(boolean acceptIncompleteList) { List ancestors = new ArrayList<>(); if (wrappedNode.getExtendedTypes() != null) { for (ClassOrInterfaceType extended : wrappedNode.getExtendedTypes()) { - ancestors.add(toReferenceType(extended)); + try { + ancestors.add(toReferenceType(extended)); + } catch (UnsolvedSymbolException e) { + if (!acceptIncompleteList) { + // we only throw an exception if we require a complete list; otherwise, we attempt to continue gracefully + throw e; + } + } } } if (wrappedNode.getImplementedTypes() != null) { for (ClassOrInterfaceType implemented : wrappedNode.getImplementedTypes()) { - ancestors.add(toReferenceType(implemented)); + try { + ancestors.add(toReferenceType(implemented)); + } catch (UnsolvedSymbolException e) { + if (!acceptIncompleteList) { + // we only throw an exception if we require a complete list; otherwise, we attempt to continue gracefully + throw e; + } + } } } return ancestors; diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserTypeParameter.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserTypeParameter.java index 01f12e7fe5..c5493ba41b 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserTypeParameter.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserTypeParameter.java @@ -179,7 +179,7 @@ public List getAllFields() { } @Override - public List getAncestors() { + public List getAncestors(boolean acceptIncompleteList) { throw new UnsupportedOperationException(); } diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserTypeVariableDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserTypeVariableDeclaration.java index 185be2d5fd..4852c5fc17 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserTypeVariableDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserTypeVariableDeclaration.java @@ -115,7 +115,7 @@ public List getAllFields() { } @Override - public List getAncestors() { + public List getAncestors(boolean acceptIncompleteList) { throw new UnsupportedOperationException(); } diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistAnnotationDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistAnnotationDeclaration.java index 4435a876e1..a0d2fd6c5c 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistAnnotationDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistAnnotationDeclaration.java @@ -94,7 +94,7 @@ public boolean isAssignableBy(ResolvedReferenceTypeDeclaration other) { } @Override - public List getAncestors() { + public List getAncestors(boolean acceptIncompleteList) { throw new UnsupportedOperationException(); } diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistClassDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistClassDeclaration.java index 0fb5c68c6b..0c001e0fdc 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistClassDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistClassDeclaration.java @@ -168,12 +168,27 @@ private String getSuperclassFQN() { } @Override - public List getAncestors() { + public List getAncestors(boolean acceptIncompleteList) { List ancestors = new ArrayList<>(); - if (getSuperClass() != null) { - ancestors.add(getSuperClass()); + try { + ResolvedReferenceType superClass = getSuperClass(); + if (superClass != null) { + ancestors.add(superClass); + } + } catch (UnsolvedSymbolException e) { + if (!acceptIncompleteList) { + // we only throw an exception if we require a complete list; otherwise, we attempt to continue gracefully + throw e; + } + } + try { + ancestors.addAll(getInterfaces()); + } catch (UnsolvedSymbolException e) { + if (!acceptIncompleteList) { + // we only throw an exception if we require a complete list; otherwise, we attempt to continue gracefully + throw e; + } } - ancestors.addAll(getInterfaces()); return ancestors; } diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistEnumDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistEnumDeclaration.java index bf28b0d1c9..c9b504c2af 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistEnumDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistEnumDeclaration.java @@ -88,18 +88,32 @@ public String getQualifiedName() { } @Override - public List getAncestors() { + public List getAncestors(boolean acceptIncompleteList) { // Direct ancestors of an enum are java.lang.Enum and interfaces List ancestors = new ArrayList<>(); String superClassName = ctClass.getClassFile().getSuperclass(); if (superClassName != null) { - ancestors.add(new ReferenceTypeImpl(typeSolver.solveType(superClassName), typeSolver)); + try { + ancestors.add(new ReferenceTypeImpl(typeSolver.solveType(superClassName), typeSolver)); + } catch (UnsolvedSymbolException e) { + if (!acceptIncompleteList) { + // we only throw an exception if we require a complete list; otherwise, we attempt to continue gracefully + throw e; + } + } } for (String interfazeName : ctClass.getClassFile().getInterfaces()) { - ancestors.add(new ReferenceTypeImpl(typeSolver.solveType(interfazeName), typeSolver)); + try { + ancestors.add(new ReferenceTypeImpl(typeSolver.solveType(interfazeName), typeSolver)); + } catch (UnsolvedSymbolException e) { + if (!acceptIncompleteList) { + // we only throw an exception if we require a complete list; otherwise, we attempt to continue gracefully + throw e; + } + } } return ancestors; diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistInterfaceDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistInterfaceDeclaration.java index a4a9adfa87..a246765936 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistInterfaceDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistInterfaceDeclaration.java @@ -153,12 +153,19 @@ public boolean isAssignableBy(ResolvedReferenceTypeDeclaration other) { } @Override - public List getAncestors() { + public List getAncestors(boolean acceptIncompleteList) { List ancestors = new ArrayList<>(); try { for (CtClass interfaze : ctClass.getInterfaces()) { - ResolvedReferenceType superInterfaze = JavassistFactory.typeUsageFor(interfaze, typeSolver).asReferenceType(); - ancestors.add(superInterfaze); + try { + ResolvedReferenceType superInterfaze = JavassistFactory.typeUsageFor(interfaze, typeSolver).asReferenceType(); + ancestors.add(superInterfaze); + } catch (UnsolvedSymbolException e) { + if (!acceptIncompleteList) { + // we only throw an exception if we require a complete list; otherwise, we attempt to continue gracefully + throw e; + } + } } } catch (NotFoundException e) { throw new RuntimeException(e); diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionAnnotationDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionAnnotationDeclaration.java index a09fcce988..bf005403f7 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionAnnotationDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionAnnotationDeclaration.java @@ -129,7 +129,7 @@ public List getAllFields() { } @Override - public List getAncestors() { + public List getAncestors(boolean acceptIncompleteList) { throw new UnsupportedOperationException(); } diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionClassDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionClassDeclaration.java index b11bdc2056..d6705e80c0 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionClassDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionClassDeclaration.java @@ -87,7 +87,9 @@ public Set getDeclaredMethods() { } @Override - public List getAncestors() { + public List getAncestors(boolean acceptIncompleteList) { + // we do not attempt to perform any symbol solving when analyzing ancestors in the reflection model, so we can + // simply ignore the boolean parameter here; an UnsolvedSymbolException cannot occur return reflectionClassAdapter.getAncestors(); } diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionEnumDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionEnumDeclaration.java index f31067803d..0264ff8d90 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionEnumDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionEnumDeclaration.java @@ -106,7 +106,9 @@ public String getQualifiedName() { } @Override - public List getAncestors() { + public List getAncestors(boolean acceptIncompleteList) { + // we do not attempt to perform any symbol solving when analyzing ancestors in the reflection model, so we can + // simply ignore the boolean parameter here; an UnsolvedSymbolException cannot occur return reflectionClassAdapter.getAncestors(); } diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionInterfaceDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionInterfaceDeclaration.java index 41d8102b04..49201f6976 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionInterfaceDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionInterfaceDeclaration.java @@ -240,7 +240,9 @@ public SymbolReference solveSymbol(String na } @Override - public List getAncestors() { + public List getAncestors(boolean acceptIncompleteList) { + // we do not attempt to perform any symbol solving when analyzing ancestors in the reflection model, so we can + // simply ignore the boolean parameter here; an UnsolvedSymbolException cannot occur return reflectionClassAdapter.getAncestors(); } diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/DefaultPackageTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/DefaultPackageTest.java index 5fcead08fd..9f24d153dd 100644 --- a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/DefaultPackageTest.java +++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/DefaultPackageTest.java @@ -54,7 +54,7 @@ public String getName() { } @Override - public List getAncestors() { + public List getAncestors(boolean acceptIncompleteList) { throw new UnsupportedOperationException(); } diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/MethodsResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/MethodsResolutionTest.java index ea01bb533c..ad48b0ea60 100644 --- a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/MethodsResolutionTest.java +++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/MethodsResolutionTest.java @@ -16,6 +16,7 @@ package com.github.javaparser.symbolsolver.resolution; +import com.github.javaparser.JavaParser; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.MethodDeclaration; @@ -27,6 +28,7 @@ import com.github.javaparser.resolution.MethodUsage; import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration; import com.github.javaparser.resolution.types.ResolvedType; +import com.github.javaparser.symbolsolver.JavaSymbolSolver; import com.github.javaparser.symbolsolver.javaparser.Navigator; import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade; import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserAnonymousClassDeclaration; @@ -448,4 +450,23 @@ public void resolveMethodCallOfMethodInMemberInterfaceWithIdenticalNameOfAnother assertTrue(reference.isSolved()); assertEquals("X.A.bar()", reference.getCorrespondingDeclaration().getQualifiedSignature()); } + + @Test + public void resolveLocalMethodInClassExtendingUnknownClass() { + // configure symbol solver before parsing + JavaParser.getStaticConfiguration().setSymbolResolver(new JavaSymbolSolver(new ReflectionTypeSolver())); + + // parse compilation unit and get field access expression + CompilationUnit cu = parseSample("ClassExtendingUnknownClass"); + ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "ClassExtendingUnknownClass"); + MethodDeclaration method = Navigator.demandMethod(clazz, "foo"); + MethodCallExpr methodCallExpr = method.getBody().get().getStatements().get(0).asExpressionStmt() + .getExpression().asMethodCallExpr(); + + // resolve field access expression + ResolvedMethodDeclaration resolvedMethodDeclaration = methodCallExpr.resolve(); + + // check that the expected method declaration equals the resolved method declaration + assertEquals("ClassExtendingUnknownClass.bar(java.lang.String)", resolvedMethodDeclaration.getQualifiedSignature()); + } } diff --git a/javaparser-symbol-solver-testing/src/test/resources/ClassExtendingUnknownClass.java.txt b/javaparser-symbol-solver-testing/src/test/resources/ClassExtendingUnknownClass.java.txt index 74107808f0..1dc2533c45 100644 --- a/javaparser-symbol-solver-testing/src/test/resources/ClassExtendingUnknownClass.java.txt +++ b/javaparser-symbol-solver-testing/src/test/resources/ClassExtendingUnknownClass.java.txt @@ -11,4 +11,10 @@ public class ClassExtendingUnknownClass extends UnknownClass { public int getFoo2() { return this.foo; } + + public void foo(String s) { + bar(s); + } + + public void bar(String s) {} }