diff --git a/javaparser-core/src/main/java/com/github/javaparser/resolution/declarations/ResolvedClassDeclaration.java b/javaparser-core/src/main/java/com/github/javaparser/resolution/declarations/ResolvedClassDeclaration.java index 08a8d75a2b..2766b380ed 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/resolution/declarations/ResolvedClassDeclaration.java +++ b/javaparser-core/src/main/java/com/github/javaparser/resolution/declarations/ResolvedClassDeclaration.java @@ -80,6 +80,7 @@ default boolean isClass() { * List of constructors available for the class. * This list should also include the default constructor. */ + @Override List getConstructors(); } 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 1d239e45f2..fef3614abb 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 @@ -22,6 +22,7 @@ package com.github.javaparser.resolution.declarations; import com.github.javaparser.ast.AccessSpecifier; +import com.github.javaparser.ast.Node; import com.github.javaparser.resolution.MethodUsage; import com.github.javaparser.resolution.UnsolvedSymbolException; import com.github.javaparser.resolution.types.ResolvedReferenceType; @@ -244,4 +245,6 @@ default Optional findTypeParameter(String name } return Optional.empty(); } + + List getConstructors(); } diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/JavaSymbolSolver.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/JavaSymbolSolver.java index 1a69fb4071..a126bfd36e 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/JavaSymbolSolver.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/JavaSymbolSolver.java @@ -89,9 +89,9 @@ public T resolveDeclaration(Node node, Class resultClass) { } if (node instanceof ConstructorDeclaration) { ConstructorDeclaration constructorDeclaration = (ConstructorDeclaration) node; - ClassOrInterfaceDeclaration classOrInterfaceDeclaration = (ClassOrInterfaceDeclaration) node.getParentNode().get(); - ResolvedClassDeclaration resolvedClass = resolveDeclaration(classOrInterfaceDeclaration, ResolvedClassDeclaration.class).asClass(); - ResolvedConstructorDeclaration resolved = resolvedClass.getConstructors().stream().filter(c -> ((JavaParserConstructorDeclaration) c).getWrappedNode() == constructorDeclaration).findFirst().get(); + TypeDeclaration typeDeclaration = (TypeDeclaration) node.getParentNode().get(); + ResolvedReferenceTypeDeclaration resolvedTypeDeclaration = resolveDeclaration(typeDeclaration, ResolvedReferenceTypeDeclaration.class); + ResolvedConstructorDeclaration resolved = resolvedTypeDeclaration.getConstructors().stream().filter(c -> ((JavaParserConstructorDeclaration) c).getWrappedNode() == constructorDeclaration).findFirst().get(); if (resultClass.isInstance(resolved)) { return resultClass.cast(resolved); } diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/AstResolutionUtils.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/AstResolutionUtils.java index a2c1ca4750..1b519a9108 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/AstResolutionUtils.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/AstResolutionUtils.java @@ -19,14 +19,20 @@ import com.github.javaparser.ast.*; import com.github.javaparser.ast.expr.AnnotationExpr; import com.github.javaparser.ast.nodeTypes.NodeWithAnnotations; +import com.github.javaparser.ast.nodeTypes.NodeWithConstructors; import com.github.javaparser.resolution.UnsolvedSymbolException; +import com.github.javaparser.resolution.declarations.ResolvedConstructorDeclaration; +import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration; import com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration; import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory; import com.github.javaparser.symbolsolver.model.resolution.SymbolReference; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; +import com.google.common.collect.ImmutableList; import java.util.EnumSet; +import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; import static com.github.javaparser.symbolsolver.javaparser.Navigator.getParentNode; @@ -97,4 +103,18 @@ static boolean hasDirectlyAnnotation(NodeWithAnnotations nodeWithAnnotations, } return false; } + + static List getConstructors(NodeWithConstructors wrappedNode, + TypeSolver typeSolver, + N container) { + List declared = wrappedNode.getConstructors().stream() + .map(c -> new JavaParserConstructorDeclaration(container, c, typeSolver)) + .collect(Collectors.toList()); + if (declared.isEmpty()) { + // If there are no constructors insert the default constructor + return ImmutableList.of(new DefaultConstructorDeclaration(container)); + } else { + return declared; + } + } } diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/DefaultConstructorDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/DefaultConstructorDeclaration.java index fb0c6e3b70..f21fc89cbc 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/DefaultConstructorDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/DefaultConstructorDeclaration.java @@ -17,10 +17,7 @@ package com.github.javaparser.symbolsolver.javaparsermodel.declarations; import com.github.javaparser.ast.AccessSpecifier; -import com.github.javaparser.resolution.declarations.ResolvedClassDeclaration; -import com.github.javaparser.resolution.declarations.ResolvedConstructorDeclaration; -import com.github.javaparser.resolution.declarations.ResolvedParameterDeclaration; -import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration; +import com.github.javaparser.resolution.declarations.*; import com.github.javaparser.resolution.types.ResolvedType; import java.util.Collections; @@ -32,17 +29,17 @@ * * @author Federico Tomassetti */ -public class DefaultConstructorDeclaration implements ResolvedConstructorDeclaration { +public class DefaultConstructorDeclaration implements ResolvedConstructorDeclaration { - private ResolvedClassDeclaration classDeclaration; + private N declaringType; - DefaultConstructorDeclaration(ResolvedClassDeclaration classDeclaration) { - this.classDeclaration = classDeclaration; + DefaultConstructorDeclaration(N declaringType) { + this.declaringType = declaringType; } @Override - public ResolvedClassDeclaration declaringType() { - return classDeclaration; + public N declaringType() { + return declaringType; } @Override @@ -57,7 +54,7 @@ public ResolvedParameterDeclaration getParam(int i) { @Override public String getName() { - return classDeclaration.getName(); + return declaringType.getName(); } @Override 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 11d1f53a4f..0e8bae43af 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 @@ -8,6 +8,7 @@ import com.github.javaparser.symbolsolver.logic.AbstractTypeDeclaration; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; +import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.Set; @@ -98,4 +99,9 @@ public List getAnnotationMembers() { .map(m -> new JavaParserAnnotationMemberDeclaration((AnnotationMemberDeclaration)m, typeSolver)) .collect(Collectors.toList()); } + + @Override + public List getConstructors() { + return Collections.emptyList(); + } } 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 f06dbd741b..b5f5da98af 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 @@ -179,19 +179,7 @@ public List getInterfaces() { @Override public List getConstructors() { - List declared = new LinkedList<>(); - for (BodyDeclaration member : wrappedNode.getMembers()) { - if (member instanceof com.github.javaparser.ast.body.ConstructorDeclaration) { - com.github.javaparser.ast.body.ConstructorDeclaration constructorDeclaration = (com.github.javaparser.ast.body.ConstructorDeclaration) member; - declared.add(new JavaParserConstructorDeclaration(this, constructorDeclaration, typeSolver)); - } - } - if (declared.isEmpty()) { - // If there are no constructors insert the default constructor - return ImmutableList.of(new DefaultConstructorDeclaration(this)); - } else { - return declared; - } + return AstResolutionUtils.getConstructors(this.wrappedNode, typeSolver, this); } @Override diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserConstructorDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserConstructorDeclaration.java index ed6a14cc48..2d6985d065 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserConstructorDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserConstructorDeclaration.java @@ -17,10 +17,7 @@ package com.github.javaparser.symbolsolver.javaparsermodel.declarations; import com.github.javaparser.ast.AccessSpecifier; -import com.github.javaparser.resolution.declarations.ResolvedClassDeclaration; -import com.github.javaparser.resolution.declarations.ResolvedConstructorDeclaration; -import com.github.javaparser.resolution.declarations.ResolvedParameterDeclaration; -import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration; +import com.github.javaparser.resolution.declarations.*; import com.github.javaparser.resolution.types.ResolvedType; import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; @@ -31,22 +28,22 @@ /** * @author Federico Tomassetti */ -public class JavaParserConstructorDeclaration implements ResolvedConstructorDeclaration { +public class JavaParserConstructorDeclaration implements ResolvedConstructorDeclaration { - private ResolvedClassDeclaration classDeclaration; + private N declaringType; private com.github.javaparser.ast.body.ConstructorDeclaration wrappedNode; private TypeSolver typeSolver; - JavaParserConstructorDeclaration(ResolvedClassDeclaration classDeclaration, com.github.javaparser.ast.body.ConstructorDeclaration wrappedNode, + JavaParserConstructorDeclaration(N declaringType, com.github.javaparser.ast.body.ConstructorDeclaration wrappedNode, TypeSolver typeSolver) { - this.classDeclaration = classDeclaration; + this.declaringType = declaringType; this.wrappedNode = wrappedNode; this.typeSolver = typeSolver; } @Override - public ResolvedClassDeclaration declaringType() { - return classDeclaration; + public N declaringType() { + return declaringType; } @Override @@ -64,7 +61,7 @@ public ResolvedParameterDeclaration getParam(int i) { @Override public String getName() { - return this.classDeclaration.getName(); + return this.declaringType.getName(); } /** 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 efc9c14260..b0c1bf5d9b 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 @@ -348,4 +348,9 @@ public Set internalTypes() { public Optional containerType() { return javaParserTypeAdapter.containerType(); } + + @Override + public List getConstructors() { + return AstResolutionUtils.getConstructors(this.wrappedNode, typeSolver, this); + } } 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 d46d749492..c973f450ff 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 @@ -298,6 +298,11 @@ public Optional containerType() { return javaParserTypeAdapter.containerType(); } + @Override + public List getConstructors() { + return Collections.emptyList(); + } + /// /// Private methods /// 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 0b36bee81a..01f12e7fe5 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 @@ -220,4 +220,9 @@ public Optional containerType() { } return Optional.empty(); } + + @Override + public List getConstructors() { + return Collections.emptyList(); + } } 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 a9bb53a7f4..185be2d5fd 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 @@ -18,10 +18,7 @@ import com.github.javaparser.ast.Node; import com.github.javaparser.ast.type.TypeParameter; -import com.github.javaparser.resolution.declarations.ResolvedFieldDeclaration; -import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration; -import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration; -import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration; +import com.github.javaparser.resolution.declarations.*; import com.github.javaparser.resolution.types.ResolvedReferenceType; import com.github.javaparser.resolution.types.ResolvedType; import com.github.javaparser.symbolsolver.core.resolution.Context; @@ -184,4 +181,9 @@ public TypeParameter getWrappedNode() { public Optional containerType() { return asTypeParameter().containerType(); } + + @Override + public List getConstructors() { + return Collections.emptyList(); + } } 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 e111e48183..dfb2866493 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 @@ -261,4 +261,9 @@ public List getEnumConstants() { .map(f -> new JavassistEnumConstantDeclaration(f, typeSolver)) .collect(Collectors.toList()); } + + @Override + public List getConstructors() { + throw new UnsupportedOperationException("To be implemented"); + } } 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 db74e870f7..a4a9adfa87 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 @@ -273,4 +273,9 @@ public boolean hasInternalType(String name) { */ return this.internalTypes().stream().anyMatch(f -> f.getName().endsWith(name)); } + + @Override + public List getConstructors() { + return Collections.emptyList(); + } } 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 5cec41a7ad..e6430873c4 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 @@ -206,4 +206,9 @@ public Set internalTypes() { .map(ic -> ReflectionFactory.typeDeclarationFor(ic, typeSolver)) .collect(Collectors.toSet()); } + + @Override + public List getConstructors() { + throw new UnsupportedOperationException("To be implemented"); + } } 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 7453e23a64..41d8102b04 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 @@ -304,4 +304,9 @@ public List getTypeParameters() { public AccessSpecifier accessSpecifier() { return ReflectionFactory.modifiersToAccessLevel(this.clazz.getModifiers()); } + + @Override + public List getConstructors() { + return Collections.emptyList(); + } } diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/ConstructorsResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/ConstructorsResolutionTest.java index f4c7bbb301..89da1497ad 100644 --- a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/ConstructorsResolutionTest.java +++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/ConstructorsResolutionTest.java @@ -8,6 +8,7 @@ import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.expr.ObjectCreationExpr; import com.github.javaparser.resolution.declarations.ResolvedConstructorDeclaration; +import com.github.javaparser.resolution.types.ResolvedPrimitiveType; import com.github.javaparser.symbolsolver.JavaSymbolSolver; import com.github.javaparser.symbolsolver.javaparser.Navigator; import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade; @@ -107,6 +108,9 @@ public void solveEnumConstructor() { ResolvedConstructorDeclaration resolvedConstructor = constructor.resolve(); - // TODO: check if resolved constructor is the expected one. + assertEquals("ConstructorCallsEnum", resolvedConstructor.declaringType().getName()); + assertEquals(1, resolvedConstructor.getNumberOfParams()); + assertEquals("i", resolvedConstructor.getParam(0).getName()); + assertEquals(ResolvedPrimitiveType.INT, resolvedConstructor.getParam(0).getType()); } }