aboutsummaryrefslogtreecommitdiffstats
path: root/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2018-03-04 08:21:35 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2018-03-04 08:21:35 +0000
commitb4c1397d5df9370f6358d4f8e9efd27e0f67dec1 (patch)
tree6789ec288d344cf5fd5d057bcf1efc9545b1af28 /javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver
parent92d661a1d239131fb5c1e019a8f2ac7584d2d3f6 (diff)
parent1afe9e0652b9b53edade5aa276162abe27b32a67 (diff)
downloadplatform_external_javaparser-b4c1397d5df9370f6358d4f8e9efd27e0f67dec1.tar.gz
platform_external_javaparser-b4c1397d5df9370f6358d4f8e9efd27e0f67dec1.tar.bz2
platform_external_javaparser-b4c1397d5df9370f6358d4f8e9efd27e0f67dec1.zip
Snap for 4632767 from 1afe9e0652b9b53edade5aa276162abe27b32a67 to pi-releaseandroid-wear-9.0.0_r9android-wear-9.0.0_r8android-wear-9.0.0_r7android-wear-9.0.0_r6android-wear-9.0.0_r5android-wear-9.0.0_r4android-wear-9.0.0_r3android-wear-9.0.0_r23android-wear-9.0.0_r22android-wear-9.0.0_r21android-wear-9.0.0_r20android-wear-9.0.0_r2android-wear-9.0.0_r19android-wear-9.0.0_r18android-wear-9.0.0_r17android-wear-9.0.0_r16android-wear-9.0.0_r15android-wear-9.0.0_r14android-wear-9.0.0_r13android-wear-9.0.0_r12android-wear-9.0.0_r11android-wear-9.0.0_r10android-wear-9.0.0_r1android-vts-9.0_r9android-vts-9.0_r8android-vts-9.0_r7android-vts-9.0_r6android-vts-9.0_r5android-vts-9.0_r4android-vts-9.0_r14android-vts-9.0_r13android-vts-9.0_r12android-vts-9.0_r11android-vts-9.0_r10android-cts-9.0_r9android-cts-9.0_r8android-cts-9.0_r7android-cts-9.0_r6android-cts-9.0_r5android-cts-9.0_r4android-cts-9.0_r3android-cts-9.0_r2android-cts-9.0_r13android-cts-9.0_r12android-cts-9.0_r11android-cts-9.0_r10android-cts-9.0_r1android-9.0.0_r9android-9.0.0_r8android-9.0.0_r7android-9.0.0_r60android-9.0.0_r6android-9.0.0_r59android-9.0.0_r58android-9.0.0_r57android-9.0.0_r56android-9.0.0_r55android-9.0.0_r54android-9.0.0_r53android-9.0.0_r52android-9.0.0_r51android-9.0.0_r50android-9.0.0_r5android-9.0.0_r49android-9.0.0_r48android-9.0.0_r3android-9.0.0_r2android-9.0.0_r18android-9.0.0_r17android-9.0.0_r10android-9.0.0_r1security-pi-releasepie-vts-releasepie-security-releasepie-s2-releasepie-release-2pie-releasepie-r2-s2-releasepie-r2-s1-releasepie-r2-releasepie-platform-releasepie-gsipie-cuttlefish-testingpie-cts-release
Change-Id: Ibe65883e94ed5a7272dff3f100393987a1cf3da2
Diffstat (limited to 'javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver')
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/AbstractTest.java47
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/FindingAllFields.java57
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue113.java53
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue116.java52
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue128.java50
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue1364.java91
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue144.java70
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue156.java37
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue18.java47
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue185.java35
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue186.java50
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue200.java33
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue228.java31
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue232.java27
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue235.java51
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue241.java40
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue251.java31
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue276.java41
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue300.java63
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue314.java58
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue343.java60
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue347.java55
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue84.java47
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/JavaParserAPIIntegrationTest.java158
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/JavaSymbolSolverTest.java67
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/ConvertToUsageTest.java40
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/DifferentiateDotExpressionTest.java100
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserAnonymousClassDeclarationTest.java98
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserClassDeclarationTest.java894
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserEnumDeclarationTest.java826
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserInterfaceDeclarationTest.java826
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javassistmodel/Issue257.java47
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistClassDeclarationTest.java404
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistEnumDeclarationTest.java122
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistInterfaceDeclarationTest.java121
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/logic/FunctionInterfaceLogicTest.java51
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/logic/InferenceContextTest.java85
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/ArrayTypeTest.java184
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/NullTypeTest.java145
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/PrimitiveTypeTest.java331
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/ReferenceTypeTest.java600
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/TypeVariableUsageTest.java50
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/VoidTypeTest.java145
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/WildcardUsageTest.java422
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionClassDeclarationTest.java776
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionEnumDeclarationTest.java106
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionInterfaceDeclarationTest.java85
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionMethodDeclarationTest.java78
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AbstractResolutionTest.java46
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AnalyseJavaParserTest.java267
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AnalyseJavaSymbolSolver060Test.java349
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AnalyseNewJavaParserHelpersTest.java98
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AnalyseNewJavaParserTest.java328
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/ArrayExprTest.java26
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/ContextTest.java475
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/DefaultPackageTest.java158
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/EnumResolutionTest.java61
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/FieldsResolutionTest.java107
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/GenericsResolutionTest.java440
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/JavaParserFacadeResolutionTest.java163
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/LambdaResolutionTest.java177
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/MethodsResolutionLogicTest.java83
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/MethodsResolutionTest.java361
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/QualifiedNameResolutionTest.java47
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/StatementContextResolutionTest.java108
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverTest.java100
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverWithJavassistClassTest.java139
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverWithJavassistEnumTest.java106
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverWithJavassistInterfaceTest.java96
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/VariadicResolutionTest.java104
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/VarTypeTest.java62
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/ClassOrInterfaceDeclarationContextResolutionTest.java490
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/CompilationUnitContextResolutionTest.java236
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/EnumDeclarationContextResolutionTest.java116
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/FieldAccessContextResolutionTest.java51
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/LambdaExprContextResolutionTest.java112
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/MethodCallExprContextResolutionTest.java126
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/MethodContextResolutionTest.java59
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/declarations/JavaParserTypeParameterResolutionTest.java100
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/reflectionmodel/SymbolResolutionResolutionTest.java86
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typeinference/bounds/SameAsBoundTest.java32
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typeinference/bounds/SubtypeOfBoundTest.java86
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typeinference/constraintformulas/ConstraintFormulaTest.java70
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typesolvers/AarTypeSolverTest.java43
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typesolvers/JarTypeSolverTest.java41
-rw-r--r--javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/utils/SymbolSolverQuickSetupTest.java50
86 files changed, 13486 insertions, 0 deletions
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/AbstractTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/AbstractTest.java
new file mode 100644
index 000000000..911211b3c
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/AbstractTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver;
+
+import java.io.File;
+
+public abstract class AbstractTest {
+
+ protected static File adaptPath(File path) {
+ if (path.exists()) {
+ return path;
+ } else {
+ File underJavaParserCore = new File("javaparser-symbol-solver-testing/" + path.getPath());
+ if (underJavaParserCore.exists()) {
+ return underJavaParserCore;
+ } else {
+ throw new IllegalArgumentException("I cannot adapt the path " + path.getAbsolutePath());
+ }
+ }
+ }
+
+ protected static String adaptPath(String path) {
+ return adaptPath(new File(path)).getPath();
+ }
+
+ protected boolean isJava9() {
+ return System.getProperty("java.version").startsWith("9.");
+ }
+
+ protected boolean isJava8() {
+ return System.getProperty("java.version").startsWith("1.8.");
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/FindingAllFields.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/FindingAllFields.java
new file mode 100644
index 000000000..c0b70e992
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/FindingAllFields.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import com.google.common.collect.ImmutableSet;
+import org.junit.Test;
+
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+
+public class FindingAllFields extends AbstractResolutionTest {
+
+ @Test
+ public void findAllInheritedFields() {
+ CompilationUnit cu = parseSample("AClassWithFields");
+ ClassOrInterfaceDeclaration classC = Navigator.demandClass(cu, "C");
+ ResolvedReferenceTypeDeclaration typeDeclaration = JavaParserFacade.get(new ReflectionTypeSolver()).getTypeDeclaration(classC);
+ assertEquals(3, typeDeclaration.getAllFields().size());
+ assertEquals(ImmutableSet.of("a", "b", "c"),
+ typeDeclaration.getAllFields().stream().map(ResolvedDeclaration::getName).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void findAllInheritedFieldsAndGenerics() {
+ CompilationUnit cu = parseSample("AClassWithFieldsAndGenerics");
+ ClassOrInterfaceDeclaration classC = Navigator.demandClass(cu, "C");
+ ResolvedReferenceTypeDeclaration typeDeclaration = JavaParserFacade.get(new ReflectionTypeSolver()).getTypeDeclaration(classC);
+ assertEquals(3, typeDeclaration.getAllFields().size());
+ assertEquals(ImmutableSet.of("a", "b", "c"),
+ typeDeclaration.getAllFields().stream().map(ResolvedDeclaration::getName).collect(Collectors.toSet()));
+ assertEquals("java.util.List<java.lang.String>", typeDeclaration.getField("b").getType().describe());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue113.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue113.java
new file mode 100644
index 000000000..e57a2e1be
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue113.java
@@ -0,0 +1,53 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.resolution.types.ResolvedReferenceType;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserClassDeclaration;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+public class Issue113 extends AbstractTest {
+
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() throws IOException {
+ typeSolver = new CombinedTypeSolver(new ReflectionTypeSolver(), new JavaParserTypeSolver(adaptPath(new File("src/test/resources/issue113"))));
+ }
+
+ @Test
+ public void issue113providedCodeDoesNotCrash() throws FileNotFoundException {
+ String pathToSourceFile = adaptPath("src/test/resources/issue113/com/foo/Widget.java");
+ CompilationUnit cu = JavaParser.parse(new File(pathToSourceFile));
+
+ JavaParserFacade parserFacade = JavaParserFacade.get(typeSolver);
+ MethodDeclaration methodDeclaration = cu.findAll(MethodDeclaration.class).stream()
+ .filter(node -> node.getName().getIdentifier().equals("doSomething")).findAny().orElse(null);
+ methodDeclaration.findAll(MethodCallExpr.class).forEach(parserFacade::solve);
+ }
+
+ @Test
+ public void issue113superClassIsResolvedCorrectly() throws FileNotFoundException {
+ String pathToSourceFile = adaptPath("src/test/resources/issue113/com/foo/Widget.java");
+ CompilationUnit cu = JavaParser.parse(new File(pathToSourceFile));
+
+ JavaParserClassDeclaration jssExtendedWidget = new JavaParserClassDeclaration(cu.getClassByName("Widget").get(), typeSolver);
+ ResolvedReferenceType superClass = jssExtendedWidget.getSuperClass();
+ assertEquals("com.foo.base.Widget", superClass.getQualifiedName());
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue116.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue116.java
new file mode 100644
index 000000000..d8d346d1f
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue116.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class Issue116 extends AbstractResolutionTest {
+
+ @Test
+ public void arrayTypeIsNotPartOfTheTree() {
+ CompilationUnit cu = parseSample("Issue116");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "JavaTest");
+ MethodDeclaration methodDeclaration = Navigator.demandMethod(clazz, "foo");
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ com.github.javaparser.ast.type.Type typeNode = methodDeclaration.getParameters().get(0).getType();
+ ResolvedType type = javaParserFacade.convert(typeNode, typeNode);
+ assertEquals("java.lang.String[]", type.describe());
+
+ ExpressionStmt expressionStmt = (ExpressionStmt) methodDeclaration.getBody().get().getStatements().get(0);
+ Expression argRef = expressionStmt.getExpression();
+ assertEquals("java.lang.String[]", javaParserFacade.getType(argRef).describe());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue128.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue128.java
new file mode 100644
index 000000000..38f8b7ce3
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue128.java
@@ -0,0 +1,50 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class Issue128 extends AbstractResolutionTest {
+
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() throws IOException {
+ File srcDir = adaptPath(new File("src/test/resources/issue128"));
+ typeSolver = new CombinedTypeSolver(new ReflectionTypeSolver(), new JavaParserTypeSolver(srcDir));
+ }
+
+ @Test
+ public void verifyJavaTestClassIsSolved() {
+ typeSolver.solveType("foo.JavaTest");
+ }
+
+ @Test
+ public void loopOnStaticallyImportedType() {
+ CompilationUnit cu = parseSampleWithStandardExtension("issue128/foo/Issue128");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "JavaTest");
+ ExpressionStmt expressionStmt = (ExpressionStmt)clazz.getMethodsByName("test").get(0).getBody().get().getStatement(0);
+ MethodCallExpr methodCallExpr = (MethodCallExpr) expressionStmt.getExpression();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+
+ assertEquals(false, javaParserFacade.solve(methodCallExpr).isSolved());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue1364.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue1364.java
new file mode 100644
index 000000000..67086b0fd
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue1364.java
@@ -0,0 +1,91 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ParseResult;
+import com.github.javaparser.ParseStart;
+import com.github.javaparser.ParserConfiguration;
+import com.github.javaparser.Providers;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.expr.SimpleName;
+import com.github.javaparser.resolution.UnsolvedSymbolException;
+import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration;
+import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserClassDeclaration;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * @author Dominik Hardtke
+ * @since 02.02.2018
+ */
+public class Issue1364 extends AbstractResolutionTest {
+ private JavaParser javaParser;
+
+ @Before
+ public void setup() {
+ ClassOrInterfaceDeclaration fakeObject = new ClassOrInterfaceDeclaration();
+ fakeObject.setName(new SimpleName("java.lang.Object"));
+
+ TypeSolver typeSolver = new TypeSolver() {
+ @Override
+ public TypeSolver getParent() {
+ return null;
+ }
+
+ @Override
+ public void setParent(TypeSolver parent) {
+ }
+
+ @Override
+ public SymbolReference<ResolvedReferenceTypeDeclaration> tryToSolveType(String name) {
+ if ("java.lang.Object".equals(name)) {
+ // custom handling
+ return SymbolReference.solved(new JavaParserClassDeclaration(fakeObject, this));
+ }
+
+ return SymbolReference.unsolved(ResolvedReferenceTypeDeclaration.class);
+ }
+ };
+
+ ParserConfiguration config = new ParserConfiguration();
+ config.setSymbolResolver(new JavaSymbolSolver(typeSolver));
+ javaParser = new JavaParser(config);
+ }
+
+ @Test(timeout = 1000)
+ public void resolveSubClassOfObject() {
+ String code = String.join(System.lineSeparator(),
+ "package graph;",
+ "public class Vertex {",
+ " public static void main(String[] args) {",
+ " System.out.println();",
+ " }",
+ "}"
+ );
+
+ ParseResult<CompilationUnit> parseResult = javaParser.parse(ParseStart.COMPILATION_UNIT, Providers.provider(code));
+ assertTrue(parseResult.isSuccessful());
+ assertTrue(parseResult.getResult().isPresent());
+
+ List<MethodCallExpr> methodCallExprs = parseResult.getResult().get().findAll(MethodCallExpr.class);
+ assertEquals(1, methodCallExprs.size());
+
+ try {
+ methodCallExprs.get(0).calculateResolvedType();
+ fail("An UnsolvedSymbolException should be thrown");
+ } catch (UnsolvedSymbolException ignored) {
+ // all is fine if an UnsolvedSymbolException is thrown
+ }
+ }
+}
+
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue144.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue144.java
new file mode 100644
index 000000000..74c8ff7d1
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue144.java
@@ -0,0 +1,70 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.resolution.UnsolvedSymbolException;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+public class Issue144 extends AbstractResolutionTest {
+
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() throws IOException {
+ File srcDir = adaptPath(new File("src/test/resources/issue144"));
+ typeSolver = new JavaParserTypeSolver(srcDir);
+ }
+
+ @Test(expected = UnsolvedSymbolException.class)
+ public void issue144() {
+ CompilationUnit cu = parseSampleWithStandardExtension("issue144/HelloWorld");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "HelloWorld");
+ ExpressionStmt expressionStmt = (ExpressionStmt)clazz.getMethodsByName("main").get(0).getBody().get().getStatement(0);
+ MethodCallExpr methodCallExpr = (MethodCallExpr) expressionStmt.getExpression();
+ Expression firstParameter = methodCallExpr.getArgument(0);
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+
+ javaParserFacade.solve(firstParameter).isSolved();
+ }
+
+ @Test
+ public void issue144WithReflectionTypeSolver() {
+ CompilationUnit cu = parseSampleWithStandardExtension("issue144/HelloWorld");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "HelloWorld");
+ ExpressionStmt expressionStmt = (ExpressionStmt)clazz.getMethodsByName("main").get(0).getBody().get().getStatement(0);
+ MethodCallExpr methodCallExpr = (MethodCallExpr) expressionStmt.getExpression();
+ Expression firstParameter = methodCallExpr.getArgument(0);
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(new ReflectionTypeSolver(true));
+
+ assertEquals(true, javaParserFacade.solve(firstParameter).isSolved());
+ }
+
+ @Test
+ public void issue144WithCombinedTypeSolver() {
+ CompilationUnit cu = parseSampleWithStandardExtension("issue144/HelloWorld");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "HelloWorld");
+ ExpressionStmt expressionStmt = (ExpressionStmt)clazz.getMethodsByName("main").get(0).getBody().get().getStatement(0);
+ MethodCallExpr methodCallExpr = (MethodCallExpr) expressionStmt.getExpression();
+ Expression firstParameter = methodCallExpr.getArgument(0);
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(new CombinedTypeSolver(typeSolver, new ReflectionTypeSolver(true)));
+
+ assertEquals(true, javaParserFacade.solve(firstParameter).isSolved());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue156.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue156.java
new file mode 100644
index 000000000..b500af7c2
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue156.java
@@ -0,0 +1,37 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class Issue156 extends AbstractResolutionTest {
+
+ @Test
+ public void testFieldAccessThroughClassAndThis() {
+
+ CompilationUnit cu = parseSample("Issue156");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Issue156");
+ List<MethodCallExpr> methods = clazz.getChildNodes().get(2).getChildNodes().get(1).findAll(MethodCallExpr.class);
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+
+ assertEquals("char", javaParserFacade.getType(methods.get(0)).describe());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue18.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue18.java
new file mode 100644
index 000000000..af0dd18ac
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue18.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class Issue18 extends AbstractResolutionTest {
+
+ @Test
+ public void typeDeclarationSuperClassImplicitlyIncludeObject() {
+ CompilationUnit cu = parseSample("Issue18");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Foo");
+ MethodDeclaration methodDeclaration = Navigator.demandMethod(clazz, "bar");
+ ExpressionStmt expr = (ExpressionStmt) methodDeclaration.getBody().get().getStatements().get(1);
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ ResolvedType type = javaParserFacade.getType(expr.getExpression());
+ assertEquals("java.lang.Object", type.describe());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue185.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue185.java
new file mode 100644
index 000000000..c0ad0b11b
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue185.java
@@ -0,0 +1,35 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+
+
+public class Issue185 extends AbstractResolutionTest {
+
+ @Test
+ public void testIssue() throws FileNotFoundException {
+ File src = adaptPath(new File("src/test/resources/recursion-issue"));
+ CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
+ combinedTypeSolver.add(new JavaParserTypeSolver(src));
+ combinedTypeSolver.add(new ReflectionTypeSolver());
+ CompilationUnit agendaCu = JavaParser.parse(adaptPath(new File("src/test/resources/recursion-issue/Usage.java")));
+ MethodCallExpr foo = Navigator.findMethodCall(agendaCu, "foo").get();
+ assertNotNull(foo);
+ JavaParserFacade.get(combinedTypeSolver).getType(foo);
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue186.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue186.java
new file mode 100644
index 000000000..2590e9ec5
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue186.java
@@ -0,0 +1,50 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.LambdaExpr;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class Issue186 extends AbstractResolutionTest {
+
+ @Test
+ public void lambdaFlatMapIssue() {
+ CompilationUnit cu = parseSample("Issue186");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "JavaTest");
+ MethodDeclaration methodDeclaration = Navigator.demandMethod(clazz, "foo");
+ MethodCallExpr methodCallExpr = Navigator.findMethodCall(methodDeclaration, "flatMap").get();
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ assertEquals("java.util.stream.Stream<java.lang.String>", javaParserFacade.getType(methodCallExpr).describe());
+
+ }
+
+ @Test
+ public void lambdaPrimitivesIssue() {
+ CompilationUnit cu = parseSample("Issue186");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "JavaTest");
+ MethodDeclaration methodDeclaration = Navigator.demandMethod(clazz, "bar");
+ List<LambdaExpr> lambdas = methodDeclaration.findAll(LambdaExpr.class);
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ assertEquals("java.util.function.Predicate<? super java.lang.String>", javaParserFacade.getType(lambdas.get(0)).describe());
+ assertEquals("java.util.function.Function<? super java.lang.String, ? extends java.lang.Integer>", javaParserFacade.getType(lambdas.get(1)).describe());
+ assertEquals("java.util.function.Predicate<? super java.lang.Integer>", javaParserFacade.getType(lambdas.get(2)).describe());
+
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue200.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue200.java
new file mode 100644
index 000000000..ff3598717
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue200.java
@@ -0,0 +1,33 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.ast.stmt.ReturnStmt;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class Issue200 extends AbstractResolutionTest {
+
+ @Test
+ public void issue200() {
+ CompilationUnit cu = parseSample("Issue200");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "JavaTest");
+ MethodDeclaration methodDeclaration = Navigator.demandMethod(clazz, "foo");
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ List<ReturnStmt> nodesByType = methodDeclaration.findAll(ReturnStmt.class);
+ assertEquals("java.util.stream.Stream<JavaTest.Solved>", javaParserFacade.getType((nodesByType.get(0)).getExpression().get()).describe());
+ }
+} \ No newline at end of file
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue228.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue228.java
new file mode 100644
index 000000000..7ed5bdbbb
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue228.java
@@ -0,0 +1,31 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.resolution.MethodUsage;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+public class Issue228 extends AbstractResolutionTest{
+
+ @Test
+ public void testSolvingMethodWitPrimitiveParameterTypeAsUsage() {
+ String code =
+ "class Test { "
+ + " long l = call(1); "
+ + " long call(final long i) { "
+ + " return i; "
+ + " }"
+ + "}";
+ CompilationUnit cu = JavaParser.parse(code);
+ MethodCallExpr methodCall = cu.findAll(MethodCallExpr.class).get(0);
+ JavaParserFacade parserFacade = JavaParserFacade.get(new ReflectionTypeSolver());
+ MethodUsage solvedCall = parserFacade.solveMethodAsUsage(methodCall);
+ assertEquals("long", solvedCall.getParamType(0).describe());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue232.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue232.java
new file mode 100644
index 000000000..cb4550d7e
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue232.java
@@ -0,0 +1,27 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration;
+import com.github.javaparser.symbolsolver.core.resolution.Context;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+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.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+public class Issue232 extends AbstractResolutionTest {
+ @Test
+ public void issue232() {
+ CompilationUnit cu = parseSample("Issue232");
+ ClassOrInterfaceDeclaration cls = Navigator.demandClassOrInterface(cu, "OfDouble");
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ Context context = JavaParserFactory.getContext(cls, typeSolver);
+ SymbolReference<ResolvedTypeDeclaration> reference = context.solveType("OfPrimitive<Double, DoubleConsumer, OfDouble>", typeSolver);
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue235.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue235.java
new file mode 100644
index 000000000..0e4d1aa9f
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue235.java
@@ -0,0 +1,51 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.ObjectCreationExpr;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+@RunWith(Parameterized.class)
+public class Issue235 extends AbstractResolutionTest{
+ private final String method;
+
+ public Issue235(String method) {
+ this.method = method;
+ }
+
+ @Parameterized.Parameters(name = "{0}")
+ public static Collection<String> data() throws Exception {
+ return Arrays.asList(
+ "new_Bar_Baz_direct",
+ "new_Bar_Baz",
+ "new_Bar",
+ "new_Foo_Bar"
+ );
+ }
+
+ @Test
+ public void issue235() {
+ CompilationUnit cu = parseSample("Issue235");
+ ClassOrInterfaceDeclaration cls = Navigator.demandClassOrInterface(cu, "Foo");
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ MethodDeclaration m = Navigator.demandMethod(cls, this.method);
+ ExpressionStmt stmt = (ExpressionStmt) m.getBody().get().getStatements().get(0);
+ ObjectCreationExpr expression = (ObjectCreationExpr) stmt.getExpression();
+ Assert.assertNotNull(javaParserFacade.convertToUsage(expression.getType()));
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue241.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue241.java
new file mode 100644
index 000000000..9b42314a6
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue241.java
@@ -0,0 +1,40 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.VariableDeclarator;
+import com.github.javaparser.ast.type.Type;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+
+public class Issue241 extends AbstractResolutionTest{
+
+ @Test
+ public void testSolveStaticallyImportedMemberType() {
+ File src = adaptPath(new File("src/test/resources"));
+ TypeSolver typeSolver = new CombinedTypeSolver(new ReflectionTypeSolver(), new JavaParserTypeSolver(src));
+
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+
+ CompilationUnit cu = parseSample("Issue241");
+ ClassOrInterfaceDeclaration cls = Navigator.demandClassOrInterface(cu, "Main");
+ VariableDeclarator v = Navigator.demandVariableDeclaration(cls, "foo").get();
+
+ Type t = v.getType();
+ ResolvedType t2 = javaParserFacade.convert(t, t);
+ String typeName = t2.asReferenceType().getQualifiedName();
+
+ assertEquals("issue241.TypeWithMemberType.MemberInterface", typeName);
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue251.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue251.java
new file mode 100644
index 000000000..d8dc0a7c4
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue251.java
@@ -0,0 +1,31 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class Issue251 extends AbstractResolutionTest{
+
+ @Test
+ public void testSolveStaticallyImportedMemberType() {
+ CompilationUnit cu = parseSample("Issue251");
+ ClassOrInterfaceDeclaration cls = Navigator.demandClassOrInterface(cu, "Main");
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ MethodDeclaration m = Navigator.demandMethod(cls, "bar");
+ ExpressionStmt stmt = (ExpressionStmt) m.getBody().get().getStatements().get(1);
+ MethodCallExpr expression = (MethodCallExpr) stmt.getExpression();
+ Assert.assertNotNull(javaParserFacade.solve(expression));
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue276.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue276.java
new file mode 100644
index 000000000..6baaab018
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue276.java
@@ -0,0 +1,41 @@
+package com.github.javaparser.symbolsolver;
+
+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;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.contexts.MethodContext;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class Issue276 extends AbstractResolutionTest{
+
+ @Test
+ public void testSolveStaticallyImportedMemberType() throws FileNotFoundException {
+ CompilationUnit cu = JavaParser.parse(new File(adaptPath("src/test/resources/issue276/foo/C.java")));
+ ClassOrInterfaceDeclaration cls = Navigator.demandClassOrInterface(cu, "C");
+ TypeSolver typeSolver = new CombinedTypeSolver(
+ new ReflectionTypeSolver(),
+ new JavaParserTypeSolver(adaptPath(new File("src/test/resources/issue276"))));
+ List<MethodDeclaration> methods = cls.findAll(MethodDeclaration.class);
+ boolean isSolved = false;
+ for (MethodDeclaration method: methods) {
+ if (method.getNameAsString().equals("overrideMe")) {
+ MethodContext context = new MethodContext(method, typeSolver);
+ isSolved = context.solveType("FindMeIfYouCan", typeSolver).isSolved();
+ }
+ }
+ Assert.assertTrue(isSolved);
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue300.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue300.java
new file mode 100644
index 000000000..da19b8d5a
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue300.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.FieldAccessExpr;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+import java.io.File;
+import java.io.FileNotFoundException;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class Issue300 extends AbstractResolutionTest {
+
+ @Test
+ public void fieldAccessIssue() throws ParseException, FileNotFoundException {
+ String pathToSourceFile = adaptPath("src/test/resources/issue300/Issue300.java");
+ CompilationUnit cu = JavaParser.parse(new File(pathToSourceFile));
+
+ final FieldAccessExpr fieldAccess = Navigator.findNodeOfGivenClass(cu, FieldAccessExpr.class);
+ assertNotNull(fieldAccess);
+
+ TypeSolver typeSolver = new CombinedTypeSolver(
+ new ReflectionTypeSolver(),
+ new JavaParserTypeSolver(adaptPath(new File("src/test/resources/issue300"))));
+ final JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ final SymbolReference<? extends ResolvedValueDeclaration> ref = javaParserFacade.solve(fieldAccess);
+ assertEquals(ResolvedPrimitiveType.INT, ref.getCorrespondingDeclaration().getType().asPrimitive());
+ }
+}
+
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue314.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue314.java
new file mode 100644
index 000000000..b20ff7914
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue314.java
@@ -0,0 +1,58 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.expr.*;
+import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.FileNotFoundException;
+
+import static org.junit.Assert.assertEquals;
+
+public class Issue314 extends AbstractResolutionTest{
+
+ private TypeSolver typeResolver;
+ private JavaParserFacade javaParserFacade;
+
+ private ResolvedType getExpressionType(TypeSolver typeSolver, Expression expression) {
+ return JavaParserFacade.get(typeSolver).getType(expression);
+ }
+
+ @Before
+ public void setup() {
+ typeResolver = new ReflectionTypeSolver();
+ javaParserFacade = JavaParserFacade.get(typeResolver);
+ }
+
+ @Test
+ public void resolveReferenceToFieldInheritedByInterface() {
+ String code = "package foo.bar;\n"+
+ "interface A {\n" +
+ " int a = 0;\n" +
+ " }\n" +
+ " \n" +
+ " class B implements A {\n" +
+ " int getA() {\n" +
+ " return a;\n" +
+ " }\n" +
+ " }";
+ CompilationUnit cu = JavaParser.parse(code);
+ NameExpr refToA = Navigator.findNameExpression(Navigator.demandClass(cu, "B"), "a").get();
+ SymbolReference<? extends ResolvedValueDeclaration> symbolReference = javaParserFacade.solve(refToA);
+ assertEquals(true, symbolReference.isSolved());
+ assertEquals(true, symbolReference.getCorrespondingDeclaration().isField());
+ assertEquals("a", symbolReference.getCorrespondingDeclaration().getName());
+ }
+
+
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue343.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue343.java
new file mode 100644
index 000000000..3c34c6a59
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue343.java
@@ -0,0 +1,60 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ast.expr.*;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class Issue343 extends AbstractResolutionTest{
+
+ private TypeSolver typeResolver;
+ private JavaParserFacade javaParserFacade;
+
+ private ResolvedType getExpressionType(TypeSolver typeSolver, Expression expression) {
+ return JavaParserFacade.get(typeSolver).getType(expression);
+ }
+
+ @Before
+ public void setup() {
+ typeResolver = new ReflectionTypeSolver();
+ javaParserFacade = JavaParserFacade.get(typeResolver);
+ }
+
+ @Test
+ public void resolveStringLiteralOutsideAST() {
+ assertEquals(javaParserFacade.classToResolvedType(String.class), getExpressionType(typeResolver, new StringLiteralExpr("")));
+ }
+
+ @Test
+ public void resolveIntegerLiteralOutsideAST() {
+ assertEquals(javaParserFacade.classToResolvedType(int.class), getExpressionType(typeResolver, new IntegerLiteralExpr(2)));
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void toResolveDoubleWeNeedTheAST() {
+ getExpressionType(typeResolver, JavaParser.parseExpression("new Double[]{2.0d, 3.0d}[1]"));
+ }
+
+
+ @Test(expected = IllegalStateException.class)
+ public void toResolveFloatWeNeedTheAST() {
+ getExpressionType(typeResolver, JavaParser.parseExpression("new Float[]{2.0d, 3.0d}"));
+ }
+
+ @Test
+ public void resolveMethodCallOnStringLiteralOutsideAST() {
+ assertEquals(javaParserFacade.classToResolvedType(int.class), getExpressionType(typeResolver, new MethodCallExpr(new StringLiteralExpr("hello"), "length")));
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void resolveLocaleOutsideAST() {
+ getExpressionType(typeResolver, new FieldAccessExpr(new NameExpr("Locale"), "US"));
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue347.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue347.java
new file mode 100644
index 000000000..88755be23
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue347.java
@@ -0,0 +1,55 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.FieldDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.javaparsermodel.contexts.MethodContext;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class Issue347 extends AbstractResolutionTest{
+
+ private TypeSolver typeSolver;
+ private JavaParserFacade javaParserFacade;
+
+ @Before
+ public void setup() {
+ typeSolver = new ReflectionTypeSolver();
+ javaParserFacade = JavaParserFacade.get(typeSolver);
+ }
+
+ @Test
+ public void resolvingReferenceToEnumDeclarationInSameFile() {
+ String code = "package foo.bar;\nenum Foo {\n" +
+ " FOO_A, FOO_B\n" +
+ "}\n" +
+ "\n" +
+ "class UsingFoo {\n" +
+ " Foo myFooField;\n" +
+ "}";
+ CompilationUnit cu = JavaParser.parse(code);
+ FieldDeclaration fieldDeclaration = Navigator.findNodeOfGivenClass(cu, FieldDeclaration.class);
+ ResolvedType fieldType = javaParserFacade.getType(fieldDeclaration);
+ assertEquals(true, fieldType.isReferenceType());
+ assertEquals(true, fieldType.asReferenceType().getTypeDeclaration().isEnum());
+ assertEquals("foo.bar.Foo", fieldType.asReferenceType().getQualifiedName());
+ }
+}
+
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue84.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue84.java
new file mode 100644
index 000000000..ddb920b3f
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue84.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class Issue84 extends AbstractResolutionTest {
+
+ @Test
+ public void variadicIssue() {
+ CompilationUnit cu = parseSample("Issue84");
+ final MethodCallExpr methodCall = Navigator.findMethodCall(cu, "variadicMethod").get();
+
+ final JavaParserFacade javaParserFacade = JavaParserFacade.get(new ReflectionTypeSolver());
+ final ResolvedType type = javaParserFacade.getType(methodCall);
+ assertEquals(String.class.getCanonicalName(), type.asReferenceType().getQualifiedName());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/JavaParserAPIIntegrationTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/JavaParserAPIIntegrationTest.java
new file mode 100644
index 000000000..eb3072265
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/JavaParserAPIIntegrationTest.java
@@ -0,0 +1,158 @@
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ParseStart;
+import com.github.javaparser.ParserConfiguration;
+import com.github.javaparser.StreamProvider;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.*;
+import com.github.javaparser.resolution.declarations.*;
+import com.github.javaparser.resolution.types.ResolvedReferenceType;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import com.google.common.collect.ImmutableList;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class JavaParserAPIIntegrationTest extends AbstractTest {
+
+ private TypeSolver typeSolver;
+ private ResolvedReferenceType string;
+ private ResolvedReferenceType listOfBoolean;
+
+ @Before
+ public void setup() {
+ File src = adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-core"));
+ CombinedTypeSolver combinedTypeSolverNewCode = new CombinedTypeSolver();
+ combinedTypeSolverNewCode.add(new ReflectionTypeSolver());
+ combinedTypeSolverNewCode.add(new JavaParserTypeSolver(src));
+ combinedTypeSolverNewCode.add(new JavaParserTypeSolver(adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-generated-sources"))));
+ typeSolver = combinedTypeSolverNewCode;
+
+ TypeSolver ts = new ReflectionTypeSolver();
+ string = new ReferenceTypeImpl(ts.solveType(String.class.getCanonicalName()), ts);
+ ResolvedReferenceType booleanC = new ReferenceTypeImpl(ts.solveType(Boolean.class.getCanonicalName()), ts);
+ listOfBoolean = new ReferenceTypeImpl(ts.solveType(List.class.getCanonicalName()), ImmutableList.of(booleanC), ts);
+ }
+
+ @Test
+ public void annotationDeclarationResolve() throws IOException {
+ File f = adaptPath(new File("src/test/resources/Annotations.java.txt"));
+ CompilationUnit cu = parseWithSymbolResolution(f);
+ AnnotationDeclaration declaration = (AnnotationDeclaration)cu.getType(0);
+ assertEquals("MyAnnotation", declaration.getNameAsString());
+ ResolvedAnnotationDeclaration resolvedDeclaration = declaration.resolve();
+ }
+
+ @Test
+ public void annotationMemberDeclarationResolve() throws IOException {
+ File f = adaptPath(new File("src/test/resources/Annotations.java.txt"));
+ ParserConfiguration parserConfiguration = new ParserConfiguration();
+ parserConfiguration.setSymbolResolver(new JavaSymbolSolver(typeSolver));
+ CompilationUnit cu = new JavaParser(parserConfiguration).parse(ParseStart.COMPILATION_UNIT, new StreamProvider(new FileInputStream(f))).getResult().get();
+ AnnotationDeclaration declaration = (AnnotationDeclaration)cu.getType(2);
+ assertEquals("MyAnnotationWithFields", declaration.getNameAsString());
+ AnnotationMemberDeclaration memberDeclaration = (AnnotationMemberDeclaration)declaration.getMember(0);
+ ResolvedAnnotationMemberDeclaration resolvedDeclaration = memberDeclaration.resolve();
+ }
+
+ @Test
+ public void classDeclarationResolve() throws IOException {
+ File f = adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-core/com/github/javaparser/ast/CompilationUnit.java"));
+ CompilationUnit cu = parseWithSymbolResolution(f);
+ ClassOrInterfaceDeclaration declaration = (ClassOrInterfaceDeclaration)cu.getType(0);
+ declaration.resolve();
+ }
+
+ @Test
+ public void interfaceDeclarationResolve() throws IOException {
+ File f = adaptPath(new File("src/test/resources/MethodTypeParams.java.txt"));
+ CompilationUnit cu = parseWithSymbolResolution(f);
+ ClassOrInterfaceDeclaration declaration = (ClassOrInterfaceDeclaration)cu.getType(1);
+ assertEquals("VoidVisitor", declaration.getNameAsString());
+ assertEquals(true, declaration.isInterface());
+ declaration.resolve();
+ }
+
+ private CompilationUnit parseWithSymbolResolution(File f) throws IOException {
+ ParserConfiguration parserConfiguration = new ParserConfiguration();
+ parserConfiguration.setSymbolResolver(new JavaSymbolSolver(typeSolver));
+ return new JavaParser(parserConfiguration).parse(ParseStart.COMPILATION_UNIT, new StreamProvider(new FileInputStream(f))).getResult().get();
+ }
+
+ @Test
+ public void constructorDeclarationResolve() throws IOException {
+ File f = adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-core/com/github/javaparser/ast/CompilationUnit.java"));
+ CompilationUnit cu = parseWithSymbolResolution(f);
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = (ClassOrInterfaceDeclaration)cu.getType(0);
+ ConstructorDeclaration constructorDeclaration = classOrInterfaceDeclaration.getDefaultConstructor().get();
+ ResolvedConstructorDeclaration resolvedConstructorDeclaration = constructorDeclaration.resolve();
+ }
+ @Test
+ public void enumDeclarationResolve() throws IOException {
+ File f = adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-core/com/github/javaparser/ast/AccessSpecifier.java"));
+ CompilationUnit cu = parseWithSymbolResolution(f);
+ EnumDeclaration declaration = (EnumDeclaration) cu.getType(0);
+ assertEquals("AccessSpecifier", declaration.getNameAsString());
+ ResolvedEnumDeclaration resolvedDeclaration = declaration.resolve();
+ }
+
+ @Test
+ public void enumConstantDeclarationResolve() throws IOException {
+ File f = adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-core/com/github/javaparser/ast/AccessSpecifier.java"));
+ CompilationUnit cu = parseWithSymbolResolution(f);
+ EnumDeclaration enumDeclaration = (EnumDeclaration) cu.getType(0);
+ assertEquals("AccessSpecifier", enumDeclaration.getNameAsString());
+ EnumConstantDeclaration declaration = enumDeclaration.getEntry(0);
+ assertEquals("PUBLIC", declaration.getNameAsString());
+ ResolvedEnumConstantDeclaration resolvedDeclaration = declaration.resolve();
+ }
+
+ @Test
+ public void fieldDeclarationResolve() throws IOException {
+ File f = adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-core/com/github/javaparser/ast/CompilationUnit.java"));
+ CompilationUnit cu = parseWithSymbolResolution(f);
+ ClassOrInterfaceDeclaration classDeclaration = (ClassOrInterfaceDeclaration) cu.getType(0);
+ assertEquals("CompilationUnit", classDeclaration.getNameAsString());
+ FieldDeclaration declaration = classDeclaration.getFields().get(0);
+ ResolvedFieldDeclaration resolvedDeclaration = declaration.resolve();
+ }
+
+ // TODO make VariableDeclarator resolvable
+
+ @Test
+ public void methodDeclarationResolve() throws IOException {
+ File f = adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-core/com/github/javaparser/ast/CompilationUnit.java"));
+ CompilationUnit cu = parseWithSymbolResolution(f);
+ ClassOrInterfaceDeclaration classDeclaration = (ClassOrInterfaceDeclaration) cu.getType(0);
+ assertEquals("CompilationUnit", classDeclaration.getNameAsString());
+ MethodDeclaration declaration = classDeclaration.getMethodsByName("getComments").get(0);
+ ResolvedMethodDeclaration resolvedDeclaration = declaration.resolve();
+ assertEquals("getComments", resolvedDeclaration.getName());
+ assertEquals(0, resolvedDeclaration.getNumberOfParams());
+ }
+
+ @Test
+ public void parameterDeclarationResolve() throws IOException {
+ File f = adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-core/com/github/javaparser/ast/CompilationUnit.java"));
+ ParserConfiguration parserConfiguration = new ParserConfiguration();
+ parserConfiguration.setSymbolResolver(new JavaSymbolSolver(typeSolver));
+ CompilationUnit cu = new JavaParser(parserConfiguration).parse(ParseStart.COMPILATION_UNIT, new StreamProvider(new FileInputStream(f))).getResult().get();
+ ClassOrInterfaceDeclaration classDeclaration = (ClassOrInterfaceDeclaration) cu.getType(0);
+ assertEquals("CompilationUnit", classDeclaration.getNameAsString());
+ MethodDeclaration methodDeclaration = classDeclaration.getMethodsByName("setComments").get(0);
+ Parameter declaration = methodDeclaration.getParameter(0);
+ ResolvedParameterDeclaration resolvedDeclaration = declaration.resolve();
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/JavaSymbolSolverTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/JavaSymbolSolverTest.java
new file mode 100644
index 000000000..998a90451
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/JavaSymbolSolverTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import com.google.common.collect.ImmutableSet;
+import org.junit.Test;
+
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+
+public class JavaSymbolSolverTest extends AbstractResolutionTest {
+
+ @Test
+ public void resolveMethodDeclaration() {
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+
+ CompilationUnit cu = parseSample("SymbolResolverExample");
+ new JavaSymbolSolver(typeSolver).inject(cu);
+
+ MethodDeclaration methodDeclaration = cu.getClassByName("A").get().getMethods().get(0);
+ ResolvedMethodDeclaration resolvedMethodDeclaration = methodDeclaration.resolve();
+ assertEquals("foo", resolvedMethodDeclaration.getName());
+ assertEquals("A[]", resolvedMethodDeclaration.getReturnType().describe());
+ assertEquals("java.lang.String[]", resolvedMethodDeclaration.getParam(0).getType().describe());
+ assertEquals("int[]", resolvedMethodDeclaration.getParam(1).getType().describe());
+ }
+
+ @Test
+ public void resolveArrayType() {
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+
+ CompilationUnit cu = parseSample("SymbolResolverExample");
+ new JavaSymbolSolver(typeSolver).inject(cu);
+
+ MethodDeclaration methodDeclaration = cu.getClassByName("A").get().getMethods().get(0);
+ ResolvedType resolvedType = methodDeclaration.getType().resolve();
+ assertEquals("A[]", resolvedType.describe());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/ConvertToUsageTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/ConvertToUsageTest.java
new file mode 100644
index 000000000..44eda270e
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/ConvertToUsageTest.java
@@ -0,0 +1,40 @@
+package com.github.javaparser.symbolsolver.javaparsermodel;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.expr.NameExpr;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+public class ConvertToUsageTest extends AbstractResolutionTest {
+
+ private final TypeSolver typeSolver = new ReflectionTypeSolver();
+
+ @Test
+ public void testConvertTypeToUsage() {
+ CompilationUnit cu = parseSample("LocalTypeDeclarations");
+ List<NameExpr> n = cu.findAll(NameExpr.class);
+
+ assertEquals("int", usageDescribe(n, "a"));
+ assertEquals("java.lang.Integer", usageDescribe(n, "b"));
+ assertEquals("java.lang.Class<java.lang.Integer>", usageDescribe(n, "c"));
+ assertEquals("java.lang.Class<? super java.lang.Integer>", usageDescribe(n, "d"));
+ assertEquals("java.lang.Class<? extends java.lang.Integer>", usageDescribe(n, "e"));
+ assertEquals("java.lang.Class<? extends java.lang.Class<? super java.lang.Class<? extends java.lang.Integer>>>", usageDescribe(n, "f"));
+ assertEquals("java.lang.Class<? super java.lang.Class<? extends java.lang.Class<? super java.lang.Integer>>>", usageDescribe(n, "g"));
+ }
+
+ private String usageDescribe(List<NameExpr> n, String name){
+ return n.stream().filter(x -> x.getNameAsString().equals(name))
+ .map(JavaParserFacade.get(typeSolver)::getType)
+ .map(ResolvedType::describe)
+ .findFirst().orElse(null);
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/DifferentiateDotExpressionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/DifferentiateDotExpressionTest.java
new file mode 100644
index 000000000..cf5a87bf7
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/DifferentiateDotExpressionTest.java
@@ -0,0 +1,100 @@
+package com.github.javaparser.symbolsolver.javaparsermodel;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserClassDeclaration;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+
+public class DifferentiateDotExpressionTest extends AbstractResolutionTest {
+
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() {
+ CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
+ combinedTypeSolver.add(new ReflectionTypeSolver());
+ combinedTypeSolver.add(new JavaParserTypeSolver(adaptPath(new File("src/test/resources/differentiate_dot_expressions"))));
+ typeSolver = combinedTypeSolver;
+ }
+
+ @Test
+ public void methodCallsFromFieldObjects() {
+ ClassOrInterfaceDeclaration clazz = ((JavaParserClassDeclaration) typeSolver.solveType("FieldDotExpressions")).getWrappedNode();
+ MethodDeclaration mainMethod = Navigator.demandMethod(clazz, "main");
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+
+ MethodCallExpr firstFieldMethodCall = Navigator.findMethodCall(mainMethod, "firstContainerMethod").get();
+ MethodCallExpr secondFieldMethodCall = Navigator.findMethodCall(mainMethod, "secondContainerMethod").get();
+ MethodCallExpr thirdFieldMethodCall = Navigator.findMethodCall(mainMethod, "thirdContainerMethod").get();
+
+ assertEquals(true, javaParserFacade.solve(firstFieldMethodCall).isSolved());
+ assertEquals(true, javaParserFacade.solve(secondFieldMethodCall).isSolved());
+ assertEquals(true, javaParserFacade.solve(thirdFieldMethodCall).isSolved());
+ }
+
+ @Test
+ public void staticMethodCallsFromInnerClasses() {
+ ClassOrInterfaceDeclaration clazz = ((JavaParserClassDeclaration) typeSolver.solveType("InnerClassDotExpressions")).getWrappedNode();
+ MethodDeclaration mainMethod = Navigator.demandMethod(clazz, "main");
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+
+ MethodCallExpr methodCall = Navigator.findMethodCall(mainMethod, "methodCall").get();
+ MethodCallExpr innerMethodCall = Navigator.findMethodCall(mainMethod, "innerMethodCall").get();
+ MethodCallExpr innerInnerMethodCall = Navigator.findMethodCall(mainMethod, "innerInnerMethodCall").get();
+
+ assertEquals(true, javaParserFacade.solve(methodCall).isSolved());
+ assertEquals(true, javaParserFacade.solve(innerMethodCall).isSolved());
+ assertEquals(true, javaParserFacade.solve(innerInnerMethodCall).isSolved());
+ }
+
+ @Test
+ public void staticFieldCallsFromInnerClasses() {
+ ClassOrInterfaceDeclaration clazz = ((JavaParserClassDeclaration) typeSolver.solveType("InnerStaticClassFieldDotExpressions")).getWrappedNode();
+ MethodDeclaration mainMethod = Navigator.demandMethod(clazz, "main");
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+
+ MethodCallExpr methodCallWithNestedStaticFieldParam = Navigator.findMethodCall(mainMethod, "parseInt").get();
+
+ assertEquals(true, javaParserFacade.solve(methodCallWithNestedStaticFieldParam).isSolved());
+ }
+
+ @Test
+ public void packageStaticMethodCalls() {
+ ClassOrInterfaceDeclaration clazz = ((JavaParserClassDeclaration) typeSolver.solveType("PackageDotExpressions")).getWrappedNode();
+ MethodDeclaration mainMethod = Navigator.demandMethod(clazz, "main");
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+
+ MethodCallExpr staticMethodCall = Navigator.findMethodCall(mainMethod, "staticMethod").get();
+
+ MethodCallExpr methodCall = Navigator.findMethodCall(mainMethod, "methodCall").get();
+ MethodCallExpr innerMethodCall = Navigator.findMethodCall(mainMethod, "innerMethodCall").get();
+ MethodCallExpr innerInnerMethodCall = Navigator.findMethodCall(mainMethod, "innerInnerMethodCall").get();
+
+ MethodCallExpr firstFieldMethodCall = Navigator.findMethodCall(mainMethod, "firstContainerMethod").get();
+ MethodCallExpr secondFieldMethodCall = Navigator.findMethodCall(mainMethod, "secondContainerMethod").get();
+ MethodCallExpr thirdFieldMethodCall = Navigator.findMethodCall(mainMethod, "thirdContainerMethod").get();
+
+ assertEquals(true, javaParserFacade.solve(staticMethodCall).isSolved());
+
+ assertEquals(true, javaParserFacade.solve(methodCall).isSolved());
+ assertEquals(true, javaParserFacade.solve(innerMethodCall).isSolved());
+ assertEquals(true, javaParserFacade.solve(innerInnerMethodCall).isSolved());
+
+ assertEquals(true, javaParserFacade.solve(firstFieldMethodCall).isSolved());
+ assertEquals(true, javaParserFacade.solve(secondFieldMethodCall).isSolved());
+ assertEquals(true, javaParserFacade.solve(thirdFieldMethodCall).isSolved());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserAnonymousClassDeclarationTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserAnonymousClassDeclarationTest.java
new file mode 100644
index 000000000..1029456ba
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserAnonymousClassDeclarationTest.java
@@ -0,0 +1,98 @@
+package com.github.javaparser.symbolsolver.javaparsermodel.declarations;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.resolution.MethodUsage;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+public class JavaParserAnonymousClassDeclarationTest extends AbstractResolutionTest {
+
+ @Test
+ public void anonymousClassAsMethodArgument() {
+ CompilationUnit cu = parseSample("AnonymousClassDeclarations");
+ ClassOrInterfaceDeclaration aClass = Navigator.demandClass(cu, "AnonymousClassDeclarations");
+ MethodDeclaration method = Navigator.demandMethod(aClass, "fooBar1");
+ MethodCallExpr methodCall = Navigator.findMethodCall(method, "of").get();
+
+ CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
+ combinedTypeSolver.add(new ReflectionTypeSolver());
+ MethodUsage methodUsage =
+ JavaParserFacade.get(combinedTypeSolver).solveMethodAsUsage(methodCall);
+
+ assertThat(methodUsage.getQualifiedSignature(),
+ is("AnonymousClassDeclarations.ParDo.of(AnonymousClassDeclarations.DoFn<I, O>)"));
+ }
+
+ @Test
+ public void callingSuperClassInnerClassMethod() {
+ CompilationUnit cu = parseSample("AnonymousClassDeclarations");
+ ClassOrInterfaceDeclaration aClass = Navigator.demandClass(cu, "AnonymousClassDeclarations");
+ MethodDeclaration method = Navigator.demandMethod(aClass, "fooBar2");
+ MethodCallExpr methodCall = Navigator.findMethodCall(method, "innerClassMethod").get();
+
+ CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
+ combinedTypeSolver.add(new ReflectionTypeSolver());
+ MethodUsage methodUsage =
+ JavaParserFacade.get(combinedTypeSolver).solveMethodAsUsage(methodCall);
+
+ assertThat(methodUsage.getQualifiedSignature(),
+ is("AnonymousClassDeclarations.DoFn.ProcessContext.innerClassMethod()"));
+ }
+
+ @Test
+ public void callingAnonymousClassInnerMethod() {
+ CompilationUnit cu = parseSample("AnonymousClassDeclarations");
+ ClassOrInterfaceDeclaration aClass = Navigator.demandClass(cu, "AnonymousClassDeclarations");
+ MethodDeclaration method = Navigator.demandMethod(aClass, "fooBar3");
+ MethodCallExpr methodCall = Navigator.findMethodCall(method, "callAnnonClassInnerMethod").get();
+
+ CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
+ combinedTypeSolver.add(new ReflectionTypeSolver());
+ MethodUsage methodUsage =
+ JavaParserFacade.get(combinedTypeSolver).solveMethodAsUsage(methodCall);
+
+ assertTrue(methodUsage.getQualifiedSignature().startsWith("AnonymousClassDeclarations"));
+ assertTrue(methodUsage.getQualifiedSignature().contains("Anonymous-"));
+ assertTrue(methodUsage.getQualifiedSignature().endsWith("callAnnonClassInnerMethod()"));
+ }
+
+ @Test
+ public void usingAnonymousSuperClassInnerType() {
+ CompilationUnit cu = parseSample("AnonymousClassDeclarations");
+ ClassOrInterfaceDeclaration aClass = Navigator.demandClass(cu, "AnonymousClassDeclarations");
+ MethodDeclaration method = Navigator.demandMethod(aClass, "fooBar4");
+ MethodCallExpr methodCall = Navigator.findMethodCall(method, "toString").get();
+
+ CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
+ combinedTypeSolver.add(new ReflectionTypeSolver());
+ MethodUsage methodUsage =
+ JavaParserFacade.get(combinedTypeSolver).solveMethodAsUsage(methodCall);
+
+ assertThat(methodUsage.getQualifiedSignature(), is("java.lang.Enum.toString()"));
+ }
+
+ @Test
+ public void usingAnonymousClassInnerType() {
+ CompilationUnit cu = parseSample("AnonymousClassDeclarations");
+ ClassOrInterfaceDeclaration aClass = Navigator.demandClass(cu, "AnonymousClassDeclarations");
+ MethodDeclaration method = Navigator.demandMethod(aClass, "fooBar5");
+ MethodCallExpr methodCall = Navigator.findMethodCall(method, "toString").get();
+
+ CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
+ combinedTypeSolver.add(new ReflectionTypeSolver());
+ MethodUsage methodUsage =
+ JavaParserFacade.get(combinedTypeSolver).solveMethodAsUsage(methodCall);
+
+ assertThat(methodUsage.getQualifiedSignature(), is("java.lang.Enum.toString()"));
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserClassDeclarationTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserClassDeclarationTest.java
new file mode 100644
index 000000000..0e70b1807
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserClassDeclarationTest.java
@@ -0,0 +1,894 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.javaparsermodel.declarations;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.AccessSpecifier;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.resolution.MethodUsage;
+import com.github.javaparser.resolution.UnsolvedSymbolException;
+import com.github.javaparser.resolution.declarations.ResolvedConstructorDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedFieldDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration;
+import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
+import com.github.javaparser.resolution.types.ResolvedReferenceType;
+import com.github.javaparser.symbolsolver.AbstractTest;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionFactory;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+
+public class JavaParserClassDeclarationTest extends AbstractTest {
+
+ private TypeSolver typeSolver;
+ private TypeSolver typeSolverNewCode;
+ private ResolvedReferenceType string;
+ private ResolvedReferenceType listOfBoolean;
+
+ @Before
+ public void setup() {
+ File src = adaptPath(new File("src/test/test_sourcecode/javaparser_src/proper_source"));
+ CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
+ combinedTypeSolver.add(new ReflectionTypeSolver());
+ combinedTypeSolver.add(new JavaParserTypeSolver(src));
+ combinedTypeSolver.add(new JavaParserTypeSolver(adaptPath(new File("src/test/test_sourcecode/javaparser_src/generated"))));
+ typeSolver = combinedTypeSolver;
+
+ File srcNewCode = adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-core"));
+ CombinedTypeSolver combinedTypeSolverNewCode = new CombinedTypeSolver();
+ combinedTypeSolverNewCode.add(new ReflectionTypeSolver());
+ combinedTypeSolverNewCode.add(new JavaParserTypeSolver(srcNewCode));
+ combinedTypeSolverNewCode.add(new JavaParserTypeSolver(adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-generated-sources"))));
+ typeSolverNewCode = combinedTypeSolverNewCode;
+
+ TypeSolver ts = new ReflectionTypeSolver();
+ string = new ReferenceTypeImpl(ts.solveType(String.class.getCanonicalName()), ts);
+ ResolvedReferenceType booleanC = new ReferenceTypeImpl(ts.solveType(Boolean.class.getCanonicalName()), ts);
+ listOfBoolean = new ReferenceTypeImpl(ts.solveType(List.class.getCanonicalName()), ImmutableList.of(booleanC), ts);
+ }
+
+ ///
+ /// Test misc
+ ///
+
+ @Test
+ public void testIsClass() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(true, compilationUnit.isClass());
+ }
+
+ @Test
+ public void testIsInterface() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(false, compilationUnit.isInterface());
+ }
+
+ @Test
+ public void testIsEnum() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(false, compilationUnit.isEnum());
+ }
+
+ @Test
+ public void testIsTypeVariable() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(false, compilationUnit.isTypeParameter());
+ }
+
+ @Test
+ public void testIsType() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(true, compilationUnit.isType());
+ }
+
+ @Test
+ public void testAsType() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(compilationUnit, compilationUnit.asType());
+ }
+
+ @Test
+ public void testAsClass() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(compilationUnit, compilationUnit.asClass());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsInterface() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ compilationUnit.asInterface();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsEnum() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ compilationUnit.asEnum();
+ }
+
+ @Test
+ public void testGetPackageName() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals("com.github.javaparser.ast", compilationUnit.getPackageName());
+ }
+
+ @Test
+ public void testGetClassName() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals("CompilationUnit", compilationUnit.getClassName());
+ }
+
+ @Test
+ public void testGetQualifiedName() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals("com.github.javaparser.ast.CompilationUnit", compilationUnit.getQualifiedName());
+ }
+
+ ///
+ /// Test ancestors
+ ///
+
+ @Test
+ public void testGetSuperclassWithoutTypeParameters() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals("com.github.javaparser.ast.Node", compilationUnit.getSuperClass().getQualifiedName());
+ }
+
+ @Test
+ public void testGetSuperclassWithTypeParameters() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", compilationUnit.getSuperClass().getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", compilationUnit.getSuperClass().typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAllSuperclassesWithoutTypeParameters() {
+ JavaParserClassDeclaration cu = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of("com.github.javaparser.ast.Node", "java.lang.Object"), cu.getAllSuperClasses().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllSuperclassesWithTypeParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(3, constructorDeclaration.getAllSuperClasses().size());
+ assertEquals(true, constructorDeclaration.getAllSuperClasses().stream().anyMatch(s -> s.getQualifiedName().equals("com.github.javaparser.ast.body.BodyDeclaration")));
+ assertEquals(true, constructorDeclaration.getAllSuperClasses().stream().anyMatch(s -> s.getQualifiedName().equals("com.github.javaparser.ast.Node")));
+ assertEquals(true, constructorDeclaration.getAllSuperClasses().stream().anyMatch(s -> s.getQualifiedName().equals("java.lang.Object")));
+
+ ResolvedReferenceType ancestor = null;
+
+ ancestor = constructorDeclaration.getAllSuperClasses().get(0);
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllSuperClasses().get(1);
+ assertEquals("com.github.javaparser.ast.Node", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllSuperClasses().get(2);
+ assertEquals("java.lang.Object", ancestor.getQualifiedName());
+ }
+
+ @Test
+ public void testGetInterfacesWithoutParameters() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of(), compilationUnit.getInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+
+ JavaParserClassDeclaration coid = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.body.ClassOrInterfaceDeclaration");
+ assertEquals(ImmutableSet.of("com.github.javaparser.ast.DocumentableNode"), coid.getInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetInterfacesWithParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(7, constructorDeclaration.getInterfaces().size());
+
+ ResolvedReferenceType interfaze = null;
+
+ interfaze = constructorDeclaration.getInterfaces().get(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(1);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(2);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithName", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithName.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(4);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAllInterfacesWithoutParameters() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of("java.lang.Cloneable"), compilationUnit.getAllInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+
+ JavaParserClassDeclaration coid = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.body.ClassOrInterfaceDeclaration");
+ assertEquals(ImmutableSet.of("java.lang.Cloneable", "com.github.javaparser.ast.NamedNode", "com.github.javaparser.ast.body.AnnotableNode", "com.github.javaparser.ast.DocumentableNode"), coid.getAllInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllInterfacesWithParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(9, constructorDeclaration.getAllInterfaces().size());
+
+ ResolvedReferenceType interfaze = null;
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(1);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(2);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithName", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithName.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(4);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(7);
+ assertEquals("java.lang.Cloneable", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(8);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAncestorsWithTypeParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(8, constructorDeclaration.getAncestors().size());
+
+ ResolvedReferenceType ancestor = null;
+
+ ancestor = constructorDeclaration.getAncestors().get(0);
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(1);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(2);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithName", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithName.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(4);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(7);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAllAncestorsWithoutTypeParameters() {
+ JavaParserClassDeclaration cu = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of("java.lang.Cloneable", "com.github.javaparser.ast.Node", "java.lang.Object"), cu.getAllAncestors().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllAncestorsWithTypeParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(12, constructorDeclaration.getAllAncestors().size());
+
+ ResolvedReferenceType ancestor = null;
+
+ ancestor = constructorDeclaration.getAllAncestors().get(0);
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(1);
+ assertEquals("com.github.javaparser.ast.Node", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(2);
+ assertEquals("java.lang.Cloneable", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(4);
+ assertEquals("java.lang.Object", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(7);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithName", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithName.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(8);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(9);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(10);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(11);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.T").get().asReferenceType().getQualifiedName());
+ }
+
+ ///
+ /// Test fields
+ ///
+
+ @Test
+ public void testGetFieldForExistingField() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ ResolvedFieldDeclaration fieldDeclaration = null;
+
+ // declared field
+ fieldDeclaration = constructorDeclaration.getField("modifiers");
+ assertEquals("modifiers", fieldDeclaration.getName());
+ assertEquals("java.util.EnumSet", fieldDeclaration.getType().asReferenceType().getQualifiedName());
+ assertEquals(AccessSpecifier.PRIVATE, fieldDeclaration.accessSpecifier());
+ assertEquals(false, fieldDeclaration.isStatic());
+
+ // inherited field
+ fieldDeclaration = constructorDeclaration.getField("annotations");
+ assertEquals("annotations", fieldDeclaration.getName());
+ assertEquals("java.util.List", fieldDeclaration.getType().asReferenceType().getQualifiedName());
+ assertEquals(AccessSpecifier.PRIVATE, fieldDeclaration.accessSpecifier());
+ }
+
+ @Test(expected = UnsolvedSymbolException.class)
+ public void testGetFieldForUnexistingField() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ constructorDeclaration.getField("unexisting");
+ }
+
+ @Test
+ public void testGetAllFields() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ List<ResolvedFieldDeclaration> allFields = constructorDeclaration.getAllFields();
+ assertEquals(16, allFields.size());
+
+ ResolvedFieldDeclaration fieldDeclaration = null;
+
+ fieldDeclaration = allFields.get(0);
+ assertEquals("modifiers", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(1);
+ assertEquals("typeParameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(2);
+ assertEquals("name", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(3);
+ assertEquals("parameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(4);
+ assertEquals("throws_", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(5);
+ assertEquals("body", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(6);
+ assertEquals("annotations", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(7);
+ assertEquals("NODE_BY_BEGIN_POSITION", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(8);
+ assertEquals("range", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(9);
+ assertEquals("parentNode", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(10);
+ assertEquals("childrenNodes", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(11);
+ assertEquals("orphanComments", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(12);
+ assertEquals("userData", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(13);
+ assertEquals("comment", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(14);
+ assertEquals("ABSOLUTE_BEGIN_LINE", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(15);
+ assertEquals("ABSOLUTE_END_LINE", fieldDeclaration.getName());
+ }
+
+ @Test
+ public void testGetAllGenericFields() throws IOException, ParseException {
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+
+ CompilationUnit cu = JavaParser.parse(adaptPath(new File("src/test/resources/GenericFields.java.txt")));
+ JavaParserClassDeclaration classDeclaration = new JavaParserClassDeclaration(Navigator.demandClass(cu, "CB"), typeSolver);
+
+ assertEquals(3, classDeclaration.getAllFields().size());
+
+ ReferenceTypeImpl rtClassDeclaration = new ReferenceTypeImpl(classDeclaration, typeSolver);
+
+ assertEquals("s", classDeclaration.getAllFields().get(0).getName());
+ assertEquals(string, classDeclaration.getAllFields().get(0).getType());
+ assertEquals(string, rtClassDeclaration.getFieldType("s").get());
+
+ assertEquals("t", classDeclaration.getAllFields().get(1).getName());
+ assertEquals("java.util.List<java.lang.Boolean>", classDeclaration.getAllFields().get(1).getType().describe());
+ assertEquals(listOfBoolean, rtClassDeclaration.getFieldType("t").get());
+
+ assertEquals("i", classDeclaration.getAllFields().get(2).getName());
+ assertEquals(ResolvedPrimitiveType.INT, classDeclaration.getAllFields().get(2).getType());
+ assertEquals(ResolvedPrimitiveType.INT, rtClassDeclaration.getFieldType("i").get());
+ }
+
+ @Test
+ public void testGetAllStaticFields() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ List<ResolvedFieldDeclaration> allFields = constructorDeclaration.getAllStaticFields();
+ assertEquals(3, allFields.size());
+
+ ResolvedFieldDeclaration fieldDeclaration = null;
+
+ fieldDeclaration = allFields.get(0);
+ assertEquals("NODE_BY_BEGIN_POSITION", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(1);
+ assertEquals("ABSOLUTE_BEGIN_LINE", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(2);
+ assertEquals("ABSOLUTE_END_LINE", fieldDeclaration.getName());
+ }
+
+ @Test
+ public void testGetAllNonStaticFields() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ List<ResolvedFieldDeclaration> allFields = constructorDeclaration.getAllNonStaticFields();
+ assertEquals(13, allFields.size());
+
+ ResolvedFieldDeclaration fieldDeclaration = null;
+
+ fieldDeclaration = allFields.get(0);
+ assertEquals("modifiers", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(1);
+ assertEquals("typeParameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(2);
+ assertEquals("name", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(3);
+ assertEquals("parameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(4);
+ assertEquals("throws_", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(5);
+ assertEquals("body", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(6);
+ assertEquals("annotations", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(7);
+ assertEquals("range", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(8);
+ assertEquals("parentNode", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(9);
+ assertEquals("childrenNodes", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(10);
+ assertEquals("orphanComments", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(11);
+ assertEquals("userData", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(12);
+ assertEquals("comment", fieldDeclaration.getName());
+ }
+
+ @Test
+ public void testGetDeclaredFields() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ List<ResolvedFieldDeclaration> allFields = constructorDeclaration.getDeclaredFields();
+ assertEquals(6, allFields.size());
+
+ ResolvedFieldDeclaration fieldDeclaration = null;
+
+ fieldDeclaration = allFields.get(0);
+ assertEquals("modifiers", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(1);
+ assertEquals("typeParameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(2);
+ assertEquals("name", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(3);
+ assertEquals("parameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(4);
+ assertEquals("throws_", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(5);
+ assertEquals("body", fieldDeclaration.getName());
+ }
+
+ ///
+ /// Test methods
+ ///
+
+ @Test
+ public void testGetDeclaredMethods() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ Set<ResolvedMethodDeclaration> allMethods = constructorDeclaration.getDeclaredMethods();
+ assertEquals(20, allMethods.size());
+
+ List<ResolvedMethodDeclaration> sortedMethods = allMethods.stream()
+ .sorted((o1, o2) -> o1.getQualifiedSignature().compareTo(o2.getQualifiedSignature()))
+ .collect(Collectors.toList());
+
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.accept(com.github.javaparser.ast.visitor.GenericVisitor<R, A>, A)", sortedMethods.get(0).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.accept(com.github.javaparser.ast.visitor.VoidVisitor<A>, A)", sortedMethods.get(1).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getBody()", sortedMethods.get(2).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString()", sortedMethods.get(3).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString(boolean, boolean)", sortedMethods.get(4).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString(boolean, boolean, boolean)", sortedMethods.get(5).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getJavaDoc()", sortedMethods.get(6).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getModifiers()", sortedMethods.get(7).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getName()", sortedMethods.get(8).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getNameExpr()", sortedMethods.get(9).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getParameters()", sortedMethods.get(10).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getThrows()", sortedMethods.get(11).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getTypeParameters()", sortedMethods.get(12).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setBody(com.github.javaparser.ast.stmt.BlockStmt)", sortedMethods.get(13).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setModifiers(java.util.EnumSet<com.github.javaparser.ast.Modifier>)", sortedMethods.get(14).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setName(java.lang.String)", sortedMethods.get(15).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setNameExpr(com.github.javaparser.ast.expr.NameExpr)", sortedMethods.get(16).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setParameters(java.util.List<com.github.javaparser.ast.body.Parameter>)", sortedMethods.get(17).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setThrows(java.util.List<com.github.javaparser.ast.type.ReferenceType>)", sortedMethods.get(18).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setTypeParameters(java.util.List<com.github.javaparser.ast.type.TypeParameter>)", sortedMethods.get(19).getQualifiedSignature());
+ }
+
+ @Test
+ public void testGetAllMethods() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ Set<MethodUsage> allMethods = constructorDeclaration.getAllMethods();
+
+ List<MethodUsage> sortedMethods = allMethods.stream()
+ .sorted((o1, o2) -> o1.getQualifiedSignature().compareTo(o2.getQualifiedSignature()))
+ .collect(Collectors.toList());
+
+ List<String> signatures = sortedMethods.stream().map(m -> m.getQualifiedSignature()).collect(Collectors.toList());
+
+ assertEquals(ImmutableList.of("com.github.javaparser.ast.Node.addOrphanComment(com.github.javaparser.ast.comments.Comment)",
+ "com.github.javaparser.ast.Node.clone()",
+ "com.github.javaparser.ast.Node.contains(com.github.javaparser.ast.Node)",
+ "com.github.javaparser.ast.Node.equals(java.lang.Object)",
+ "com.github.javaparser.ast.Node.getAllContainedComments()",
+ "com.github.javaparser.ast.Node.getBegin()",
+ "com.github.javaparser.ast.Node.getChildrenNodes()",
+ "com.github.javaparser.ast.Node.getComment()",
+ "com.github.javaparser.ast.Node.getEnd()",
+ "com.github.javaparser.ast.Node.getNodesByType(java.lang.Class<N>)",
+ "com.github.javaparser.ast.Node.getOrphanComments()",
+ "com.github.javaparser.ast.Node.getParentNode()",
+ "com.github.javaparser.ast.Node.getParentNodeOfType(java.lang.Class<T>)",
+ "com.github.javaparser.ast.Node.getRange()",
+ "com.github.javaparser.ast.Node.getUserData(com.github.javaparser.ast.UserDataKey<M>)",
+ "com.github.javaparser.ast.Node.hasComment()",
+ "com.github.javaparser.ast.Node.hashCode()",
+ "com.github.javaparser.ast.Node.isPositionedAfter(com.github.javaparser.Position)",
+ "com.github.javaparser.ast.Node.isPositionedBefore(com.github.javaparser.Position)",
+ "com.github.javaparser.ast.Node.setAsParentNodeOf(com.github.javaparser.ast.Node)",
+ "com.github.javaparser.ast.Node.setAsParentNodeOf(java.util.List<? extends com.github.javaparser.ast.Node>)",
+ "com.github.javaparser.ast.Node.setBegin(com.github.javaparser.Position)",
+ "com.github.javaparser.ast.Node.setBlockComment(java.lang.String)",
+ "com.github.javaparser.ast.Node.setComment(com.github.javaparser.ast.comments.Comment)",
+ "com.github.javaparser.ast.Node.setEnd(com.github.javaparser.Position)",
+ "com.github.javaparser.ast.Node.setLineComment(java.lang.String)",
+ "com.github.javaparser.ast.Node.setParentNode(com.github.javaparser.ast.Node)",
+ "com.github.javaparser.ast.Node.setRange(com.github.javaparser.Range)",
+ "com.github.javaparser.ast.Node.setUserData(com.github.javaparser.ast.UserDataKey<M>, M)",
+ "com.github.javaparser.ast.Node.toString()",
+ "com.github.javaparser.ast.Node.toStringWithoutComments()",
+ "com.github.javaparser.ast.Node.tryAddImportToParentCompilationUnit(java.lang.Class<?>)",
+ "com.github.javaparser.ast.body.BodyDeclaration.getAnnotations()",
+ "com.github.javaparser.ast.body.BodyDeclaration.setAnnotations(java.util.List<com.github.javaparser.ast.expr.AnnotationExpr>)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.accept(com.github.javaparser.ast.visitor.GenericVisitor<R, A>, A)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.accept(com.github.javaparser.ast.visitor.VoidVisitor<A>, A)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getBody()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString(boolean, boolean)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString(boolean, boolean, boolean)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getJavaDoc()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getModifiers()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getName()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getNameExpr()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getParameters()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getThrows()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getTypeParameters()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setBody(com.github.javaparser.ast.stmt.BlockStmt)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setModifiers(java.util.EnumSet<com.github.javaparser.ast.Modifier>)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setName(java.lang.String)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setNameExpr(com.github.javaparser.ast.expr.NameExpr)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setParameters(java.util.List<com.github.javaparser.ast.body.Parameter>)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setThrows(java.util.List<com.github.javaparser.ast.type.ReferenceType>)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setTypeParameters(java.util.List<com.github.javaparser.ast.type.TypeParameter>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addAnnotation(java.lang.Class<? extends java.lang.annotation.Annotation>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addAnnotation(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addMarkerAnnotation(java.lang.Class<? extends java.lang.annotation.Annotation>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addMarkerAnnotation(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addSingleMemberAnnotation(java.lang.Class<? extends java.lang.annotation.Annotation>, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addSingleMemberAnnotation(java.lang.String, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.getAnnotationByClass(java.lang.Class<? extends java.lang.annotation.Annotation>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.getAnnotationByName(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.isAnnotationPresent(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.createBody()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.setJavaDocComment(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.addModifier(com.github.javaparser.ast.Modifier...)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isAbstract()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isFinal()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isNative()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isPrivate()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isProtected()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isPublic()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isStatic()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isStrictfp()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isSynchronized()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isTransient()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isVolatile()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addAndGetParameter(com.github.javaparser.ast.body.Parameter)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addAndGetParameter(com.github.javaparser.ast.type.Type, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addAndGetParameter(java.lang.Class<?>, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addAndGetParameter(java.lang.String, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addParameter(com.github.javaparser.ast.body.Parameter)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addParameter(com.github.javaparser.ast.type.Type, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addParameter(java.lang.Class<?>, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addParameter(java.lang.String, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.getParamByName(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.getParamByType(java.lang.Class<?>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.getParamByType(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithThrowable.addThrows(com.github.javaparser.ast.type.ReferenceType)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithThrowable.addThrows(java.lang.Class<? extends java.lang.Throwable>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithThrowable.isThrows(java.lang.Class<? extends java.lang.Throwable>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithThrowable.isThrows(java.lang.String)",
+ "java.lang.Object.finalize()",
+ "java.lang.Object.getClass()",
+ "java.lang.Object.notify()",
+ "java.lang.Object.notifyAll()",
+ "java.lang.Object.registerNatives()",
+ "java.lang.Object.wait()",
+ "java.lang.Object.wait(long)",
+ "java.lang.Object.wait(long, int)"), signatures);
+ }
+
+ ///
+ /// Test constructors
+ ///
+
+ @Test
+ public void testGetConstructors() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ List<ResolvedConstructorDeclaration> constructors = constructorDeclaration.getConstructors();
+ assertEquals(4, constructors.size());
+
+ assertEquals("ConstructorDeclaration()", constructors.get(0).getSignature());
+ assertEquals("ConstructorDeclaration(java.util.EnumSet<com.github.javaparser.ast.Modifier>, java.lang.String)", constructors.get(1).getSignature());
+ assertEquals("ConstructorDeclaration(java.util.EnumSet<com.github.javaparser.ast.Modifier>, java.util.List<com.github.javaparser.ast.expr.AnnotationExpr>, java.util.List<com.github.javaparser.ast.type.TypeParameter>, java.lang.String, java.util.List<com.github.javaparser.ast.body.Parameter>, java.util.List<com.github.javaparser.ast.type.ReferenceType>, com.github.javaparser.ast.stmt.BlockStmt)", constructors.get(2).getSignature());
+ assertEquals("ConstructorDeclaration(com.github.javaparser.Range, java.util.EnumSet<com.github.javaparser.ast.Modifier>, java.util.List<com.github.javaparser.ast.expr.AnnotationExpr>, java.util.List<com.github.javaparser.ast.type.TypeParameter>, java.lang.String, java.util.List<com.github.javaparser.ast.body.Parameter>, java.util.List<com.github.javaparser.ast.type.ReferenceType>, com.github.javaparser.ast.stmt.BlockStmt)", constructors.get(3).getSignature());
+ }
+
+ ///
+ /// Resolution
+ ///
+
+ //SymbolReference<MethodDeclaration> solveMethod(String name, List<Type> parameterTypes);
+ @Test
+ public void testSolveMethodExisting() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<ResolvedMethodDeclaration> res = null;
+
+ res = constructorDeclaration.solveMethod("isStatic", ImmutableList.of());
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isStatic()", res.getCorrespondingDeclaration().getQualifiedSignature());
+
+ res = constructorDeclaration.solveMethod("isThrows", ImmutableList.of(ReflectionFactory.typeUsageFor(RuntimeException.class.getClass(), typeSolverNewCode)));
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.isThrows(java.lang.Class<? extends java.lang.Throwable>)", res.getCorrespondingDeclaration().getQualifiedSignature());
+
+ res = constructorDeclaration.solveMethod("isThrows", ImmutableList.of(ReflectionFactory.typeUsageFor(String.class, typeSolverNewCode)));
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.isThrows(java.lang.String)", res.getCorrespondingDeclaration().getQualifiedSignature());
+
+ // This is solved because it is raw
+ res = constructorDeclaration.solveMethod("isThrows", ImmutableList.of(ReflectionFactory.typeUsageFor(Class.class, typeSolverNewCode)));
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.isThrows(java.lang.Class<? extends java.lang.Throwable>)", res.getCorrespondingDeclaration().getQualifiedSignature());
+ }
+
+ @Test
+ public void testSolveMethodNotExisting() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<ResolvedMethodDeclaration> res = null;
+
+ res = constructorDeclaration.solveMethod("unexistingMethod", ImmutableList.of());
+ assertEquals(false, res.isSolved());
+
+ res = constructorDeclaration.solveMethod("isStatic", ImmutableList.of(ResolvedPrimitiveType.BOOLEAN));
+ assertEquals(false, res.isSolved());
+ }
+
+ @Test
+ public void testSolveMethodNotExistingBecauseOfTypeParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<ResolvedMethodDeclaration> res = null;
+
+ ResolvedReferenceType stringType = (ResolvedReferenceType) ReflectionFactory.typeUsageFor(String.class, typeSolverNewCode);
+ ResolvedReferenceType rawClassType = (ResolvedReferenceType) ReflectionFactory.typeUsageFor(Class.class, typeSolverNewCode);
+ ResolvedReferenceType classOfStringType = (ResolvedReferenceType) rawClassType.replaceTypeVariables(rawClassType.getTypeDeclaration().getTypeParameters().get(0), stringType);
+ res = constructorDeclaration.solveMethod("isThrows", ImmutableList.of(classOfStringType));
+ assertEquals(false, res.isSolved());
+ }
+
+
+ ///
+ /// Assignability
+ ///
+
+ // boolean isAssignableBy(Type type);
+
+ // boolean canBeAssignedTo(TypeDeclaration other)
+
+ // boolean isAssignableBy(TypeDeclaration other);
+
+ ///
+ /// Annotations
+ ///
+
+ // hasDirectlyAnnotation
+
+ @Test
+ public void testHasDirectlyAnnotation() throws IOException, ParseException {
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+
+ CompilationUnit cu = JavaParser.parse(adaptPath(new File("src/test/resources/Annotations.java.txt")));
+
+ JavaParserClassDeclaration ca = new JavaParserClassDeclaration(Navigator.demandClass(cu, "CA"), typeSolver);
+ assertEquals(true, ca.hasDirectlyAnnotation("foo.bar.MyAnnotation"));
+ assertEquals(false, ca.hasDirectlyAnnotation("foo.bar.MyAnnotation2"));
+ assertEquals(false, ca.hasDirectlyAnnotation("MyAnnotation"));
+ assertEquals(false, ca.hasDirectlyAnnotation("foo.bar.MyUnexistingAnnotation"));
+
+ JavaParserClassDeclaration cb = new JavaParserClassDeclaration(Navigator.demandClass(cu, "CB"), typeSolver);
+ assertEquals(false, cb.hasDirectlyAnnotation("foo.bar.MyAnnotation"));
+ assertEquals(true, cb.hasDirectlyAnnotation("foo.bar.MyAnnotation2"));
+ assertEquals(false, cb.hasDirectlyAnnotation("MyAnnotation"));
+ assertEquals(false, cb.hasDirectlyAnnotation("foo.bar.MyUnexistingAnnotation"));
+ }
+
+ // hasAnnotation
+
+ @Test
+ public void testHasAnnotation() throws IOException, ParseException {
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+
+ CompilationUnit cu = JavaParser.parse(adaptPath(new File("src/test/resources/Annotations.java.txt")));
+
+ JavaParserClassDeclaration ca = new JavaParserClassDeclaration(Navigator.demandClass(cu, "CA"), typeSolver);
+ assertEquals(true, ca.hasAnnotation("foo.bar.MyAnnotation"));
+ assertEquals(false, ca.hasAnnotation("foo.bar.MyAnnotation2"));
+ assertEquals(false, ca.hasAnnotation("MyAnnotation"));
+ assertEquals(false, ca.hasAnnotation("foo.bar.MyUnexistingAnnotation"));
+
+ JavaParserClassDeclaration cb = new JavaParserClassDeclaration(Navigator.demandClass(cu, "CB"), typeSolver);
+ assertEquals(true, cb.hasAnnotation("foo.bar.MyAnnotation"));
+ assertEquals(true, cb.hasAnnotation("foo.bar.MyAnnotation2"));
+ assertEquals(false, cb.hasAnnotation("MyAnnotation"));
+ assertEquals(false, cb.hasAnnotation("foo.bar.MyUnexistingAnnotation"));
+ }
+
+ ///
+ ///
+ ///
+
+ // List<TypeParameterDeclaration> getTypeParameters();
+
+ // AccessLevel accessLevel();
+
+ ///
+ /// Containment
+ ///
+
+ // Set<TypeDeclaration> internalTypes()
+
+ // Optional<TypeDeclaration> containerType()
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserEnumDeclarationTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserEnumDeclarationTest.java
new file mode 100644
index 000000000..c171f4b94
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserEnumDeclarationTest.java
@@ -0,0 +1,826 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.javaparsermodel.declarations;
+
+import com.github.javaparser.symbolsolver.AbstractTest;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+
+public class JavaParserEnumDeclarationTest extends AbstractTest {
+
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() {
+ File srcNewCode = adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-core"));
+ CombinedTypeSolver combinedTypeSolverNewCode = new CombinedTypeSolver();
+ combinedTypeSolverNewCode.add(new ReflectionTypeSolver());
+ combinedTypeSolverNewCode.add(new JavaParserTypeSolver(srcNewCode));
+ combinedTypeSolverNewCode.add(new JavaParserTypeSolver(adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-generated-sources"))));
+ typeSolver = combinedTypeSolverNewCode;
+ }
+
+ ///
+ /// Test misc
+ ///
+
+ @Test
+ public void testIsClass() {
+ JavaParserEnumDeclaration modifier = (JavaParserEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(false, modifier.isClass());
+ }
+
+ @Test
+ public void testIsInterface() {
+ JavaParserEnumDeclaration modifier = (JavaParserEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(false, modifier.isInterface());
+ }
+
+ @Test
+ public void testIsEnum() {
+ JavaParserEnumDeclaration modifier = (JavaParserEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(true, modifier.isEnum());
+ }
+
+ @Test
+ public void testIsTypeVariable() {
+ JavaParserEnumDeclaration modifier = (JavaParserEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(false, modifier.isTypeParameter());
+ }
+
+ @Test
+ public void testIsType() {
+ JavaParserEnumDeclaration modifier = (JavaParserEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(true, modifier.isType());
+ }
+
+ @Test
+ public void testAsType() {
+ JavaParserEnumDeclaration modifier = (JavaParserEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(modifier, modifier.asType());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsClass() {
+ JavaParserEnumDeclaration modifier = (JavaParserEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ modifier.asClass();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsInterface() {
+ JavaParserEnumDeclaration modifier = (JavaParserEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ modifier.asInterface();
+ }
+
+ @Test
+ public void testAsEnum() {
+ JavaParserEnumDeclaration modifier = (JavaParserEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(modifier, modifier.asEnum());
+ }
+
+ @Test
+ public void testGetPackageName() {
+ JavaParserEnumDeclaration modifier = (JavaParserEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals("com.github.javaparser.ast", modifier.getPackageName());
+ }
+
+ @Test
+ public void testGetClassName() {
+ JavaParserEnumDeclaration modifier = (JavaParserEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals("Modifier", modifier.getClassName());
+ }
+
+ @Test
+ public void testGetQualifiedName() {
+ JavaParserEnumDeclaration modifier = (JavaParserEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals("com.github.javaparser.ast.Modifier", modifier.getQualifiedName());
+ }
+
+ ///
+ /// Test ancestors
+ ///
+
+ /*@Test
+ public void testGetSuperclassWithoutTypeParameters() {
+ JavaParserEnumDeclaration modifier = (JavaParserEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals("com.github.javaparser.ast.Node", compilationUnit.getSuperClass().getQualifiedName());
+ }
+
+ @Test
+ public void testGetSuperclassWithTypeParameters() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", compilationUnit.getSuperClass().getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", compilationUnit.getSuperClass().typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAllSuperclassesWithoutTypeParameters() {
+ JavaParserClassDeclaration cu = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of("com.github.javaparser.ast.Node", "java.lang.Object"), cu.getAllSuperClasses().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllSuperclassesWithTypeParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(3, constructorDeclaration.getAllSuperClasses().size());
+
+ ReferenceType ancestor = null;
+
+ ancestor = constructorDeclaration.getAllSuperClasses().get(0);
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllSuperClasses().get(1);
+ assertEquals("com.github.javaparser.ast.Node", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllSuperClasses().get(2);
+ assertEquals("java.lang.Object", ancestor.getQualifiedName());
+ }
+
+ @Test
+ public void testGetInterfacesWithoutParameters() {
+ JavaParserEnumDeclaration modifier = (JavaParserEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(ImmutableSet.of(), compilationUnit.getInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+
+ JavaParserClassDeclaration coid = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.body.ClassOrInterfaceDeclaration");
+ assertEquals(ImmutableSet.of("com.github.javaparser.ast.DocumentableNode"), coid.getInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetInterfacesWithParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(7, constructorDeclaration.getInterfaces().size());
+
+ ReferenceType interfaze = null;
+
+ interfaze = constructorDeclaration.getInterfaces().get(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(1);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(2);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithName", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithName.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(4);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAllInterfacesWithoutParameters() {
+ JavaParserEnumDeclaration modifier = (JavaParserEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(ImmutableSet.of("java.lang.Cloneable"), compilationUnit.getAllInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+
+ JavaParserClassDeclaration coid = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.body.ClassOrInterfaceDeclaration");
+ assertEquals(ImmutableSet.of("java.lang.Cloneable", "com.github.javaparser.ast.NamedNode", "com.github.javaparser.ast.body.AnnotableNode", "com.github.javaparser.ast.DocumentableNode"), coid.getAllInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllInterfacesWithParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(9, constructorDeclaration.getAllInterfaces().size());
+
+ ReferenceType interfaze = null;
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(1);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(2);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithName", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithName.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(4);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(7);
+ assertEquals("java.lang.Cloneable", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(8);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAncestorsWithTypeParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(8, constructorDeclaration.getAncestors().size());
+
+ ReferenceType ancestor = null;
+
+ ancestor = constructorDeclaration.getAncestors().get(0);
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(1);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(2);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithName", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithName.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(4);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(7);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAllAncestorsWithoutTypeParameters() {
+ JavaParserClassDeclaration cu = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of("java.lang.Cloneable", "com.github.javaparser.ast.Node", "java.lang.Object"), cu.getAllAncestors().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllAncestorsWithTypeParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(12, constructorDeclaration.getAllAncestors().size());
+
+ ReferenceType ancestor = null;
+
+ ancestor = constructorDeclaration.getAllAncestors().get(0);
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(1);
+ assertEquals("com.github.javaparser.ast.Node", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(2);
+ assertEquals("java.lang.Cloneable", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(4);
+ assertEquals("java.lang.Object", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(7);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithName", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithName.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(8);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(9);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(10);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(11);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.T").get().asReferenceType().getQualifiedName());
+ }
+
+ ///
+ /// Test fields
+ ///
+
+ @Test
+ public void testGetFieldForExistingField() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ FieldDeclaration fieldDeclaration = null;
+
+ // declared field
+ fieldDeclaration = constructorDeclaration.getField("modifiers");
+ assertEquals("modifiers", fieldDeclaration.getName());
+ assertEquals("java.util.EnumSet", fieldDeclaration.getType().asReferenceType().getQualifiedName());
+ assertEquals(AccessLevel.PRIVATE, fieldDeclaration.accessLevel());
+ assertEquals(false, fieldDeclaration.isStatic());
+
+ // inherited field
+ fieldDeclaration = constructorDeclaration.getField("annotations");
+ assertEquals("annotations", fieldDeclaration.getName());
+ assertEquals("java.util.List", fieldDeclaration.getType().asReferenceType().getQualifiedName());
+ assertEquals(AccessLevel.PRIVATE, fieldDeclaration.accessLevel());
+ }
+
+ @Test(expected = UnsolvedSymbolException.class)
+ public void testGetFieldForUnexistingField() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ constructorDeclaration.getField("unexisting");
+ }
+
+ @Test
+ public void testGetAllFields() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ List<FieldDeclaration> allFields = constructorDeclaration.getAllFields();
+ assertEquals(16, allFields.size());
+
+ FieldDeclaration fieldDeclaration = null;
+
+ fieldDeclaration = allFields.get(0);
+ assertEquals("modifiers", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(1);
+ assertEquals("typeParameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(2);
+ assertEquals("name", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(3);
+ assertEquals("parameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(4);
+ assertEquals("throws_", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(5);
+ assertEquals("body", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(6);
+ assertEquals("annotations", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(7);
+ assertEquals("NODE_BY_BEGIN_POSITION", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(8);
+ assertEquals("range", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(9);
+ assertEquals("parentNode", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(10);
+ assertEquals("childrenNodes", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(11);
+ assertEquals("orphanComments", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(12);
+ assertEquals("userData", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(13);
+ assertEquals("comment", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(14);
+ assertEquals("ABSOLUTE_BEGIN_LINE", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(15);
+ assertEquals("ABSOLUTE_END_LINE", fieldDeclaration.getName());
+ }
+
+ @Test
+ public void testGetAllStaticFields() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ List<FieldDeclaration> allFields = constructorDeclaration.getAllStaticFields();
+ assertEquals(3, allFields.size());
+
+ FieldDeclaration fieldDeclaration = null;
+
+ fieldDeclaration = allFields.get(0);
+ assertEquals("NODE_BY_BEGIN_POSITION", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(1);
+ assertEquals("ABSOLUTE_BEGIN_LINE", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(2);
+ assertEquals("ABSOLUTE_END_LINE", fieldDeclaration.getName());
+ }
+
+ @Test
+ public void testGetAllNonStaticFields() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ List<FieldDeclaration> allFields = constructorDeclaration.getAllNonStaticFields();
+ assertEquals(13, allFields.size());
+
+ FieldDeclaration fieldDeclaration = null;
+
+ fieldDeclaration = allFields.get(0);
+ assertEquals("modifiers", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(1);
+ assertEquals("typeParameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(2);
+ assertEquals("name", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(3);
+ assertEquals("parameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(4);
+ assertEquals("throws_", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(5);
+ assertEquals("body", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(6);
+ assertEquals("annotations", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(7);
+ assertEquals("range", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(8);
+ assertEquals("parentNode", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(9);
+ assertEquals("childrenNodes", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(10);
+ assertEquals("orphanComments", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(11);
+ assertEquals("userData", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(12);
+ assertEquals("comment", fieldDeclaration.getName());
+ }
+
+ @Test
+ public void testGetDeclaredFields() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ List<FieldDeclaration> allFields = constructorDeclaration.getDeclaredFields();
+ assertEquals(6, allFields.size());
+
+ FieldDeclaration fieldDeclaration = null;
+
+ fieldDeclaration = allFields.get(0);
+ assertEquals("modifiers", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(1);
+ assertEquals("typeParameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(2);
+ assertEquals("name", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(3);
+ assertEquals("parameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(4);
+ assertEquals("throws_", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(5);
+ assertEquals("body", fieldDeclaration.getName());
+ }
+
+ ///
+ /// Test methods
+ ///
+
+ @Test
+ public void testGetDeclaredMethods() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ Set<MethodDeclaration> allMethods = constructorDeclaration.getDeclaredMethods();
+ assertEquals(20, allMethods.size());
+
+ List<MethodDeclaration> sortedMethods = allMethods.stream()
+ .sorted((o1, o2) -> o1.getQualifiedSignature().compareTo(o2.getQualifiedSignature()))
+ .collect(Collectors.toList());
+
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.accept(com.github.javaparser.ast.visitor.GenericVisitor<R, A>, A)", sortedMethods.get(0).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.accept(com.github.javaparser.ast.visitor.VoidVisitor<A>, A)", sortedMethods.get(1).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getBody()", sortedMethods.get(2).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString()", sortedMethods.get(3).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString(boolean, boolean)", sortedMethods.get(4).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString(boolean, boolean, boolean)", sortedMethods.get(5).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getJavaDoc()", sortedMethods.get(6).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getModifiers()", sortedMethods.get(7).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getName()", sortedMethods.get(8).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getNameExpr()", sortedMethods.get(9).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getParameters()", sortedMethods.get(10).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getThrows()", sortedMethods.get(11).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getTypeParameters()", sortedMethods.get(12).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setBody(com.github.javaparser.ast.stmt.BlockStmt)", sortedMethods.get(13).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setModifiers(java.util.EnumSet<com.github.javaparser.ast.Modifier>)", sortedMethods.get(14).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setName(java.lang.String)", sortedMethods.get(15).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setNameExpr(com.github.javaparser.ast.expr.NameExpr)", sortedMethods.get(16).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setParameters(java.util.List<com.github.javaparser.ast.body.Parameter>)", sortedMethods.get(17).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setThrows(java.util.List<com.github.javaparser.ast.type.ReferenceType>)", sortedMethods.get(18).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setTypeParameters(java.util.List<com.github.javaparser.ast.type.TypeParameter>)", sortedMethods.get(19).getQualifiedSignature());
+ }
+
+ @Test
+ public void testGetAllMethods() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ Set<MethodUsage> allMethods = constructorDeclaration.getAllMethods();
+
+ List<MethodUsage> sortedMethods = allMethods.stream()
+ .sorted((o1, o2) -> o1.getQualifiedSignature().compareTo(o2.getQualifiedSignature()))
+ .collect(Collectors.toList());
+
+ List<String> signatures = sortedMethods.stream().map(m -> m.getQualifiedSignature()).collect(Collectors.toList());
+
+ assertEquals(ImmutableList.of("com.github.javaparser.ast.Node.addOrphanComment(com.github.javaparser.ast.comments.Comment)",
+ "com.github.javaparser.ast.Node.clone()",
+ "com.github.javaparser.ast.Node.contains(com.github.javaparser.ast.Node)",
+ "com.github.javaparser.ast.Node.equals(java.lang.Object)",
+ "com.github.javaparser.ast.Node.getAllContainedComments()",
+ "com.github.javaparser.ast.Node.getBegin()",
+ "com.github.javaparser.ast.Node.getChildrenNodes()",
+ "com.github.javaparser.ast.Node.getComment()",
+ "com.github.javaparser.ast.Node.getEnd()",
+ "com.github.javaparser.ast.Node.getNodesByType(java.lang.Class<N>)",
+ "com.github.javaparser.ast.Node.getOrphanComments()",
+ "com.github.javaparser.ast.Node.getParentNode()",
+ "com.github.javaparser.ast.Node.getParentNodeOfType(java.lang.Class<T>)",
+ "com.github.javaparser.ast.Node.getRange()",
+ "com.github.javaparser.ast.Node.getUserData(com.github.javaparser.ast.UserDataKey<M>)",
+ "com.github.javaparser.ast.Node.hasComment()",
+ "com.github.javaparser.ast.Node.hashCode()",
+ "com.github.javaparser.ast.Node.isPositionedAfter(com.github.javaparser.Position)",
+ "com.github.javaparser.ast.Node.isPositionedBefore(com.github.javaparser.Position)",
+ "com.github.javaparser.ast.Node.setAsParentNodeOf(com.github.javaparser.ast.Node)",
+ "com.github.javaparser.ast.Node.setAsParentNodeOf(java.util.List<? extends com.github.javaparser.ast.Node>)",
+ "com.github.javaparser.ast.Node.setBegin(com.github.javaparser.Position)",
+ "com.github.javaparser.ast.Node.setBlockComment(java.lang.String)",
+ "com.github.javaparser.ast.Node.setComment(com.github.javaparser.ast.comments.Comment)",
+ "com.github.javaparser.ast.Node.setEnd(com.github.javaparser.Position)",
+ "com.github.javaparser.ast.Node.setLineComment(java.lang.String)",
+ "com.github.javaparser.ast.Node.setParentNode(com.github.javaparser.ast.Node)",
+ "com.github.javaparser.ast.Node.setRange(com.github.javaparser.Range)",
+ "com.github.javaparser.ast.Node.setUserData(com.github.javaparser.ast.UserDataKey<M>, M)",
+ "com.github.javaparser.ast.Node.toString()",
+ "com.github.javaparser.ast.Node.toStringWithoutComments()",
+ "com.github.javaparser.ast.Node.tryAddImportToParentCompilationUnit(java.lang.Class<?>)",
+ "com.github.javaparser.ast.body.BodyDeclaration.getAnnotations()",
+ "com.github.javaparser.ast.body.BodyDeclaration.setAnnotations(java.util.List<com.github.javaparser.ast.expr.AnnotationExpr>)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.accept(com.github.javaparser.ast.visitor.GenericVisitor<R, A>, A)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.accept(com.github.javaparser.ast.visitor.VoidVisitor<A>, A)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getBody()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString(boolean, boolean)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString(boolean, boolean, boolean)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getJavaDoc()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getModifiers()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getName()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getNameExpr()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getParameters()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getThrows()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getTypeParameters()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setBody(com.github.javaparser.ast.stmt.BlockStmt)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setModifiers(java.util.EnumSet<com.github.javaparser.ast.Modifier>)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setName(java.lang.String)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setNameExpr(com.github.javaparser.ast.expr.NameExpr)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setParameters(java.util.List<com.github.javaparser.ast.body.Parameter>)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setThrows(java.util.List<com.github.javaparser.ast.type.ReferenceType>)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setTypeParameters(java.util.List<com.github.javaparser.ast.type.TypeParameter>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addAnnotation(java.lang.Class<? extends java.lang.annotation.Annotation>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addAnnotation(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addMarkerAnnotation(java.lang.Class<? extends java.lang.annotation.Annotation>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addMarkerAnnotation(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addSingleMemberAnnotation(java.lang.Class<? extends java.lang.annotation.Annotation>, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addSingleMemberAnnotation(java.lang.String, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.getAnnotationByClass(java.lang.Class<? extends java.lang.annotation.Annotation>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.getAnnotationByName(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.isAnnotationPresent(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.createBody()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.setJavaDocComment(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.addModifier(com.github.javaparser.ast.Modifier...)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isAbstract()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isFinal()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isNative()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isPrivate()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isProtected()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isPublic()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isStatic()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isStrictfp()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isSynchronized()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isTransient()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isVolatile()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addAndGetParameter(com.github.javaparser.ast.body.Parameter)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addAndGetParameter(com.github.javaparser.ast.type.Type, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addAndGetParameter(java.lang.Class<?>, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addAndGetParameter(java.lang.String, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addParameter(com.github.javaparser.ast.body.Parameter)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addParameter(com.github.javaparser.ast.type.Type, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addParameter(java.lang.Class<?>, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addParameter(java.lang.String, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.getParamByName(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.getParamByType(java.lang.Class<?>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.getParamByType(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithThrowable.addThrows(com.github.javaparser.ast.type.ReferenceType)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithThrowable.addThrows(java.lang.Class<? extends java.lang.Throwable>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithThrowable.isThrows(java.lang.Class<? extends java.lang.Throwable>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithThrowable.isThrows(java.lang.String)",
+ "java.lang.Object.finalize()",
+ "java.lang.Object.getClass()",
+ "java.lang.Object.notify()",
+ "java.lang.Object.notifyAll()",
+ "java.lang.Object.registerNatives()",
+ "java.lang.Object.wait()",
+ "java.lang.Object.wait(long)",
+ "java.lang.Object.wait(long, int)"), signatures);
+ }
+
+ ///
+ /// Test constructors
+ ///
+
+ @Test
+ public void testGetConstructors() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ List<ConstructorDeclaration> constructors = constructorDeclaration.getConstructors();
+ assertEquals(4, constructors.size());
+
+ assertEquals("ConstructorDeclaration()", constructors.get(0).getSignature());
+ assertEquals("ConstructorDeclaration(java.util.EnumSet<com.github.javaparser.ast.Modifier>, java.lang.String)", constructors.get(1).getSignature());
+ assertEquals("ConstructorDeclaration(java.util.EnumSet<com.github.javaparser.ast.Modifier>, java.util.List<com.github.javaparser.ast.expr.AnnotationExpr>, java.util.List<com.github.javaparser.ast.type.TypeParameter>, java.lang.String, java.util.List<com.github.javaparser.ast.body.Parameter>, java.util.List<com.github.javaparser.ast.type.ReferenceType>, com.github.javaparser.ast.stmt.BlockStmt)", constructors.get(2).getSignature());
+ assertEquals("ConstructorDeclaration(com.github.javaparser.Range, java.util.EnumSet<com.github.javaparser.ast.Modifier>, java.util.List<com.github.javaparser.ast.expr.AnnotationExpr>, java.util.List<com.github.javaparser.ast.type.TypeParameter>, java.lang.String, java.util.List<com.github.javaparser.ast.body.Parameter>, java.util.List<com.github.javaparser.ast.type.ReferenceType>, com.github.javaparser.ast.stmt.BlockStmt)", constructors.get(3).getSignature());
+ }
+
+ ///
+ /// Resolution
+ ///
+
+ //SymbolReference<MethodDeclaration> solveMethod(String name, List<Type> parameterTypes);
+ @Test
+ public void testSolveMethodExisting() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<MethodDeclaration> res = null;
+
+ res = constructorDeclaration.solveMethod("isStatic", ImmutableList.of());
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isStatic()", res.getCorrespondingDeclaration().getQualifiedSignature());
+
+ res = constructorDeclaration.solveMethod("isThrows", ImmutableList.of(ReflectionFactory.typeUsageFor(RuntimeException.class.getClass(), typeSolverNewCode)));
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.isThrows(java.lang.Class<? extends java.lang.Throwable>)", res.getCorrespondingDeclaration().getQualifiedSignature());
+
+ res = constructorDeclaration.solveMethod("isThrows", ImmutableList.of(ReflectionFactory.typeUsageFor(String.class, typeSolverNewCode)));
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.isThrows(java.lang.String)", res.getCorrespondingDeclaration().getQualifiedSignature());
+
+ // This is solved because it is raw
+ res = constructorDeclaration.solveMethod("isThrows", ImmutableList.of(ReflectionFactory.typeUsageFor(Class.class, typeSolverNewCode)));
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.isThrows(java.lang.Class<? extends java.lang.Throwable>)", res.getCorrespondingDeclaration().getQualifiedSignature());
+ }
+
+ @Test
+ public void testSolveMethodNotExisting() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<MethodDeclaration> res = null;
+
+ res = constructorDeclaration.solveMethod("unexistingMethod", ImmutableList.of());
+ assertEquals(false, res.isSolved());
+
+ res = constructorDeclaration.solveMethod("isStatic", ImmutableList.of(PrimitiveType.BOOLEAN));
+ assertEquals(false, res.isSolved());
+ }
+
+ @Test
+ public void testSolveMethodNotExistingBecauseOfTypeParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<MethodDeclaration> res = null;
+
+ ReferenceType stringType = (ReferenceType) ReflectionFactory.typeUsageFor(String.class, typeSolverNewCode);
+ ReferenceType rawClassType = (ReferenceType) ReflectionFactory.typeUsageFor(Class.class, typeSolverNewCode);
+ ReferenceType classOfStringType = (ReferenceType) rawClassType.replaceTypeVariables("T", stringType);
+ res = constructorDeclaration.solveMethod("isThrows", ImmutableList.of(classOfStringType));
+ assertEquals(false, res.isSolved());
+ }
+
+ @Test
+ public void testSolveSymbolUnexisting() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<? extends ValueDeclaration> res = constructorDeclaration.solveSymbol("unexisting", typeSolver);
+ assertEquals(false, res.isSolved());
+ }
+
+ @Test
+ public void testSolveSymbolToDeclaredField() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<? extends ValueDeclaration> res = constructorDeclaration.solveSymbol("name", typeSolver);
+ assertEquals(true, res.isSolved());
+ assertEquals(true, res.getCorrespondingDeclaration().isField());
+ }
+
+ @Test
+ public void testSolveSymbolToInheritedPublicField() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<? extends ValueDeclaration> res = constructorDeclaration.solveSymbol("NODE_BY_BEGIN_POSITION", typeSolver);
+ assertEquals(true, res.isSolved());
+ assertEquals(true, res.getCorrespondingDeclaration().isField());
+ }
+
+ @Test
+ public void testSolveSymbolToInheritedPrivateField() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<? extends ValueDeclaration> res = constructorDeclaration.solveSymbol("parentNode", typeSolver);
+ assertEquals(false, res.isSolved());
+ }
+
+ ///
+ /// Assignability
+ ///
+
+ // boolean isAssignableBy(Type type);
+
+ // boolean canBeAssignedTo(TypeDeclaration other)
+
+ // boolean isAssignableBy(TypeDeclaration other);
+
+ ///
+ /// Annotations
+ ///
+
+ // hasDirectlyAnnotation
+
+ // hasAnnotation
+
+ ///
+ ///
+ ///
+
+ // List<TypeParameterDeclaration> getTypeParameters();
+
+ // AccessLevel accessLevel();
+
+ ///
+ /// Containment
+ ///
+
+ // Set<TypeDeclaration> internalTypes()
+
+ // Optional<TypeDeclaration> containerType()*/
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserInterfaceDeclarationTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserInterfaceDeclarationTest.java
new file mode 100644
index 000000000..cf5e5802b
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserInterfaceDeclarationTest.java
@@ -0,0 +1,826 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.javaparsermodel.declarations;
+
+import com.github.javaparser.symbolsolver.AbstractTest;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+
+public class JavaParserInterfaceDeclarationTest extends AbstractTest {
+
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() {
+ File srcNewCode = adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-core"));
+ CombinedTypeSolver combinedTypeSolverNewCode = new CombinedTypeSolver();
+ combinedTypeSolverNewCode.add(new ReflectionTypeSolver());
+ combinedTypeSolverNewCode.add(new JavaParserTypeSolver(srcNewCode));
+ combinedTypeSolverNewCode.add(new JavaParserTypeSolver(adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-generated-sources"))));
+ typeSolver = combinedTypeSolverNewCode;
+ }
+
+ ///
+ /// Test misc
+ ///
+
+ @Test
+ public void testIsClass() {
+ JavaParserInterfaceDeclaration nodeWithAnnotations = (JavaParserInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(false, nodeWithAnnotations.isClass());
+ }
+
+ @Test
+ public void testIsInterface() {
+ JavaParserInterfaceDeclaration nodeWithAnnotations = (JavaParserInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(true, nodeWithAnnotations.isInterface());
+ }
+
+ @Test
+ public void testIsEnum() {
+ JavaParserInterfaceDeclaration nodeWithAnnotations = (JavaParserInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(false, nodeWithAnnotations.isEnum());
+ }
+
+ @Test
+ public void testIsTypeVariable() {
+ JavaParserInterfaceDeclaration nodeWithAnnotations = (JavaParserInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(false, nodeWithAnnotations.isTypeParameter());
+ }
+
+ @Test
+ public void testIsType() {
+ JavaParserInterfaceDeclaration nodeWithAnnotations = (JavaParserInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(true, nodeWithAnnotations.isType());
+ }
+
+ @Test
+ public void testAsType() {
+ JavaParserInterfaceDeclaration nodeWithAnnotations = (JavaParserInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(nodeWithAnnotations, nodeWithAnnotations.asType());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsClass() {
+ JavaParserInterfaceDeclaration nodeWithAnnotations = (JavaParserInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(nodeWithAnnotations, nodeWithAnnotations.asClass());
+ }
+
+ @Test
+ public void testAsInterface() {
+ JavaParserInterfaceDeclaration nodeWithAnnotations = (JavaParserInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(nodeWithAnnotations, nodeWithAnnotations.asInterface());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsEnum() {
+ JavaParserInterfaceDeclaration nodeWithAnnotations = (JavaParserInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ nodeWithAnnotations.asEnum();
+ }
+
+ @Test
+ public void testGetPackageName() {
+ JavaParserInterfaceDeclaration nodeWithAnnotations = (JavaParserInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals("com.github.javaparser.ast.nodeTypes", nodeWithAnnotations.getPackageName());
+ }
+
+ @Test
+ public void testGetClassName() {
+ JavaParserInterfaceDeclaration nodeWithAnnotations = (JavaParserInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals("NodeWithAnnotations", nodeWithAnnotations.getClassName());
+ }
+
+ @Test
+ public void testGetQualifiedName() {
+ JavaParserInterfaceDeclaration nodeWithAnnotations = (JavaParserInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations", nodeWithAnnotations.getQualifiedName());
+ }
+
+ ///
+ /// Test ancestors
+ ///
+
+ /*@Test
+ public void testGetSuperclassWithoutTypeParameters() {
+ JavaParserInterfaceDeclaration nodeWithAnnotations = (JavaParserInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals("com.github.javaparser.ast.Node", compilationUnit.getSuperClass().getQualifiedName());
+ }
+
+ @Test
+ public void testGetSuperclassWithTypeParameters() {
+ JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", compilationUnit.getSuperClass().getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", compilationUnit.getSuperClass().typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAllSuperclassesWithoutTypeParameters() {
+ JavaParserClassDeclaration cu = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of("com.github.javaparser.ast.Node", "java.lang.Object"), cu.getAllSuperClasses().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllSuperclassesWithTypeParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(3, constructorDeclaration.getAllSuperClasses().size());
+
+ ReferenceType ancestor = null;
+
+ ancestor = constructorDeclaration.getAllSuperClasses().get(0);
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllSuperClasses().get(1);
+ assertEquals("com.github.javaparser.ast.Node", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllSuperClasses().get(2);
+ assertEquals("java.lang.Object", ancestor.getQualifiedName());
+ }
+
+ @Test
+ public void testGetInterfacesWithoutParameters() {
+ JavaParserInterfaceDeclaration nodeWithAnnotations = (JavaParserInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(ImmutableSet.of(), compilationUnit.getInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+
+ JavaParserClassDeclaration coid = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.body.ClassOrInterfaceDeclaration");
+ assertEquals(ImmutableSet.of("com.github.javaparser.ast.DocumentableNode"), coid.getInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetInterfacesWithParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(7, constructorDeclaration.getInterfaces().size());
+
+ ReferenceType interfaze = null;
+
+ interfaze = constructorDeclaration.getInterfaces().get(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(1);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(2);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithName", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithName.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(4);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAllInterfacesWithoutParameters() {
+ JavaParserInterfaceDeclaration nodeWithAnnotations = (JavaParserInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(ImmutableSet.of("java.lang.Cloneable"), compilationUnit.getAllInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+
+ JavaParserClassDeclaration coid = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.body.ClassOrInterfaceDeclaration");
+ assertEquals(ImmutableSet.of("java.lang.Cloneable", "com.github.javaparser.ast.NamedNode", "com.github.javaparser.ast.body.AnnotableNode", "com.github.javaparser.ast.DocumentableNode"), coid.getAllInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllInterfacesWithParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(9, constructorDeclaration.getAllInterfaces().size());
+
+ ReferenceType interfaze = null;
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(1);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(2);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithName", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithName.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(4);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(7);
+ assertEquals("java.lang.Cloneable", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(8);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAncestorsWithTypeParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(8, constructorDeclaration.getAncestors().size());
+
+ ReferenceType ancestor = null;
+
+ ancestor = constructorDeclaration.getAncestors().get(0);
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(1);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(2);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithName", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithName.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(4);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(7);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAllAncestorsWithoutTypeParameters() {
+ JavaParserClassDeclaration cu = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of("java.lang.Cloneable", "com.github.javaparser.ast.Node", "java.lang.Object"), cu.getAllAncestors().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllAncestorsWithTypeParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(12, constructorDeclaration.getAllAncestors().size());
+
+ ReferenceType ancestor = null;
+
+ ancestor = constructorDeclaration.getAllAncestors().get(0);
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(1);
+ assertEquals("com.github.javaparser.ast.Node", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(2);
+ assertEquals("java.lang.Cloneable", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(4);
+ assertEquals("java.lang.Object", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(7);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithName", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithName.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(8);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(9);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(10);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(11);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.T").get().asReferenceType().getQualifiedName());
+ }
+
+ ///
+ /// Test fields
+ ///
+
+ @Test
+ public void testGetFieldForExistingField() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ FieldDeclaration fieldDeclaration = null;
+
+ // declared field
+ fieldDeclaration = constructorDeclaration.getField("modifiers");
+ assertEquals("modifiers", fieldDeclaration.getName());
+ assertEquals("java.util.EnumSet", fieldDeclaration.getType().asReferenceType().getQualifiedName());
+ assertEquals(AccessLevel.PRIVATE, fieldDeclaration.accessLevel());
+ assertEquals(false, fieldDeclaration.isStatic());
+
+ // inherited field
+ fieldDeclaration = constructorDeclaration.getField("annotations");
+ assertEquals("annotations", fieldDeclaration.getName());
+ assertEquals("java.util.List", fieldDeclaration.getType().asReferenceType().getQualifiedName());
+ assertEquals(AccessLevel.PRIVATE, fieldDeclaration.accessLevel());
+ }
+
+ @Test(expected = UnsolvedSymbolException.class)
+ public void testGetFieldForUnexistingField() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ constructorDeclaration.getField("unexisting");
+ }
+
+ @Test
+ public void testGetAllFields() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ List<FieldDeclaration> allFields = constructorDeclaration.getAllFields();
+ assertEquals(16, allFields.size());
+
+ FieldDeclaration fieldDeclaration = null;
+
+ fieldDeclaration = allFields.get(0);
+ assertEquals("modifiers", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(1);
+ assertEquals("typeParameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(2);
+ assertEquals("name", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(3);
+ assertEquals("parameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(4);
+ assertEquals("throws_", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(5);
+ assertEquals("body", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(6);
+ assertEquals("annotations", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(7);
+ assertEquals("NODE_BY_BEGIN_POSITION", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(8);
+ assertEquals("range", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(9);
+ assertEquals("parentNode", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(10);
+ assertEquals("childrenNodes", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(11);
+ assertEquals("orphanComments", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(12);
+ assertEquals("userData", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(13);
+ assertEquals("comment", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(14);
+ assertEquals("ABSOLUTE_BEGIN_LINE", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(15);
+ assertEquals("ABSOLUTE_END_LINE", fieldDeclaration.getName());
+ }
+
+ @Test
+ public void testGetAllStaticFields() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ List<FieldDeclaration> allFields = constructorDeclaration.getAllStaticFields();
+ assertEquals(3, allFields.size());
+
+ FieldDeclaration fieldDeclaration = null;
+
+ fieldDeclaration = allFields.get(0);
+ assertEquals("NODE_BY_BEGIN_POSITION", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(1);
+ assertEquals("ABSOLUTE_BEGIN_LINE", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(2);
+ assertEquals("ABSOLUTE_END_LINE", fieldDeclaration.getName());
+ }
+
+ @Test
+ public void testGetAllNonStaticFields() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ List<FieldDeclaration> allFields = constructorDeclaration.getAllNonStaticFields();
+ assertEquals(13, allFields.size());
+
+ FieldDeclaration fieldDeclaration = null;
+
+ fieldDeclaration = allFields.get(0);
+ assertEquals("modifiers", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(1);
+ assertEquals("typeParameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(2);
+ assertEquals("name", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(3);
+ assertEquals("parameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(4);
+ assertEquals("throws_", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(5);
+ assertEquals("body", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(6);
+ assertEquals("annotations", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(7);
+ assertEquals("range", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(8);
+ assertEquals("parentNode", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(9);
+ assertEquals("childrenNodes", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(10);
+ assertEquals("orphanComments", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(11);
+ assertEquals("userData", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(12);
+ assertEquals("comment", fieldDeclaration.getName());
+ }
+
+ @Test
+ public void testGetDeclaredFields() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ List<FieldDeclaration> allFields = constructorDeclaration.getDeclaredFields();
+ assertEquals(6, allFields.size());
+
+ FieldDeclaration fieldDeclaration = null;
+
+ fieldDeclaration = allFields.get(0);
+ assertEquals("modifiers", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(1);
+ assertEquals("typeParameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(2);
+ assertEquals("name", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(3);
+ assertEquals("parameters", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(4);
+ assertEquals("throws_", fieldDeclaration.getName());
+
+ fieldDeclaration = allFields.get(5);
+ assertEquals("body", fieldDeclaration.getName());
+ }
+
+ ///
+ /// Test methods
+ ///
+
+ @Test
+ public void testGetDeclaredMethods() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ Set<MethodDeclaration> allMethods = constructorDeclaration.getDeclaredMethods();
+ assertEquals(20, allMethods.size());
+
+ List<MethodDeclaration> sortedMethods = allMethods.stream()
+ .sorted((o1, o2) -> o1.getQualifiedSignature().compareTo(o2.getQualifiedSignature()))
+ .collect(Collectors.toList());
+
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.accept(com.github.javaparser.ast.visitor.GenericVisitor<R, A>, A)", sortedMethods.get(0).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.accept(com.github.javaparser.ast.visitor.VoidVisitor<A>, A)", sortedMethods.get(1).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getBody()", sortedMethods.get(2).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString()", sortedMethods.get(3).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString(boolean, boolean)", sortedMethods.get(4).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString(boolean, boolean, boolean)", sortedMethods.get(5).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getJavaDoc()", sortedMethods.get(6).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getModifiers()", sortedMethods.get(7).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getName()", sortedMethods.get(8).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getNameExpr()", sortedMethods.get(9).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getParameters()", sortedMethods.get(10).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getThrows()", sortedMethods.get(11).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.getTypeParameters()", sortedMethods.get(12).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setBody(com.github.javaparser.ast.stmt.BlockStmt)", sortedMethods.get(13).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setModifiers(java.util.EnumSet<com.github.javaparser.ast.Modifier>)", sortedMethods.get(14).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setName(java.lang.String)", sortedMethods.get(15).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setNameExpr(com.github.javaparser.ast.expr.NameExpr)", sortedMethods.get(16).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setParameters(java.util.List<com.github.javaparser.ast.body.Parameter>)", sortedMethods.get(17).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setThrows(java.util.List<com.github.javaparser.ast.type.ReferenceType>)", sortedMethods.get(18).getQualifiedSignature());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration.setTypeParameters(java.util.List<com.github.javaparser.ast.type.TypeParameter>)", sortedMethods.get(19).getQualifiedSignature());
+ }
+
+ @Test
+ public void testGetAllMethods() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ Set<MethodUsage> allMethods = constructorDeclaration.getAllMethods();
+
+ List<MethodUsage> sortedMethods = allMethods.stream()
+ .sorted((o1, o2) -> o1.getQualifiedSignature().compareTo(o2.getQualifiedSignature()))
+ .collect(Collectors.toList());
+
+ List<String> signatures = sortedMethods.stream().map(m -> m.getQualifiedSignature()).collect(Collectors.toList());
+
+ assertEquals(ImmutableList.of("com.github.javaparser.ast.Node.addOrphanComment(com.github.javaparser.ast.comments.Comment)",
+ "com.github.javaparser.ast.Node.clone()",
+ "com.github.javaparser.ast.Node.contains(com.github.javaparser.ast.Node)",
+ "com.github.javaparser.ast.Node.equals(java.lang.Object)",
+ "com.github.javaparser.ast.Node.getAllContainedComments()",
+ "com.github.javaparser.ast.Node.getBegin()",
+ "com.github.javaparser.ast.Node.getChildrenNodes()",
+ "com.github.javaparser.ast.Node.getComment()",
+ "com.github.javaparser.ast.Node.getEnd()",
+ "com.github.javaparser.ast.Node.getNodesByType(java.lang.Class<N>)",
+ "com.github.javaparser.ast.Node.getOrphanComments()",
+ "com.github.javaparser.ast.Node.getParentNode()",
+ "com.github.javaparser.ast.Node.getParentNodeOfType(java.lang.Class<T>)",
+ "com.github.javaparser.ast.Node.getRange()",
+ "com.github.javaparser.ast.Node.getUserData(com.github.javaparser.ast.UserDataKey<M>)",
+ "com.github.javaparser.ast.Node.hasComment()",
+ "com.github.javaparser.ast.Node.hashCode()",
+ "com.github.javaparser.ast.Node.isPositionedAfter(com.github.javaparser.Position)",
+ "com.github.javaparser.ast.Node.isPositionedBefore(com.github.javaparser.Position)",
+ "com.github.javaparser.ast.Node.setAsParentNodeOf(com.github.javaparser.ast.Node)",
+ "com.github.javaparser.ast.Node.setAsParentNodeOf(java.util.List<? extends com.github.javaparser.ast.Node>)",
+ "com.github.javaparser.ast.Node.setBegin(com.github.javaparser.Position)",
+ "com.github.javaparser.ast.Node.setBlockComment(java.lang.String)",
+ "com.github.javaparser.ast.Node.setComment(com.github.javaparser.ast.comments.Comment)",
+ "com.github.javaparser.ast.Node.setEnd(com.github.javaparser.Position)",
+ "com.github.javaparser.ast.Node.setLineComment(java.lang.String)",
+ "com.github.javaparser.ast.Node.setParentNode(com.github.javaparser.ast.Node)",
+ "com.github.javaparser.ast.Node.setRange(com.github.javaparser.Range)",
+ "com.github.javaparser.ast.Node.setUserData(com.github.javaparser.ast.UserDataKey<M>, M)",
+ "com.github.javaparser.ast.Node.toString()",
+ "com.github.javaparser.ast.Node.toStringWithoutComments()",
+ "com.github.javaparser.ast.Node.tryAddImportToParentCompilationUnit(java.lang.Class<?>)",
+ "com.github.javaparser.ast.body.BodyDeclaration.getAnnotations()",
+ "com.github.javaparser.ast.body.BodyDeclaration.setAnnotations(java.util.List<com.github.javaparser.ast.expr.AnnotationExpr>)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.accept(com.github.javaparser.ast.visitor.GenericVisitor<R, A>, A)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.accept(com.github.javaparser.ast.visitor.VoidVisitor<A>, A)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getBody()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString(boolean, boolean)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getDeclarationAsString(boolean, boolean, boolean)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getJavaDoc()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getModifiers()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getName()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getNameExpr()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getParameters()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getThrows()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.getTypeParameters()",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setBody(com.github.javaparser.ast.stmt.BlockStmt)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setModifiers(java.util.EnumSet<com.github.javaparser.ast.Modifier>)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setName(java.lang.String)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setNameExpr(com.github.javaparser.ast.expr.NameExpr)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setParameters(java.util.List<com.github.javaparser.ast.body.Parameter>)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setThrows(java.util.List<com.github.javaparser.ast.type.ReferenceType>)",
+ "com.github.javaparser.ast.body.ConstructorDeclaration.setTypeParameters(java.util.List<com.github.javaparser.ast.type.TypeParameter>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addAnnotation(java.lang.Class<? extends java.lang.annotation.Annotation>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addAnnotation(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addMarkerAnnotation(java.lang.Class<? extends java.lang.annotation.Annotation>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addMarkerAnnotation(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addSingleMemberAnnotation(java.lang.Class<? extends java.lang.annotation.Annotation>, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.addSingleMemberAnnotation(java.lang.String, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.getAnnotationByClass(java.lang.Class<? extends java.lang.annotation.Annotation>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.getAnnotationByName(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.isAnnotationPresent(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.createBody()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.setJavaDocComment(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.addModifier(com.github.javaparser.ast.Modifier...)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isAbstract()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isFinal()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isNative()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isPrivate()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isProtected()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isPublic()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isStatic()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isStrictfp()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isSynchronized()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isTransient()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isVolatile()",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addAndGetParameter(com.github.javaparser.ast.body.Parameter)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addAndGetParameter(com.github.javaparser.ast.type.Type, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addAndGetParameter(java.lang.Class<?>, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addAndGetParameter(java.lang.String, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addParameter(com.github.javaparser.ast.body.Parameter)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addParameter(com.github.javaparser.ast.type.Type, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addParameter(java.lang.Class<?>, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.addParameter(java.lang.String, java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.getParamByName(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.getParamByType(java.lang.Class<?>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithParameters.getParamByType(java.lang.String)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithThrowable.addThrows(com.github.javaparser.ast.type.ReferenceType)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithThrowable.addThrows(java.lang.Class<? extends java.lang.Throwable>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithThrowable.isThrows(java.lang.Class<? extends java.lang.Throwable>)",
+ "com.github.javaparser.ast.nodeTypes.NodeWithThrowable.isThrows(java.lang.String)",
+ "java.lang.Object.finalize()",
+ "java.lang.Object.getClass()",
+ "java.lang.Object.notify()",
+ "java.lang.Object.notifyAll()",
+ "java.lang.Object.registerNatives()",
+ "java.lang.Object.wait()",
+ "java.lang.Object.wait(long)",
+ "java.lang.Object.wait(long, int)"), signatures);
+ }
+
+ ///
+ /// Test constructors
+ ///
+
+ @Test
+ public void testGetConstructors() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ List<ConstructorDeclaration> constructors = constructorDeclaration.getConstructors();
+ assertEquals(4, constructors.size());
+
+ assertEquals("ConstructorDeclaration()", constructors.get(0).getSignature());
+ assertEquals("ConstructorDeclaration(java.util.EnumSet<com.github.javaparser.ast.Modifier>, java.lang.String)", constructors.get(1).getSignature());
+ assertEquals("ConstructorDeclaration(java.util.EnumSet<com.github.javaparser.ast.Modifier>, java.util.List<com.github.javaparser.ast.expr.AnnotationExpr>, java.util.List<com.github.javaparser.ast.type.TypeParameter>, java.lang.String, java.util.List<com.github.javaparser.ast.body.Parameter>, java.util.List<com.github.javaparser.ast.type.ReferenceType>, com.github.javaparser.ast.stmt.BlockStmt)", constructors.get(2).getSignature());
+ assertEquals("ConstructorDeclaration(com.github.javaparser.Range, java.util.EnumSet<com.github.javaparser.ast.Modifier>, java.util.List<com.github.javaparser.ast.expr.AnnotationExpr>, java.util.List<com.github.javaparser.ast.type.TypeParameter>, java.lang.String, java.util.List<com.github.javaparser.ast.body.Parameter>, java.util.List<com.github.javaparser.ast.type.ReferenceType>, com.github.javaparser.ast.stmt.BlockStmt)", constructors.get(3).getSignature());
+ }
+
+ ///
+ /// Resolution
+ ///
+
+ //SymbolReference<MethodDeclaration> solveMethod(String name, List<Type> parameterTypes);
+ @Test
+ public void testSolveMethodExisting() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<MethodDeclaration> res = null;
+
+ res = constructorDeclaration.solveMethod("isStatic", ImmutableList.of());
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.isStatic()", res.getCorrespondingDeclaration().getQualifiedSignature());
+
+ res = constructorDeclaration.solveMethod("isThrows", ImmutableList.of(ReflectionFactory.typeUsageFor(RuntimeException.class.getClass(), typeSolverNewCode)));
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.isThrows(java.lang.Class<? extends java.lang.Throwable>)", res.getCorrespondingDeclaration().getQualifiedSignature());
+
+ res = constructorDeclaration.solveMethod("isThrows", ImmutableList.of(ReflectionFactory.typeUsageFor(String.class, typeSolverNewCode)));
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.isThrows(java.lang.String)", res.getCorrespondingDeclaration().getQualifiedSignature());
+
+ // This is solved because it is raw
+ res = constructorDeclaration.solveMethod("isThrows", ImmutableList.of(ReflectionFactory.typeUsageFor(Class.class, typeSolverNewCode)));
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.isThrows(java.lang.Class<? extends java.lang.Throwable>)", res.getCorrespondingDeclaration().getQualifiedSignature());
+ }
+
+ @Test
+ public void testSolveMethodNotExisting() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<MethodDeclaration> res = null;
+
+ res = constructorDeclaration.solveMethod("unexistingMethod", ImmutableList.of());
+ assertEquals(false, res.isSolved());
+
+ res = constructorDeclaration.solveMethod("isStatic", ImmutableList.of(PrimitiveType.BOOLEAN));
+ assertEquals(false, res.isSolved());
+ }
+
+ @Test
+ public void testSolveMethodNotExistingBecauseOfTypeParameters() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<MethodDeclaration> res = null;
+
+ ReferenceType stringType = (ReferenceType) ReflectionFactory.typeUsageFor(String.class, typeSolverNewCode);
+ ReferenceType rawClassType = (ReferenceType) ReflectionFactory.typeUsageFor(Class.class, typeSolverNewCode);
+ ReferenceType classOfStringType = (ReferenceType) rawClassType.replaceTypeVariables("T", stringType);
+ res = constructorDeclaration.solveMethod("isThrows", ImmutableList.of(classOfStringType));
+ assertEquals(false, res.isSolved());
+ }
+
+ @Test
+ public void testSolveSymbolUnexisting() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<? extends ValueDeclaration> res = constructorDeclaration.solveSymbol("unexisting", typeSolver);
+ assertEquals(false, res.isSolved());
+ }
+
+ @Test
+ public void testSolveSymbolToDeclaredField() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<? extends ValueDeclaration> res = constructorDeclaration.solveSymbol("name", typeSolver);
+ assertEquals(true, res.isSolved());
+ assertEquals(true, res.getCorrespondingDeclaration().isField());
+ }
+
+ @Test
+ public void testSolveSymbolToInheritedPublicField() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<? extends ValueDeclaration> res = constructorDeclaration.solveSymbol("NODE_BY_BEGIN_POSITION", typeSolver);
+ assertEquals(true, res.isSolved());
+ assertEquals(true, res.getCorrespondingDeclaration().isField());
+ }
+
+ @Test
+ public void testSolveSymbolToInheritedPrivateField() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<? extends ValueDeclaration> res = constructorDeclaration.solveSymbol("parentNode", typeSolver);
+ assertEquals(false, res.isSolved());
+ }
+
+ ///
+ /// Assignability
+ ///
+
+ // boolean isAssignableBy(Type type);
+
+ // boolean canBeAssignedTo(TypeDeclaration other)
+
+ // boolean isAssignableBy(TypeDeclaration other);
+
+ ///
+ /// Annotations
+ ///
+
+ // hasDirectlyAnnotation
+
+ // hasAnnotation
+
+ ///
+ ///
+ ///
+
+ // List<TypeParameterDeclaration> getTypeParameters();
+
+ // AccessLevel accessLevel();
+
+ ///
+ /// Containment
+ ///
+
+ // Set<TypeDeclaration> internalTypes()
+
+ // Optional<TypeDeclaration> containerType()*/
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javassistmodel/Issue257.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javassistmodel/Issue257.java
new file mode 100644
index 000000000..460b51667
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javassistmodel/Issue257.java
@@ -0,0 +1,47 @@
+package com.github.javaparser.symbolsolver.javassistmodel;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.ast.stmt.Statement;
+import com.github.javaparser.symbolsolver.AbstractTest;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+public class Issue257 extends AbstractTest {
+
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() throws IOException {
+ String pathToJar = adaptPath("src/test/resources/issue257/issue257.jar");
+ File jar = new File(pathToJar);
+ typeSolver = new CombinedTypeSolver(new JarTypeSolver(jar.getAbsolutePath()), new ReflectionTypeSolver());
+ }
+
+ @Test
+ public void verifyBCanBeSolved() throws FileNotFoundException {
+ typeSolver.solveType("net.testbug.B");
+ }
+
+ @Test
+ public void issue257() throws FileNotFoundException {
+ String pathToSourceFile = adaptPath("src/test/resources/issue257/A.java.txt");
+ CompilationUnit cu = JavaParser.parse(new File(pathToSourceFile));
+ Statement statement = cu.getClassByName("A").get().getMethodsByName("run").get(0).getBody().get().getStatement(0);
+ ExpressionStmt expressionStmt = (ExpressionStmt)statement;
+ Expression expression = expressionStmt.getExpression();
+ JavaParserFacade.get(typeSolver).getType(expression);
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistClassDeclarationTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistClassDeclarationTest.java
new file mode 100644
index 000000000..9f55977c5
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistClassDeclarationTest.java
@@ -0,0 +1,404 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.javassistmodel;
+
+import com.github.javaparser.resolution.types.ResolvedReferenceType;
+import com.github.javaparser.symbolsolver.AbstractTest;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import com.google.common.collect.ImmutableSet;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+
+public class JavassistClassDeclarationTest extends AbstractTest {
+
+ private TypeSolver typeSolver;
+
+ private TypeSolver newTypeSolver;
+
+ @Before
+ public void setup() throws IOException {
+ String pathToJar = adaptPath("src/test/resources/javaparser-core-2.1.0.jar");
+ typeSolver = new CombinedTypeSolver(new JarTypeSolver(pathToJar), new ReflectionTypeSolver());
+
+ String newPathToJar = adaptPath("src/test/resources/javaparser-core-3.0.0-alpha.2.jar");
+ newTypeSolver = new CombinedTypeSolver(new JarTypeSolver(newPathToJar), new ReflectionTypeSolver());
+ }
+
+ ///
+ /// Test misc
+ ///
+
+ @Test
+ public void testIsClass() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(true, compilationUnit.isClass());
+ }
+
+ @Test
+ public void testIsInterface() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(false, compilationUnit.isInterface());
+ }
+
+ @Test
+ public void testIsEnum() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(false, compilationUnit.isEnum());
+ }
+
+ @Test
+ public void testIsTypeVariable() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(false, compilationUnit.isTypeParameter());
+ }
+
+ @Test
+ public void testIsType() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(true, compilationUnit.isType());
+ }
+
+ @Test
+ public void testAsType() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(compilationUnit, compilationUnit.asType());
+ }
+
+ @Test
+ public void testAsClass() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(compilationUnit, compilationUnit.asClass());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsInterface() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ compilationUnit.asInterface();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsEnum() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ compilationUnit.asEnum();
+ }
+
+ @Test
+ public void testGetPackageName() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals("com.github.javaparser.ast", compilationUnit.getPackageName());
+ }
+
+ @Test
+ public void testGetClassName() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals("CompilationUnit", compilationUnit.getClassName());
+ }
+
+ @Test
+ public void testGetQualifiedName() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals("com.github.javaparser.ast.CompilationUnit", compilationUnit.getQualifiedName());
+ }
+
+ ///
+ /// Test ancestors
+ ///
+
+ @Test
+ public void testGetSuperclass() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals("com.github.javaparser.ast.Node", compilationUnit.getSuperClass().getQualifiedName());
+ }
+
+ @Test
+ public void testGetSuperclassWithoutTypeParameters() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) newTypeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals("com.github.javaparser.ast.Node", compilationUnit.getSuperClass().getQualifiedName());
+ }
+
+ @Test
+ public void testGetSuperclassWithTypeParameters() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) newTypeSolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", compilationUnit.getSuperClass().getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", compilationUnit.getSuperClass().typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAllSuperclasses() {
+ JavassistClassDeclaration cu = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of("com.github.javaparser.ast.Node", "java.lang.Object"), cu.getAllSuperClasses().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllAncestors() {
+ JavassistClassDeclaration cu = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of("com.github.javaparser.ast.Node", "java.lang.Object"), cu.getAllAncestors().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetInterfaces() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of(), compilationUnit.getInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+
+ JavassistClassDeclaration coid = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.body.ClassOrInterfaceDeclaration");
+ assertEquals(ImmutableSet.of("com.github.javaparser.ast.DocumentableNode"), coid.getInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllInterfaces() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of(), compilationUnit.getAllInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+
+ JavassistClassDeclaration coid = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.body.ClassOrInterfaceDeclaration");
+ assertEquals(ImmutableSet.of("com.github.javaparser.ast.NamedNode", "com.github.javaparser.ast.body.AnnotableNode", "com.github.javaparser.ast.DocumentableNode"), coid.getAllInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllSuperclassesWithoutTypeParameters() {
+ JavassistClassDeclaration cu = (JavassistClassDeclaration) newTypeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of("com.github.javaparser.ast.Node", "java.lang.Object"), cu.getAllSuperClasses().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllSuperclassesWithTypeParameters() {
+ JavassistClassDeclaration constructorDeclaration = (JavassistClassDeclaration) newTypeSolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(3, constructorDeclaration.getAllSuperClasses().size());
+ assertEquals(true, constructorDeclaration.getAllSuperClasses().stream().anyMatch(s -> s.getQualifiedName().equals("com.github.javaparser.ast.body.BodyDeclaration")));
+ assertEquals(true, constructorDeclaration.getAllSuperClasses().stream().anyMatch(s -> s.getQualifiedName().equals("com.github.javaparser.ast.Node")));
+ assertEquals(true, constructorDeclaration.getAllSuperClasses().stream().anyMatch(s -> s.getQualifiedName().equals("java.lang.Object")));
+
+ ResolvedReferenceType ancestor = null;
+
+ ancestor = constructorDeclaration.getAllSuperClasses().get(0);
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllSuperClasses().get(1);
+ assertEquals("com.github.javaparser.ast.Node", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllSuperClasses().get(2);
+ assertEquals("java.lang.Object", ancestor.getQualifiedName());
+ }
+
+ @Test
+ public void testGetInterfacesWithoutParameters() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) newTypeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of(), compilationUnit.getInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+
+ JavassistClassDeclaration coid = (JavassistClassDeclaration) newTypeSolver.solveType("com.github.javaparser.ast.body.ClassOrInterfaceDeclaration");
+ assertEquals(ImmutableSet.of("com.github.javaparser.ast.nodeTypes.NodeWithExtends", "com.github.javaparser.ast.nodeTypes.NodeWithImplements"), coid.getInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetInterfacesWithParameters() {
+ JavassistClassDeclaration constructorDeclaration = (JavassistClassDeclaration) newTypeSolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(7, constructorDeclaration.getInterfaces().size());
+
+ ResolvedReferenceType interfaze = null;
+
+ interfaze = constructorDeclaration.getInterfaces().get(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(1);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(2);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithName", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithName.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(4);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAllInterfacesWithoutParameters() {
+ JavassistClassDeclaration compilationUnit = (JavassistClassDeclaration) newTypeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of("java.lang.Cloneable"), compilationUnit.getAllInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+
+ JavassistClassDeclaration coid = (JavassistClassDeclaration) newTypeSolver.solveType("com.github.javaparser.ast.body.ClassOrInterfaceDeclaration");
+ assertEquals(ImmutableSet.of("com.github.javaparser.ast.nodeTypes.NodeWithExtends",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations",
+ "java.lang.Cloneable",
+ "com.github.javaparser.ast.nodeTypes.NodeWithImplements",
+ "com.github.javaparser.ast.nodeTypes.NodeWithName",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers",
+ "com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc",
+ "com.github.javaparser.ast.nodeTypes.NodeWithMembers"), coid.getAllInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllInterfacesWithParameters() {
+ JavassistClassDeclaration constructorDeclaration = (JavassistClassDeclaration) newTypeSolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(9, constructorDeclaration.getAllInterfaces().size());
+
+ ResolvedReferenceType interfaze = null;
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(1);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(2);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithName", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithName.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(4);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(7);
+ assertEquals("java.lang.Cloneable", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(8);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAncestorsWithTypeParameters() {
+ JavassistClassDeclaration constructorDeclaration = (JavassistClassDeclaration) newTypeSolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(8, constructorDeclaration.getAncestors().size());
+
+ ResolvedReferenceType ancestor = null;
+
+ ancestor = constructorDeclaration.getAncestors().get(0);
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(1);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(2);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithName", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithName.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(4);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAncestors().get(7);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAllAncestorsWithoutTypeParameters() {
+ JavassistClassDeclaration cu = (JavassistClassDeclaration) newTypeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of("java.lang.Cloneable", "com.github.javaparser.ast.Node", "java.lang.Object"), cu.getAllAncestors().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllAncestorsWithTypeParameters() {
+ JavassistClassDeclaration constructorDeclaration = (JavassistClassDeclaration) newTypeSolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(12, constructorDeclaration.getAllAncestors().size());
+
+ ResolvedReferenceType ancestor = null;
+
+ ancestor = constructorDeclaration.getAllAncestors().get(0);
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(1);
+ assertEquals("com.github.javaparser.ast.Node", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(2);
+ assertEquals("java.lang.Cloneable", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(4);
+ assertEquals("java.lang.Object", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavaDoc.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(7);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithName", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithName.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(8);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(9);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(10);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrowable", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrowable.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllAncestors().get(11);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.T").get().asReferenceType().getQualifiedName());
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistEnumDeclarationTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistEnumDeclarationTest.java
new file mode 100644
index 000000000..8e6d66fe8
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistEnumDeclarationTest.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.javassistmodel;
+
+import com.github.javaparser.resolution.declarations.ResolvedEnumDeclaration;
+import com.github.javaparser.symbolsolver.AbstractTest;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+public class JavassistEnumDeclarationTest extends AbstractTest {
+
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() throws IOException {
+ String pathToJar = adaptPath("src/test/resources/javaparser-core-3.0.0-alpha.2.jar");
+ typeSolver = new CombinedTypeSolver(new JarTypeSolver(pathToJar), new ReflectionTypeSolver());
+ }
+
+ ///
+ /// Test misc
+ ///
+
+ @Test
+ public void testIsClass() {
+ ResolvedEnumDeclaration modifier = (ResolvedEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(false, modifier.isClass());
+ }
+
+ @Test
+ public void testIsInterface() {
+ ResolvedEnumDeclaration modifier = (ResolvedEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(false, modifier.isInterface());
+ }
+
+ @Test
+ public void testIsEnum() {
+ ResolvedEnumDeclaration modifier = (ResolvedEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(true, modifier.isEnum());
+ }
+
+ @Test
+ public void testIsTypeVariable() {
+ ResolvedEnumDeclaration modifier = (ResolvedEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(false, modifier.isTypeParameter());
+ }
+
+ @Test
+ public void testIsType() {
+ ResolvedEnumDeclaration modifier = (ResolvedEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(true, modifier.isType());
+ }
+
+ @Test
+ public void testAsType() {
+ ResolvedEnumDeclaration modifier = (ResolvedEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(modifier, modifier.asType());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsClass() {
+ ResolvedEnumDeclaration modifier = (ResolvedEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ modifier.asClass();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsInterface() {
+ ResolvedEnumDeclaration modifier = (ResolvedEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ modifier.asInterface();
+ }
+
+ @Test
+ public void testAsEnum() {
+ ResolvedEnumDeclaration modifier = (ResolvedEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(modifier, modifier.asEnum());
+ }
+
+ @Test
+ public void testGetPackageName() {
+ ResolvedEnumDeclaration modifier = (ResolvedEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals("com.github.javaparser.ast", modifier.getPackageName());
+ }
+
+ @Test
+ public void testGetClassName() {
+ ResolvedEnumDeclaration modifier = (ResolvedEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals("Modifier", modifier.getClassName());
+ }
+
+ @Test
+ public void testGetQualifiedName() {
+ ResolvedEnumDeclaration modifier = (ResolvedEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals("com.github.javaparser.ast.Modifier", modifier.getQualifiedName());
+ }
+
+ ///
+ /// Test ancestors
+ ///
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistInterfaceDeclarationTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistInterfaceDeclarationTest.java
new file mode 100644
index 000000000..a593ec406
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/javassistmodel/JavassistInterfaceDeclarationTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.javassistmodel;
+
+import com.github.javaparser.symbolsolver.AbstractTest;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+public class JavassistInterfaceDeclarationTest extends AbstractTest {
+
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() throws IOException {
+ String pathToJar = adaptPath("src/test/resources/javaparser-core-3.0.0-alpha.2.jar");
+ typeSolver = new CombinedTypeSolver(new JarTypeSolver(pathToJar), new ReflectionTypeSolver());
+ }
+
+ ///
+ /// Test misc
+ ///
+
+ @Test
+ public void testIsClass() {
+ JavassistInterfaceDeclaration nodeWithAnnotations = (JavassistInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(false, nodeWithAnnotations.isClass());
+ }
+
+ @Test
+ public void testIsInterface() {
+ JavassistInterfaceDeclaration nodeWithAnnotations = (JavassistInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(true, nodeWithAnnotations.isInterface());
+ }
+
+ @Test
+ public void testIsEnum() {
+ JavassistInterfaceDeclaration nodeWithAnnotations = (JavassistInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(false, nodeWithAnnotations.isEnum());
+ }
+
+ @Test
+ public void testIsTypeVariable() {
+ JavassistInterfaceDeclaration nodeWithAnnotations = (JavassistInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(false, nodeWithAnnotations.isTypeParameter());
+ }
+
+ @Test
+ public void testIsType() {
+ JavassistInterfaceDeclaration nodeWithAnnotations = (JavassistInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(true, nodeWithAnnotations.isType());
+ }
+
+ @Test
+ public void testAsType() {
+ JavassistInterfaceDeclaration nodeWithAnnotations = (JavassistInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(nodeWithAnnotations, nodeWithAnnotations.asType());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsClass() {
+ JavassistInterfaceDeclaration nodeWithAnnotations = (JavassistInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ nodeWithAnnotations.asClass();
+ }
+
+ @Test
+ public void testAsInterface() {
+ JavassistInterfaceDeclaration nodeWithAnnotations = (JavassistInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals(nodeWithAnnotations, nodeWithAnnotations.asInterface());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsEnum() {
+ JavassistInterfaceDeclaration nodeWithAnnotations = (JavassistInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ nodeWithAnnotations.asEnum();
+ }
+
+ @Test
+ public void testGetPackageName() {
+ JavassistInterfaceDeclaration nodeWithAnnotations = (JavassistInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals("com.github.javaparser.ast.nodeTypes", nodeWithAnnotations.getPackageName());
+ }
+
+ @Test
+ public void testGetClassName() {
+ JavassistInterfaceDeclaration nodeWithAnnotations = (JavassistInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals("NodeWithAnnotations", nodeWithAnnotations.getClassName());
+ }
+
+ @Test
+ public void testGetQualifiedName() {
+ JavassistInterfaceDeclaration nodeWithAnnotations = (JavassistInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations");
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations", nodeWithAnnotations.getQualifiedName());
+ }
+
+ ///
+ /// Test ancestors
+ ///
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/logic/FunctionInterfaceLogicTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/logic/FunctionInterfaceLogicTest.java
new file mode 100644
index 000000000..bda2cc900
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/logic/FunctionInterfaceLogicTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.logic;
+
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionInterfaceDeclaration;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import static org.junit.Assert.assertEquals;
+
+public class FunctionInterfaceLogicTest {
+
+ @Test
+ public void testGetFunctionalMethodNegativeCaseOnClass() {
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ ResolvedType string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver);
+ assertEquals(false, FunctionalInterfaceLogic.getFunctionalMethod(string).isPresent());
+ }
+
+ @Test
+ public void testGetFunctionalMethodPositiveCasesOnInterfaces() {
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ ResolvedType function = new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Function.class, typeSolver), typeSolver);
+ assertEquals(true, FunctionalInterfaceLogic.getFunctionalMethod(function).isPresent());
+ assertEquals("apply", FunctionalInterfaceLogic.getFunctionalMethod(function).get().getName());
+ ResolvedType consumer = new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Consumer.class, typeSolver), typeSolver);
+ assertEquals(true, FunctionalInterfaceLogic.getFunctionalMethod(consumer).isPresent());
+ assertEquals("accept", FunctionalInterfaceLogic.getFunctionalMethod(consumer).get().getName());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/logic/InferenceContextTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/logic/InferenceContextTest.java
new file mode 100644
index 000000000..3af207f9f
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/logic/InferenceContextTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.logic;
+
+import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
+import com.github.javaparser.resolution.types.ResolvedReferenceType;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.resolution.types.ResolvedTypeVariable;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
+import com.github.javaparser.symbolsolver.reflectionmodel.MyObjectProvider;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionInterfaceDeclaration;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import com.google.common.collect.ImmutableList;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+/**
+ * @author Federico Tomassetti
+ */
+public class InferenceContextTest {
+
+ private TypeSolver typeSolver;
+ private ResolvedReferenceType string;
+ private ResolvedReferenceType object;
+ private ResolvedReferenceType listOfString;
+ private ResolvedReferenceType listOfE;
+ private ResolvedTypeParameterDeclaration tpE;
+
+ @Before
+ public void setup() {
+ typeSolver = new ReflectionTypeSolver();
+ string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver);
+ object = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
+ listOfString = listOf(string);
+ tpE = mock(ResolvedTypeParameterDeclaration.class);
+ when(tpE.getName()).thenReturn("T");
+
+ listOfE = listOf(new ResolvedTypeVariable(tpE));
+ }
+
+ private ResolvedReferenceType listOf(ResolvedType elementType) {
+ return new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(List.class, typeSolver), ImmutableList.of(elementType), typeSolver);
+ }
+
+ @Test
+ public void noVariablesArePlacedWhenNotNeeded() {
+ ResolvedType result = new InferenceContext(MyObjectProvider.INSTANCE).addPair(object, string);
+ assertEquals(object, result);
+ }
+
+ @Test
+ public void placingASingleVariableTopLevel() {
+ ResolvedType result = new InferenceContext(MyObjectProvider.INSTANCE).addPair(new ResolvedTypeVariable(tpE), listOfString);
+ assertEquals(new InferenceVariableType(0, MyObjectProvider.INSTANCE), result);
+ }
+
+ @Test
+ public void placingASingleVariableInside() {
+ ResolvedType result = new InferenceContext(MyObjectProvider.INSTANCE).addPair(listOfE, listOfString);
+ assertEquals(listOf(new InferenceVariableType(0, MyObjectProvider.INSTANCE)), result);
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/ArrayTypeTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/ArrayTypeTest.java
new file mode 100644
index 000000000..1d8e4dd02
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/ArrayTypeTest.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.model.typesystem;
+
+import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
+import com.github.javaparser.resolution.types.ResolvedArrayType;
+import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
+import com.github.javaparser.resolution.types.ResolvedTypeVariable;
+import com.github.javaparser.resolution.types.ResolvedVoidType;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionInterfaceDeclaration;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import com.google.common.collect.ImmutableList;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ArrayTypeTest {
+
+ private ResolvedArrayType arrayOfBooleans;
+ private ResolvedArrayType arrayOfStrings;
+ private ResolvedArrayType arrayOfListOfA;
+ private ResolvedArrayType arrayOfListOfStrings;
+ private ReferenceTypeImpl OBJECT;
+ private ReferenceTypeImpl STRING;
+ private TypeSolver typeSolver;
+ private ResolvedTypeParameterDeclaration tpA;
+
+ @Before
+ public void setup() {
+ typeSolver = new ReflectionTypeSolver();
+ OBJECT = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
+ STRING = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver);
+ arrayOfBooleans = new ResolvedArrayType(ResolvedPrimitiveType.BOOLEAN);
+ arrayOfStrings = new ResolvedArrayType(STRING);
+ tpA = ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList());
+ arrayOfListOfA = new ResolvedArrayType(new ReferenceTypeImpl(
+ new ReflectionInterfaceDeclaration(List.class, typeSolver),
+ ImmutableList.of(new ResolvedTypeVariable(tpA)), typeSolver));
+ arrayOfListOfStrings = new ResolvedArrayType(new ReferenceTypeImpl(
+ new ReflectionInterfaceDeclaration(List.class, typeSolver),
+ ImmutableList.of(new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver)), typeSolver));
+ }
+
+ @Test
+ public void testIsArray() {
+ assertEquals(true, arrayOfBooleans.isArray());
+ assertEquals(true, arrayOfStrings.isArray());
+ }
+
+ @Test
+ public void testIsPrimitive() {
+ assertEquals(false, arrayOfBooleans.isPrimitive());
+ assertEquals(false, arrayOfStrings.isPrimitive());
+ }
+
+ @Test
+ public void testIsNull() {
+ assertEquals(false, arrayOfBooleans.isNull());
+ assertEquals(false, arrayOfStrings.isNull());
+ }
+
+ @Test
+ public void testIsReference() {
+ assertEquals(true, arrayOfBooleans.isReference());
+ assertEquals(true, arrayOfStrings.isReference());
+ }
+
+ @Test
+ public void testIsReferenceType() {
+ assertEquals(false, arrayOfBooleans.isReferenceType());
+ assertEquals(false, arrayOfStrings.isReferenceType());
+ }
+
+ @Test
+ public void testIsVoid() {
+ assertEquals(false, arrayOfBooleans.isVoid());
+ assertEquals(false, arrayOfStrings.isVoid());
+ }
+
+ @Test
+ public void testIsTypeVariable() {
+ assertEquals(false, arrayOfBooleans.isTypeVariable());
+ assertEquals(false, arrayOfStrings.isTypeVariable());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsReferenceTypeUsage() {
+ arrayOfBooleans.asReferenceType();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsTypeParameter() {
+ arrayOfBooleans.asTypeParameter();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsPrimitive() {
+ arrayOfBooleans.asPrimitive();
+ }
+
+ @Test
+ public void testAsArrayTypeUsage() {
+ assertTrue(arrayOfBooleans == arrayOfBooleans.asArrayType());
+ assertTrue(arrayOfStrings == arrayOfStrings.asArrayType());
+ assertTrue(arrayOfListOfA == arrayOfListOfA.asArrayType());
+ }
+
+ @Test
+ public void testAsDescribe() {
+ assertEquals("boolean[]", arrayOfBooleans.describe());
+ assertEquals("java.lang.String[]", arrayOfStrings.describe());
+ }
+
+ @Test
+ public void testReplaceParam() {
+ assertTrue(arrayOfBooleans == arrayOfBooleans.replaceTypeVariables(tpA, OBJECT));
+ assertTrue(arrayOfStrings == arrayOfStrings.replaceTypeVariables(tpA, OBJECT));
+ assertEquals(arrayOfListOfStrings, arrayOfListOfStrings.replaceTypeVariables(tpA, OBJECT));
+ ResolvedArrayType arrayOfListOfObjects = new ResolvedArrayType(new ReferenceTypeImpl(
+ new ReflectionInterfaceDeclaration(List.class, typeSolver),
+ ImmutableList.of(OBJECT), typeSolver));
+ assertEquals(true, arrayOfListOfA.replaceTypeVariables(tpA, OBJECT).isArray());
+ assertEquals(ImmutableList.of(OBJECT),
+ arrayOfListOfA.replaceTypeVariables(tpA, OBJECT).asArrayType().getComponentType()
+ .asReferenceType().typeParametersValues());
+ assertEquals(new ReflectionInterfaceDeclaration(List.class, typeSolver),
+ arrayOfListOfA.replaceTypeVariables(tpA, OBJECT).asArrayType().getComponentType()
+ .asReferenceType().getTypeDeclaration());
+ assertEquals(new ReferenceTypeImpl(
+ new ReflectionInterfaceDeclaration(List.class, typeSolver),
+ ImmutableList.of(OBJECT), typeSolver),
+ arrayOfListOfA.replaceTypeVariables(tpA, OBJECT).asArrayType().getComponentType());
+ assertEquals(arrayOfListOfObjects, arrayOfListOfA.replaceTypeVariables(tpA, OBJECT));
+ assertEquals(arrayOfListOfStrings, arrayOfListOfA.replaceTypeVariables(tpA, STRING));
+ assertTrue(arrayOfListOfA != arrayOfListOfA.replaceTypeVariables(tpA, OBJECT));
+ }
+
+ @Test
+ public void testIsAssignableBy() {
+ assertEquals(false, arrayOfBooleans.isAssignableBy(OBJECT));
+ assertEquals(false, arrayOfBooleans.isAssignableBy(STRING));
+ assertEquals(false, arrayOfBooleans.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
+ assertEquals(false, arrayOfBooleans.isAssignableBy(ResolvedVoidType.INSTANCE));
+
+ assertEquals(true, arrayOfBooleans.isAssignableBy(arrayOfBooleans));
+ assertEquals(false, arrayOfBooleans.isAssignableBy(arrayOfStrings));
+ assertEquals(false, arrayOfBooleans.isAssignableBy(arrayOfListOfA));
+ assertEquals(false, arrayOfBooleans.isAssignableBy(arrayOfListOfStrings));
+ assertEquals(false, arrayOfStrings.isAssignableBy(arrayOfBooleans));
+ assertEquals(true, arrayOfStrings.isAssignableBy(arrayOfStrings));
+ assertEquals(false, arrayOfStrings.isAssignableBy(arrayOfListOfA));
+ assertEquals(false, arrayOfStrings.isAssignableBy(arrayOfListOfStrings));
+ assertEquals(false, arrayOfListOfA.isAssignableBy(arrayOfBooleans));
+ assertEquals(false, arrayOfListOfA.isAssignableBy(arrayOfStrings));
+ assertEquals(true, arrayOfListOfA.isAssignableBy(arrayOfListOfA));
+ assertEquals(false, arrayOfListOfA.isAssignableBy(arrayOfListOfStrings));
+ assertEquals(false, arrayOfListOfStrings.isAssignableBy(arrayOfBooleans));
+ assertEquals(false, arrayOfListOfStrings.isAssignableBy(arrayOfStrings));
+ assertEquals(false, arrayOfListOfStrings.isAssignableBy(arrayOfListOfA));
+ assertEquals(true, arrayOfListOfStrings.isAssignableBy(arrayOfListOfStrings));
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/NullTypeTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/NullTypeTest.java
new file mode 100644
index 000000000..4df2460c6
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/NullTypeTest.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.model.typesystem;
+
+import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
+import com.github.javaparser.resolution.types.ResolvedArrayType;
+import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
+import com.github.javaparser.resolution.types.ResolvedTypeVariable;
+import com.github.javaparser.resolution.types.ResolvedVoidType;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionInterfaceDeclaration;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import com.google.common.collect.ImmutableList;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+public class NullTypeTest {
+
+ private ResolvedArrayType arrayOfBooleans;
+ private ResolvedArrayType arrayOfListOfA;
+ private ReferenceTypeImpl OBJECT;
+ private ReferenceTypeImpl STRING;
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() {
+ typeSolver = new ReflectionTypeSolver();
+ OBJECT = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
+ STRING = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver);
+ arrayOfBooleans = new ResolvedArrayType(ResolvedPrimitiveType.BOOLEAN);
+ arrayOfListOfA = new ResolvedArrayType(new ReferenceTypeImpl(
+ new ReflectionInterfaceDeclaration(List.class, typeSolver),
+ ImmutableList.of(new ResolvedTypeVariable(ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList()))), typeSolver));
+ }
+
+ @Test
+ public void testIsArray() {
+ assertEquals(false, NullType.INSTANCE.isArray());
+ }
+
+ @Test
+ public void testIsPrimitive() {
+ assertEquals(false, NullType.INSTANCE.isPrimitive());
+ }
+
+ @Test
+ public void testIsNull() {
+ assertEquals(true, NullType.INSTANCE.isNull());
+ }
+
+ @Test
+ public void testIsReference() {
+ assertEquals(true, NullType.INSTANCE.isReference());
+ }
+
+ @Test
+ public void testIsReferenceType() {
+ assertEquals(false, NullType.INSTANCE.isReferenceType());
+ }
+
+ @Test
+ public void testIsVoid() {
+ assertEquals(false, NullType.INSTANCE.isVoid());
+ }
+
+ @Test
+ public void testIsTypeVariable() {
+ assertEquals(false, NullType.INSTANCE.isTypeVariable());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsReferenceTypeUsage() {
+ NullType.INSTANCE.asReferenceType();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsTypeParameter() {
+ NullType.INSTANCE.asTypeParameter();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsArrayTypeUsage() {
+ NullType.INSTANCE.asArrayType();
+ }
+
+ @Test
+ public void testAsDescribe() {
+ assertEquals("null", NullType.INSTANCE.describe());
+ }
+
+ @Test
+ public void testIsAssignableBy() {
+ try {
+ assertEquals(false, NullType.INSTANCE.isAssignableBy(NullType.INSTANCE));
+ fail();
+ } catch (UnsupportedOperationException e) {
+
+ }
+ try {
+ assertEquals(false, NullType.INSTANCE.isAssignableBy(OBJECT));
+ fail();
+ } catch (UnsupportedOperationException e) {
+
+ }
+ try {
+ assertEquals(false, NullType.INSTANCE.isAssignableBy(STRING));
+ fail();
+ } catch (UnsupportedOperationException e) {
+
+ }
+ try {
+ assertEquals(false, NullType.INSTANCE.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
+ fail();
+ } catch (UnsupportedOperationException e) {
+
+ }
+ try {
+ assertEquals(false, NullType.INSTANCE.isAssignableBy(ResolvedVoidType.INSTANCE));
+ fail();
+ } catch (UnsupportedOperationException e) {
+
+ }
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/PrimitiveTypeTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/PrimitiveTypeTest.java
new file mode 100644
index 000000000..3679dbd41
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/PrimitiveTypeTest.java
@@ -0,0 +1,331 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.model.typesystem;
+
+import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
+import com.github.javaparser.resolution.types.ResolvedArrayType;
+import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
+import com.github.javaparser.resolution.types.ResolvedTypeVariable;
+import com.github.javaparser.resolution.types.ResolvedVoidType;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionInterfaceDeclaration;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import com.google.common.collect.ImmutableList;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+public class PrimitiveTypeTest {
+
+ private ResolvedArrayType arrayOfBooleans;
+ private ResolvedArrayType arrayOfListOfA;
+ private ReferenceTypeImpl OBJECT;
+ private ReferenceTypeImpl STRING;
+ private TypeSolver typeSolver;
+
+ private ReferenceTypeImpl booleanBox;
+ private ReferenceTypeImpl characterBox;
+ private ReferenceTypeImpl byteBox;
+ private ReferenceTypeImpl shortBox;
+ private ReferenceTypeImpl integerBox;
+ private ReferenceTypeImpl longBox;
+ private ReferenceTypeImpl floatBox;
+ private ReferenceTypeImpl doubleBox;
+
+ @Before
+ public void setup() {
+ typeSolver = new ReflectionTypeSolver();
+ OBJECT = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
+ STRING = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver);
+ arrayOfBooleans = new ResolvedArrayType(ResolvedPrimitiveType.BOOLEAN);
+ arrayOfListOfA = new ResolvedArrayType(new ReferenceTypeImpl(
+ new ReflectionInterfaceDeclaration(List.class, typeSolver),
+ ImmutableList.of(new ResolvedTypeVariable(ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList()))), typeSolver));
+
+ booleanBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Boolean.class, typeSolver), typeSolver);
+ characterBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Character.class, typeSolver), typeSolver);
+ byteBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Byte.class, typeSolver), typeSolver);
+ shortBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Short.class, typeSolver), typeSolver);
+ integerBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Integer.class, typeSolver), typeSolver);
+ longBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Long.class, typeSolver), typeSolver);
+ floatBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Float.class, typeSolver), typeSolver);
+ doubleBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Double.class, typeSolver), typeSolver);
+
+ }
+
+ @Test
+ public void testIsArray() {
+ for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
+ assertEquals(false, ptu.isArray());
+ }
+ }
+
+ @Test
+ public void testIsPrimitive() {
+ for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
+ assertEquals(true, ptu.isPrimitive());
+ }
+ }
+
+ @Test
+ public void testIsNull() {
+ for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
+ assertEquals(false, ptu.isNull());
+ }
+ }
+
+ @Test
+ public void testIsReference() {
+ for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
+ assertEquals(false, ptu.isReference());
+ }
+ }
+
+ @Test
+ public void testIsReferenceType() {
+ for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
+ assertEquals(false, ptu.isReferenceType());
+ }
+ }
+
+ @Test
+ public void testIsVoid() {
+ for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
+ assertEquals(false, ptu.isVoid());
+ }
+ }
+
+ @Test
+ public void testIsTypeVariable() {
+ for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
+ assertEquals(false, ptu.isTypeVariable());
+ }
+ }
+
+ @Test
+ public void testAsReferenceTypeUsage() {
+ for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
+ try {
+ ptu.asReferenceType();
+ fail();
+ } catch (UnsupportedOperationException e) {
+ }
+ }
+ }
+
+ @Test
+ public void testAsTypeParameter() {
+ for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
+ try {
+ ptu.asTypeParameter();
+ fail();
+ } catch (UnsupportedOperationException e) {
+ }
+ }
+ }
+
+ @Test
+ public void testAsArrayTypeUsage() {
+ for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
+ try {
+ ptu.asArrayType();
+ fail();
+ } catch (UnsupportedOperationException e) {
+ }
+ }
+ }
+
+ @Test
+ public void testAsDescribe() {
+ assertEquals("boolean", ResolvedPrimitiveType.BOOLEAN.describe());
+ assertEquals("char", ResolvedPrimitiveType.CHAR.describe());
+ assertEquals("byte", ResolvedPrimitiveType.BYTE.describe());
+ assertEquals("short", ResolvedPrimitiveType.SHORT.describe());
+ assertEquals("int", ResolvedPrimitiveType.INT.describe());
+ assertEquals("long", ResolvedPrimitiveType.LONG.describe());
+ assertEquals("float", ResolvedPrimitiveType.FLOAT.describe());
+ assertEquals("double", ResolvedPrimitiveType.DOUBLE.describe());
+ }
+
+ @Test
+ public void testIsAssignableByOtherPrimitiveTypes() {
+ assertEquals(true, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
+ assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.CHAR));
+ assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.BYTE));
+ assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.SHORT));
+ assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.INT));
+ assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.LONG));
+ assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.FLOAT));
+ assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
+
+ assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
+ assertEquals(true, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.CHAR));
+ assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.BYTE));
+ assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.SHORT));
+ assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.INT));
+ assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.LONG));
+ assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.FLOAT));
+ assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
+
+ assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
+ assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.CHAR));
+ assertEquals(true, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.BYTE));
+ assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.SHORT));
+ assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.INT));
+ assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.LONG));
+ assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.FLOAT));
+ assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
+
+ assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
+ assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.CHAR));
+ assertEquals(true, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.BYTE));
+ assertEquals(true, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.SHORT));
+ assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.INT));
+ assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.LONG));
+ assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.FLOAT));
+ assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
+
+ assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
+ assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.CHAR));
+ assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.BYTE));
+ assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.SHORT));
+ assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.INT));
+ assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.LONG));
+ assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.FLOAT));
+ assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
+
+ assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
+ assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.CHAR));
+ assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.BYTE));
+ assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.SHORT));
+ assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.INT));
+ assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.LONG));
+ assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.FLOAT));
+ assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
+
+ assertEquals(false, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
+ assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.CHAR));
+ assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.BYTE));
+ assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.SHORT));
+ assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.INT));
+ assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.LONG));
+ assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.FLOAT));
+ assertEquals(false, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
+
+ assertEquals(false, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
+ assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.CHAR));
+ assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.BYTE));
+ assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.SHORT));
+ assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.INT));
+ assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.LONG));
+ assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.FLOAT));
+ assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
+ }
+
+ @Test
+ public void testIsAssignableByBoxedTypes() {
+ assertEquals(true, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(booleanBox));
+ assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(characterBox));
+ assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(byteBox));
+ assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(shortBox));
+ assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(integerBox));
+ assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(longBox));
+ assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(floatBox));
+ assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(doubleBox));
+
+ assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(booleanBox));
+ assertEquals(true, ResolvedPrimitiveType.CHAR.isAssignableBy(characterBox));
+ assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(byteBox));
+ assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(shortBox));
+ assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(integerBox));
+ assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(longBox));
+ assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(floatBox));
+ assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(doubleBox));
+
+ assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(booleanBox));
+ assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(characterBox));
+ assertEquals(true, ResolvedPrimitiveType.BYTE.isAssignableBy(byteBox));
+ assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(shortBox));
+ assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(integerBox));
+ assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(longBox));
+ assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(floatBox));
+ assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(doubleBox));
+
+ assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(booleanBox));
+ assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(characterBox));
+ assertEquals(true, ResolvedPrimitiveType.SHORT.isAssignableBy(byteBox));
+ assertEquals(true, ResolvedPrimitiveType.SHORT.isAssignableBy(shortBox));
+ assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(integerBox));
+ assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(longBox));
+ assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(floatBox));
+ assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(doubleBox));
+
+ assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(booleanBox));
+ assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(characterBox));
+ assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(byteBox));
+ assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(shortBox));
+ assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(integerBox));
+ assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(longBox));
+ assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(floatBox));
+ assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(doubleBox));
+
+ assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(booleanBox));
+ assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(characterBox));
+ assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(byteBox));
+ assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(shortBox));
+ assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(integerBox));
+ assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(longBox));
+ assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(floatBox));
+ assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(doubleBox));
+
+ assertEquals(false, ResolvedPrimitiveType.FLOAT.isAssignableBy(booleanBox));
+ assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(characterBox));
+ assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(byteBox));
+ assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(shortBox));
+ assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(integerBox));
+ assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(longBox));
+ assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(floatBox));
+ assertEquals(false, ResolvedPrimitiveType.FLOAT.isAssignableBy(doubleBox));
+
+ assertEquals(false, ResolvedPrimitiveType.DOUBLE.isAssignableBy(booleanBox));
+ assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(characterBox));
+ assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(byteBox));
+ assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(shortBox));
+ assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(integerBox));
+ assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(longBox));
+ assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(floatBox));
+ assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(doubleBox));
+ }
+
+ @Test
+ public void testIsAssignableByAnythingElse() {
+ for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
+ assertEquals(false, ptu.isAssignableBy(OBJECT));
+ assertEquals(false, ptu.isAssignableBy(STRING));
+ assertEquals(false, ptu.isAssignableBy(NullType.INSTANCE));
+ assertEquals(false, ptu.isAssignableBy(ResolvedVoidType.INSTANCE));
+ assertEquals(false, ptu.isAssignableBy(arrayOfBooleans));
+ assertEquals(false, ptu.isAssignableBy(arrayOfListOfA));
+ }
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/ReferenceTypeTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/ReferenceTypeTest.java
new file mode 100644
index 000000000..3f4b318a7
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/ReferenceTypeTest.java
@@ -0,0 +1,600 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.model.typesystem;
+
+import com.github.javaparser.resolution.declarations.ResolvedClassDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedInterfaceDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
+import com.github.javaparser.resolution.types.*;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionInterfaceDeclaration;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import com.google.common.collect.ImmutableList;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.Serializable;
+import java.util.*;
+import java.util.stream.Stream;
+
+import static org.junit.Assert.*;
+
+public class ReferenceTypeTest {
+
+ private ReferenceTypeImpl listOfA;
+ private ReferenceTypeImpl listOfStrings;
+ private ReferenceTypeImpl linkedListOfString;
+ private ReferenceTypeImpl collectionOfString;
+ private ReferenceTypeImpl listOfWildcardExtendsString;
+ private ReferenceTypeImpl listOfWildcardSuperString;
+ private ReferenceTypeImpl object;
+ private ReferenceTypeImpl string;
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() {
+ typeSolver = new ReflectionTypeSolver();
+ object = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
+ string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver);
+ listOfA = new ReferenceTypeImpl(
+ new ReflectionInterfaceDeclaration(List.class, typeSolver),
+ ImmutableList.of(new ResolvedTypeVariable(ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList()))), typeSolver);
+ listOfStrings = new ReferenceTypeImpl(
+ new ReflectionInterfaceDeclaration(List.class, typeSolver),
+ ImmutableList.of(new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver)), typeSolver);
+ linkedListOfString = new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(LinkedList.class, typeSolver),
+ ImmutableList.of(new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver)), typeSolver);
+ collectionOfString = new ReferenceTypeImpl(
+ new ReflectionInterfaceDeclaration(Collection.class, typeSolver),
+ ImmutableList.of(new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver)), typeSolver);
+ listOfWildcardExtendsString = new ReferenceTypeImpl(
+ new ReflectionInterfaceDeclaration(List.class, typeSolver),
+ ImmutableList.of(ResolvedWildcard.extendsBound(string)), typeSolver);
+ listOfWildcardSuperString = new ReferenceTypeImpl(
+ new ReflectionInterfaceDeclaration(List.class, typeSolver),
+ ImmutableList.of(ResolvedWildcard.superBound(string)), typeSolver);
+ }
+
+ @Test
+ public void testDerivationOfTypeParameters() {
+ ReflectionTypeSolver typeSolver = new ReflectionTypeSolver();
+ ReferenceTypeImpl ref1 = new ReferenceTypeImpl(typeSolver.solveType(LinkedList.class.getCanonicalName()), typeSolver);
+ assertEquals(1, ref1.typeParametersValues().size());
+ assertEquals(true, ref1.typeParametersValues().get(0).isTypeVariable());
+ assertEquals("E", ref1.typeParametersValues().get(0).asTypeParameter().getName());
+ }
+
+ @Test
+ public void testIsArray() {
+ assertEquals(false, object.isArray());
+ assertEquals(false, string.isArray());
+ assertEquals(false, listOfA.isArray());
+ assertEquals(false, listOfStrings.isArray());
+ }
+
+ @Test
+ public void testIsPrimitive() {
+ assertEquals(false, object.isPrimitive());
+ assertEquals(false, string.isPrimitive());
+ assertEquals(false, listOfA.isPrimitive());
+ assertEquals(false, listOfStrings.isPrimitive());
+ }
+
+ @Test
+ public void testIsNull() {
+ assertEquals(false, object.isNull());
+ assertEquals(false, string.isNull());
+ assertEquals(false, listOfA.isNull());
+ assertEquals(false, listOfStrings.isNull());
+ }
+
+ @Test
+ public void testIsReference() {
+ assertEquals(true, object.isReference());
+ assertEquals(true, string.isReference());
+ assertEquals(true, listOfA.isReference());
+ assertEquals(true, listOfStrings.isReference());
+ }
+
+ @Test
+ public void testIsReferenceType() {
+ assertEquals(true, object.isReferenceType());
+ assertEquals(true, string.isReferenceType());
+ assertEquals(true, listOfA.isReferenceType());
+ assertEquals(true, listOfStrings.isReferenceType());
+ }
+
+ @Test
+ public void testIsVoid() {
+ assertEquals(false, object.isVoid());
+ assertEquals(false, string.isVoid());
+ assertEquals(false, listOfA.isVoid());
+ assertEquals(false, listOfStrings.isVoid());
+ }
+
+ @Test
+ public void testIsTypeVariable() {
+ assertEquals(false, object.isTypeVariable());
+ assertEquals(false, string.isTypeVariable());
+ assertEquals(false, listOfA.isTypeVariable());
+ assertEquals(false, listOfStrings.isTypeVariable());
+ }
+
+ @Test
+ public void testAsReferenceTypeUsage() {
+ assertTrue(object == object.asReferenceType());
+ assertTrue(string == string.asReferenceType());
+ assertTrue(listOfA == listOfA.asReferenceType());
+ assertTrue(listOfStrings == listOfStrings.asReferenceType());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsTypeParameter() {
+ object.asTypeParameter();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsArrayTypeUsage() {
+ object.asArrayType();
+ }
+
+ @Test
+ public void testAsDescribe() {
+ assertEquals("java.lang.Object", object.describe());
+ assertEquals("java.lang.String", string.describe());
+ assertEquals("java.util.List<A>", listOfA.describe());
+ assertEquals("java.util.List<java.lang.String>", listOfStrings.describe());
+ }
+
+ @Test
+ public void testReplaceParam() {
+ ResolvedTypeParameterDeclaration tpA = ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList());
+ assertTrue(object == object.replaceTypeVariables(tpA, object));
+ assertTrue(string == string.replaceTypeVariables(tpA, object));
+ assertEquals(listOfStrings, listOfStrings.replaceTypeVariables(tpA, object));
+ assertEquals(listOfStrings, listOfA.replaceTypeVariables(tpA, string));
+ }
+
+ @Test
+ public void testIsAssignableBySimple() {
+ assertEquals(true, object.isAssignableBy(string));
+ assertEquals(false, string.isAssignableBy(object));
+ assertEquals(false, listOfStrings.isAssignableBy(listOfA));
+ assertEquals(false, listOfA.isAssignableBy(listOfStrings));
+
+ assertEquals(false, object.isAssignableBy(ResolvedVoidType.INSTANCE));
+ assertEquals(false, string.isAssignableBy(ResolvedVoidType.INSTANCE));
+ assertEquals(false, listOfStrings.isAssignableBy(ResolvedVoidType.INSTANCE));
+ assertEquals(false, listOfA.isAssignableBy(ResolvedVoidType.INSTANCE));
+
+ assertEquals(true, object.isAssignableBy(NullType.INSTANCE));
+ assertEquals(true, string.isAssignableBy(NullType.INSTANCE));
+ assertEquals(true, listOfStrings.isAssignableBy(NullType.INSTANCE));
+ assertEquals(true, listOfA.isAssignableBy(NullType.INSTANCE));
+ }
+
+ @Test
+ public void testIsAssignableByBoxedPrimitive(){
+ ResolvedReferenceType numberType = new ReferenceTypeImpl(new ReflectionClassDeclaration(Number.class, typeSolver),typeSolver);
+ ResolvedReferenceType intType = new ReferenceTypeImpl(new ReflectionClassDeclaration(Integer.class, typeSolver),typeSolver);
+ ResolvedReferenceType doubleType = new ReferenceTypeImpl(new ReflectionClassDeclaration(Double.class, typeSolver),typeSolver);
+
+ assertEquals(true, numberType.isAssignableBy(ResolvedPrimitiveType.INT));
+ assertEquals(true, numberType.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
+ assertEquals(true, numberType.isAssignableBy(ResolvedPrimitiveType.SHORT));
+ assertEquals(true, numberType.isAssignableBy(ResolvedPrimitiveType.LONG));
+ assertEquals(true, numberType.isAssignableBy(ResolvedPrimitiveType.FLOAT));
+ assertEquals(false, numberType.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
+ assertEquals(true, intType.isAssignableBy(ResolvedPrimitiveType.INT));
+ assertEquals(true, doubleType.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
+ }
+
+ @Test
+ public void testIsAssignableByGenerics() {
+ assertEquals(false, listOfStrings.isAssignableBy(listOfWildcardExtendsString));
+ assertEquals(false, listOfStrings.isAssignableBy(listOfWildcardExtendsString));
+ assertEquals(true, listOfWildcardExtendsString.isAssignableBy(listOfStrings));
+ assertEquals(false, listOfWildcardExtendsString.isAssignableBy(listOfWildcardSuperString));
+ assertEquals(true, listOfWildcardSuperString.isAssignableBy(listOfStrings));
+ assertEquals(false, listOfWildcardSuperString.isAssignableBy(listOfWildcardExtendsString));
+ }
+
+ @Test
+ public void testIsAssignableByGenericsInheritance() {
+ assertEquals(true, collectionOfString.isAssignableBy(collectionOfString));
+ assertEquals(true, collectionOfString.isAssignableBy(listOfStrings));
+ assertEquals(true, collectionOfString.isAssignableBy(linkedListOfString));
+
+ assertEquals(false, listOfStrings.isAssignableBy(collectionOfString));
+ assertEquals(true, listOfStrings.isAssignableBy(listOfStrings));
+ assertEquals(true, listOfStrings.isAssignableBy(linkedListOfString));
+
+ assertEquals(false, linkedListOfString.isAssignableBy(collectionOfString));
+ assertEquals(false, linkedListOfString.isAssignableBy(listOfStrings));
+ assertEquals(true, linkedListOfString.isAssignableBy(linkedListOfString));
+ }
+
+ @Test
+ public void testGetAllAncestorsConsideringTypeParameters() {
+ assertTrue(linkedListOfString.getAllAncestors().contains(object));
+ assertTrue(linkedListOfString.getAllAncestors().contains(listOfStrings));
+ assertTrue(linkedListOfString.getAllAncestors().contains(collectionOfString));
+ assertFalse(linkedListOfString.getAllAncestors().contains(listOfA));
+ }
+
+ class Foo {
+
+ }
+
+ class Bar extends Foo {
+
+ }
+
+ class Bazzer<A, B, C> {
+
+ }
+
+ class MoreBazzing<A, B> extends Bazzer<B, String, A> {
+
+ }
+
+ @Test
+ public void testGetAllAncestorsConsideringGenericsCases() {
+ ReferenceTypeImpl foo = new ReferenceTypeImpl(new ReflectionClassDeclaration(Foo.class, typeSolver), typeSolver);
+ ReferenceTypeImpl bar = new ReferenceTypeImpl(new ReflectionClassDeclaration(Bar.class, typeSolver), typeSolver);
+ ReferenceTypeImpl left, right;
+
+ //YES MoreBazzing<Foo, Bar> e1 = new MoreBazzing<Foo, Bar>();
+ assertEquals(true,
+ new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver)
+ .isAssignableBy(new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver))
+ );
+
+ //YES MoreBazzing<? extends Foo, Bar> e2 = new MoreBazzing<Foo, Bar>();
+ assertEquals(true,
+ new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(ResolvedWildcard.extendsBound(foo), bar), typeSolver)
+ .isAssignableBy(new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver))
+ );
+
+ //YES MoreBazzing<Foo, ? extends Bar> e3 = new MoreBazzing<Foo, Bar>();
+ assertEquals(true,
+ new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, ResolvedWildcard.extendsBound(bar)), typeSolver)
+ .isAssignableBy(new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver))
+ );
+
+ //YES MoreBazzing<? extends Foo, ? extends Foo> e4 = new MoreBazzing<Foo, Bar>();
+ assertEquals(true,
+ new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(ResolvedWildcard.extendsBound(foo), ResolvedWildcard.extendsBound(foo)), typeSolver)
+ .isAssignableBy(new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver))
+ );
+
+ //YES MoreBazzing<? extends Foo, ? extends Foo> e5 = new MoreBazzing<Bar, Bar>();
+ left = new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(ResolvedWildcard.extendsBound(foo), ResolvedWildcard.extendsBound(foo)), typeSolver);
+ right = new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(bar, bar), typeSolver);
+ assertEquals(true, left.isAssignableBy(right));
+
+ //YES Bazzer<Object, String, String> e6 = new MoreBazzing<String, Object>();
+ left = new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(object, string, string), typeSolver);
+ right = new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(string, object), typeSolver);
+
+ // To debug the following
+ List<ResolvedReferenceType> ancestors = right.getAllAncestors();
+ ResolvedReferenceType moreBazzingAncestor = ancestors.stream().filter(a -> a.getQualifiedName().endsWith("Bazzer")).findFirst().get();
+
+ assertEquals(true, left.isAssignableBy(right));
+
+ //YES Bazzer<String,String,String> e7 = new MoreBazzing<String, String>();
+ assertEquals(true,
+ new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(string, string, string), typeSolver)
+ .isAssignableBy(new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(string, string), typeSolver))
+ );
+
+ //YES Bazzer<Bar,String,Foo> e8 = new MoreBazzing<Foo, Bar>();
+ assertEquals(true,
+ new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(bar, string, foo), typeSolver)
+ .isAssignableBy(new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver))
+ );
+
+ //YES Bazzer<Foo,String,Bar> e9 = new MoreBazzing<Bar, Foo>();
+ assertEquals(true,
+ new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(foo, string, bar), typeSolver)
+ .isAssignableBy(new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(bar, foo), typeSolver))
+ );
+
+ //NO Bazzer<Bar,String,Foo> n1 = new MoreBazzing<Bar, Foo>();
+ assertEquals(false,
+ new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(bar, string, foo), typeSolver)
+ .isAssignableBy(new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(bar, foo), typeSolver))
+ );
+
+ //NO Bazzer<Bar,String,Bar> n2 = new MoreBazzing<Bar, Foo>();
+ assertEquals(false,
+ new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(bar, string, foo), typeSolver)
+ .isAssignableBy(new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(bar, foo), typeSolver))
+ );
+
+ //NO Bazzer<Foo,Object,Bar> n3 = new MoreBazzing<Bar, Foo>();
+ assertEquals(false,
+ new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(foo, object, bar), typeSolver)
+ .isAssignableBy(new ReferenceTypeImpl(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(bar, foo), typeSolver))
+ );
+ }
+
+ @Test
+ public void charSequenceIsAssignableToObject() {
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ ReferenceTypeImpl charSequence = new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(CharSequence.class, typeSolver), typeSolver);
+ ReferenceTypeImpl object = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
+ assertEquals(false, charSequence.isAssignableBy(object));
+ assertEquals(true, object.isAssignableBy(charSequence));
+ }
+
+ @Test
+ public void testGetFieldTypeExisting() {
+ class Foo<A> {
+ List<A> elements;
+ }
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ ReferenceTypeImpl ref = new ReferenceTypeImpl(new ReflectionClassDeclaration(Foo.class, typeSolver), typeSolver);
+
+ assertEquals(true, ref.getFieldType("elements").isPresent());
+ assertEquals(true, ref.getFieldType("elements").get().isReferenceType());
+ assertEquals(List.class.getCanonicalName(), ref.getFieldType("elements").get().asReferenceType().getQualifiedName());
+ assertEquals(1, ref.getFieldType("elements").get().asReferenceType().typeParametersValues().size());
+ assertEquals(true, ref.getFieldType("elements").get().asReferenceType().typeParametersValues().get(0).isTypeVariable());
+ assertEquals("A", ref.getFieldType("elements").get().asReferenceType().typeParametersValues().get(0).asTypeParameter().getName());
+
+ ref = new ReferenceTypeImpl(new ReflectionClassDeclaration(Foo.class, typeSolver),
+ ImmutableList.of(new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver)),
+ typeSolver);
+
+ assertEquals(true, ref.getFieldType("elements").isPresent());
+ assertEquals(true, ref.getFieldType("elements").get().isReferenceType());
+ assertEquals(List.class.getCanonicalName(), ref.getFieldType("elements").get().asReferenceType().getQualifiedName());
+ assertEquals(1, ref.getFieldType("elements").get().asReferenceType().typeParametersValues().size());
+ assertEquals(true, ref.getFieldType("elements").get().asReferenceType().typeParametersValues().get(0).isReferenceType());
+ assertEquals(String.class.getCanonicalName(), ref.getFieldType("elements").get().asReferenceType().typeParametersValues().get(0).asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetFieldTypeUnexisting() {
+ class Foo<A> {
+ List<A> elements;
+ }
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ ReferenceTypeImpl ref = new ReferenceTypeImpl(new ReflectionClassDeclaration(Foo.class, typeSolver), typeSolver);
+
+ assertEquals(false, ref.getFieldType("bar").isPresent());
+
+ ref = new ReferenceTypeImpl(new ReflectionClassDeclaration(Foo.class, typeSolver),
+ ImmutableList.of(new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver)),
+ typeSolver);
+
+ assertEquals(false, ref.getFieldType("bar").isPresent());
+ }
+
+ @Test
+ public void testTypeParamValue() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedClassDeclaration arraylist = new ReflectionClassDeclaration(ArrayList.class, typeResolver);
+ ResolvedClassDeclaration abstractList = new ReflectionClassDeclaration(AbstractList.class, typeResolver);
+ ResolvedClassDeclaration abstractCollection = new ReflectionClassDeclaration(AbstractCollection.class, typeResolver);
+ ResolvedInterfaceDeclaration list = new ReflectionInterfaceDeclaration(List.class, typeResolver);
+ ResolvedInterfaceDeclaration collection = new ReflectionInterfaceDeclaration(Collection.class, typeResolver);
+ ResolvedInterfaceDeclaration iterable = new ReflectionInterfaceDeclaration(Iterable.class, typeResolver);
+ ResolvedType string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver);
+ ResolvedReferenceType arrayListOfString = new ReferenceTypeImpl(arraylist, ImmutableList.of(string), typeResolver);
+ assertEquals(Optional.of(string), arrayListOfString.typeParamValue(arraylist.getTypeParameters().get(0)));
+ assertEquals(Optional.of(string), arrayListOfString.typeParamValue(abstractList.getTypeParameters().get(0)));
+ assertEquals(Optional.of(string), arrayListOfString.typeParamValue(abstractCollection.getTypeParameters().get(0)));
+ assertEquals(Optional.of(string), arrayListOfString.typeParamValue(list.getTypeParameters().get(0)));
+ assertEquals(Optional.of(string), arrayListOfString.typeParamValue(collection.getTypeParameters().get(0)));
+ assertEquals(Optional.of(string), arrayListOfString.typeParamValue(iterable.getTypeParameters().get(0)));
+ }
+
+ @Test
+ public void testGetAllAncestorsOnRawType() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedClassDeclaration arraylist = new ReflectionClassDeclaration(ArrayList.class, typeResolver);
+ ResolvedReferenceType rawArrayList = new ReferenceTypeImpl(arraylist, typeResolver);
+
+ Map<String, ResolvedReferenceType> ancestors = new HashMap<>();
+ rawArrayList.getAllAncestors().forEach(a -> ancestors.put(a.getQualifiedName(), a));
+ assertEquals(9, ancestors.size());
+
+ ResolvedTypeVariable tv = new ResolvedTypeVariable(arraylist.getTypeParameters().get(0));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(RandomAccess.class, typeResolver), typeResolver), ancestors.get("java.util.RandomAccess"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(AbstractCollection.class, typeResolver), ImmutableList.of(tv), typeResolver), ancestors.get("java.util.AbstractCollection"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(List.class, typeResolver), ImmutableList.of(tv), typeResolver), ancestors.get("java.util.List"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Cloneable.class, typeResolver), typeResolver), ancestors.get("java.lang.Cloneable"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Collection.class, typeResolver), ImmutableList.of(tv), typeResolver), ancestors.get("java.util.Collection"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(AbstractList.class, typeResolver), ImmutableList.of(tv), typeResolver), ancestors.get("java.util.AbstractList"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeResolver), typeResolver), ancestors.get("java.lang.Object"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Iterable.class, typeResolver), ImmutableList.of(tv), typeResolver), ancestors.get("java.lang.Iterable"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Serializable.class, typeResolver), typeResolver), ancestors.get("java.io.Serializable"));
+ }
+
+ @Test
+ public void testGetAllAncestorsOnTypeWithSpecifiedTypeParametersForInterface() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedInterfaceDeclaration list = new ReflectionInterfaceDeclaration(List.class, typeResolver);
+ ResolvedType string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver);
+ ResolvedReferenceType listOfString = new ReferenceTypeImpl(list, ImmutableList.of(string), typeResolver);
+
+ Map<String, ResolvedReferenceType> ancestors = new HashMap<>();
+ listOfString.getAllAncestors().forEach(a -> ancestors.put(a.getQualifiedName(), a));
+ assertEquals(3, ancestors.size());
+
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Collection.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.Collection"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeResolver), typeResolver), ancestors.get("java.lang.Object"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Iterable.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.lang.Iterable"));
+ }
+
+ @Test
+ public void testGetAllAncestorsOnTypeWithSpecifiedTypeParametersForClassAbstractCollection() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedClassDeclaration abstractCollection = new ReflectionClassDeclaration(AbstractCollection.class, typeResolver);
+ ResolvedType string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver);
+ ResolvedReferenceType abstractCollectionOfString = new ReferenceTypeImpl(abstractCollection, ImmutableList.of(string), typeResolver);
+
+ Map<String, ResolvedReferenceType> ancestors = new HashMap<>();
+ abstractCollectionOfString.getAllAncestors().forEach(a -> ancestors.put(a.getQualifiedName(), a));
+ assertEquals(3, ancestors.size());
+
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Collection.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.Collection"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeResolver), typeResolver), ancestors.get("java.lang.Object"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Iterable.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.lang.Iterable"));
+ }
+
+ @Test
+ public void testGetAllAncestorsOnTypeWithSpecifiedTypeParametersForClassAbstractList() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedClassDeclaration abstractList = new ReflectionClassDeclaration(AbstractList.class, typeResolver);
+ ResolvedType string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver);
+ ResolvedReferenceType abstractListOfString = new ReferenceTypeImpl(abstractList, ImmutableList.of(string), typeResolver);
+
+ Map<String, ResolvedReferenceType> ancestors = new HashMap<>();
+ abstractListOfString.getAllAncestors().forEach(a -> ancestors.put(a.getQualifiedName(), a));
+ assertEquals(5, ancestors.size());
+
+ assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(AbstractCollection.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.AbstractCollection"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(List.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.List"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Collection.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.Collection"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeResolver), typeResolver), ancestors.get("java.lang.Object"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Iterable.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.lang.Iterable"));
+ }
+
+ @Test
+ public void testGetAllAncestorsOnTypeWithSpecifiedTypeParametersForClassArrayList() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedClassDeclaration arraylist = new ReflectionClassDeclaration(ArrayList.class, typeResolver);
+ ResolvedType string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver);
+ ResolvedReferenceType arrayListOfString = new ReferenceTypeImpl(arraylist, ImmutableList.of(string), typeResolver);
+
+ Map<String, ResolvedReferenceType> ancestors = new HashMap<>();
+ arrayListOfString.getAllAncestors().forEach(a -> ancestors.put(a.getQualifiedName(), a));
+ assertEquals(9, ancestors.size());
+
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(RandomAccess.class, typeResolver), typeResolver), ancestors.get("java.util.RandomAccess"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(AbstractCollection.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.AbstractCollection"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(List.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.List"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Cloneable.class, typeResolver), typeResolver), ancestors.get("java.lang.Cloneable"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Collection.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.Collection"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(AbstractList.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.util.AbstractList"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeResolver), typeResolver), ancestors.get("java.lang.Object"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Iterable.class, typeResolver), ImmutableList.of(string), typeResolver), ancestors.get("java.lang.Iterable"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Serializable.class, typeResolver), typeResolver), ancestors.get("java.io.Serializable"));
+ }
+
+ @Test
+ public void testTypeParametersValues() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedReferenceType stream = new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Stream.class, typeResolver), typeResolver);
+ assertEquals(1, stream.typeParametersValues().size());
+ assertEquals(new ResolvedTypeVariable(new ReflectionInterfaceDeclaration(Stream.class, typeResolver).getTypeParameters().get(0)), stream.typeParametersValues().get(0));
+ }
+
+ @Test
+ public void testReplaceTypeVariables() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedInterfaceDeclaration streamInterface = new ReflectionInterfaceDeclaration(Stream.class, typeResolver);
+ ResolvedReferenceType stream = new ReferenceTypeImpl(streamInterface, typeResolver);
+
+ ResolvedMethodDeclaration streamMap = streamInterface.getDeclaredMethods().stream().filter(m -> m.getName().equals("map")).findFirst().get();
+ ResolvedTypeParameterDeclaration streamMapR = streamMap.findTypeParameter("T").get();
+ ResolvedTypeVariable typeVariable = new ResolvedTypeVariable(streamMapR);
+ stream = stream.deriveTypeParameters(stream.typeParametersMap().toBuilder().setValue(stream.getTypeDeclaration().getTypeParameters().get(0), typeVariable).build());
+
+ ResolvedTypeParameterDeclaration tpToReplace = streamInterface.getTypeParameters().get(0);
+ ResolvedType replaced = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver);
+
+ ResolvedType streamReplaced = stream.replaceTypeVariables(tpToReplace, replaced);
+ assertEquals("java.util.stream.Stream<java.lang.String>", streamReplaced.describe());
+ }
+
+ @Test
+ public void testReplaceTypeVariablesWithLambdaInBetween() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedInterfaceDeclaration streamInterface = new ReflectionInterfaceDeclaration(Stream.class, typeResolver);
+ ResolvedReferenceType stream = new ReferenceTypeImpl(streamInterface, typeResolver);
+
+ ResolvedMethodDeclaration streamMap = streamInterface.getDeclaredMethods().stream().filter(m -> m.getName().equals("map")).findFirst().get();
+ ResolvedTypeParameterDeclaration streamMapR = streamMap.findTypeParameter("T").get();
+ ResolvedTypeVariable typeVariable = new ResolvedTypeVariable(streamMapR);
+ stream = stream.deriveTypeParameters(stream.typeParametersMap().toBuilder().setValue(stream.getTypeDeclaration().getTypeParameters().get(0), typeVariable).build());
+
+ ResolvedTypeParameterDeclaration tpToReplace = streamInterface.getTypeParameters().get(0);
+ ResolvedType replaced = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeResolver), typeResolver);
+
+ ResolvedType streamReplaced = stream.replaceTypeVariables(tpToReplace, replaced);
+ assertEquals("java.util.stream.Stream<java.lang.String>", streamReplaced.describe());
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/TypeVariableUsageTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/TypeVariableUsageTest.java
new file mode 100644
index 000000000..1808b9c13
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/TypeVariableUsageTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.model.typesystem;
+
+import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
+import com.github.javaparser.resolution.types.ResolvedTypeVariable;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.*;
+
+import static org.junit.Assert.*;
+
+public class TypeVariableUsageTest {
+
+ private ResolvedTypeVariable tpA;
+ private ReferenceTypeImpl tpString;
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() {
+ tpA = new ResolvedTypeVariable(ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList()));
+
+ typeSolver = new ReflectionTypeSolver();
+ tpString = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver);
+ }
+
+ @Test
+ public void testIsAssignableBySimple() {
+ assertEquals(false, tpString.isAssignableBy(tpA));
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/VoidTypeTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/VoidTypeTest.java
new file mode 100644
index 000000000..2c88ebbb8
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/VoidTypeTest.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.model.typesystem;
+
+import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
+import com.github.javaparser.resolution.types.ResolvedArrayType;
+import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
+import com.github.javaparser.resolution.types.ResolvedTypeVariable;
+import com.github.javaparser.resolution.types.ResolvedVoidType;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionInterfaceDeclaration;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import com.google.common.collect.ImmutableList;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+public class VoidTypeTest {
+
+ private ResolvedArrayType arrayOfBooleans;
+ private ResolvedArrayType arrayOfListOfA;
+ private ReferenceTypeImpl OBJECT;
+ private ReferenceTypeImpl STRING;
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() {
+ typeSolver = new ReflectionTypeSolver();
+ OBJECT = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
+ STRING = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver);
+ arrayOfBooleans = new ResolvedArrayType(ResolvedPrimitiveType.BOOLEAN);
+ arrayOfListOfA = new ResolvedArrayType(new ReferenceTypeImpl(
+ new ReflectionInterfaceDeclaration(List.class, typeSolver),
+ ImmutableList.of(new ResolvedTypeVariable(ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList()))), typeSolver));
+ }
+
+ @Test
+ public void testIsArray() {
+ assertEquals(false, ResolvedVoidType.INSTANCE.isArray());
+ }
+
+ @Test
+ public void testIsPrimitive() {
+ assertEquals(false, ResolvedVoidType.INSTANCE.isPrimitive());
+ }
+
+ @Test
+ public void testIsNull() {
+ assertEquals(false, ResolvedVoidType.INSTANCE.isNull());
+ }
+
+ @Test
+ public void testIsReference() {
+ assertEquals(false, ResolvedVoidType.INSTANCE.isReference());
+ }
+
+ @Test
+ public void testIsReferenceType() {
+ assertEquals(false, ResolvedVoidType.INSTANCE.isReferenceType());
+ }
+
+ @Test
+ public void testIsVoid() {
+ assertEquals(true, ResolvedVoidType.INSTANCE.isVoid());
+ }
+
+ @Test
+ public void testIsTypeVariable() {
+ assertEquals(false, ResolvedVoidType.INSTANCE.isTypeVariable());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsReferenceTypeUsage() {
+ ResolvedVoidType.INSTANCE.asReferenceType();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsTypeParameter() {
+ ResolvedVoidType.INSTANCE.asTypeParameter();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsArrayTypeUsage() {
+ ResolvedVoidType.INSTANCE.asArrayType();
+ }
+
+ @Test
+ public void testAsDescribe() {
+ assertEquals("void", ResolvedVoidType.INSTANCE.describe());
+ }
+
+ @Test
+ public void testIsAssignableBy() {
+ try {
+ assertEquals(false, ResolvedVoidType.INSTANCE.isAssignableBy(NullType.INSTANCE));
+ fail();
+ } catch (UnsupportedOperationException e) {
+
+ }
+ try {
+ assertEquals(false, ResolvedVoidType.INSTANCE.isAssignableBy(OBJECT));
+ fail();
+ } catch (UnsupportedOperationException e) {
+
+ }
+ try {
+ assertEquals(false, ResolvedVoidType.INSTANCE.isAssignableBy(STRING));
+ fail();
+ } catch (UnsupportedOperationException e) {
+
+ }
+ try {
+ assertEquals(false, ResolvedVoidType.INSTANCE.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
+ fail();
+ } catch (UnsupportedOperationException e) {
+
+ }
+ try {
+ assertEquals(false, ResolvedVoidType.INSTANCE.isAssignableBy(ResolvedVoidType.INSTANCE));
+ fail();
+ } catch (UnsupportedOperationException e) {
+
+ }
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/WildcardUsageTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/WildcardUsageTest.java
new file mode 100644
index 000000000..705805dd9
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/model/typesystem/WildcardUsageTest.java
@@ -0,0 +1,422 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.model.typesystem;
+
+import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
+import com.github.javaparser.resolution.types.ResolvedTypeVariable;
+import com.github.javaparser.resolution.types.ResolvedWildcard;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Collections;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class WildcardUsageTest {
+
+ class Foo {
+ }
+
+ class Bar extends Foo {
+ }
+
+ private TypeSolver typeSolver;
+ private ReferenceTypeImpl foo;
+ private ReferenceTypeImpl bar;
+ private ReferenceTypeImpl object;
+ private ReferenceTypeImpl string;
+ private ResolvedWildcard unbounded = ResolvedWildcard.UNBOUNDED;
+ private ResolvedWildcard superFoo;
+ private ResolvedWildcard superBar;
+ private ResolvedWildcard extendsFoo;
+ private ResolvedWildcard extendsBar;
+ private ResolvedWildcard superA;
+ private ResolvedWildcard extendsA;
+ private ResolvedWildcard superString;
+ private ResolvedWildcard extendsString;
+ private ResolvedTypeVariable a;
+
+ @Before
+ public void setup() {
+ typeSolver = new ReflectionTypeSolver();
+ foo = new ReferenceTypeImpl(new ReflectionClassDeclaration(Foo.class, typeSolver), typeSolver);
+ bar = new ReferenceTypeImpl(new ReflectionClassDeclaration(Bar.class, typeSolver), typeSolver);
+ object = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
+ string = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver);
+ superFoo = ResolvedWildcard.superBound(foo);
+ superBar = ResolvedWildcard.superBound(bar);
+ extendsFoo = ResolvedWildcard.extendsBound(foo);
+ extendsBar = ResolvedWildcard.extendsBound(bar);
+ a = new ResolvedTypeVariable(ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList()));
+ superA = ResolvedWildcard.superBound(a);
+ extendsA = ResolvedWildcard.extendsBound(a);
+ superString = ResolvedWildcard.superBound(string);
+ extendsString = ResolvedWildcard.extendsBound(string);
+ }
+
+ @Test
+ public void testIsArray() {
+ assertEquals(false, unbounded.isArray());
+ assertEquals(false, superFoo.isArray());
+ assertEquals(false, superBar.isArray());
+ assertEquals(false, extendsFoo.isArray());
+ assertEquals(false, extendsBar.isArray());
+ }
+
+ @Test
+ public void testIsPrimitive() {
+ assertEquals(false, unbounded.isPrimitive());
+ assertEquals(false, superFoo.isPrimitive());
+ assertEquals(false, superBar.isPrimitive());
+ assertEquals(false, extendsFoo.isPrimitive());
+ assertEquals(false, extendsBar.isPrimitive());
+ }
+
+ @Test
+ public void testIsNull() {
+ assertEquals(false, unbounded.isNull());
+ assertEquals(false, superFoo.isNull());
+ assertEquals(false, superBar.isNull());
+ assertEquals(false, extendsFoo.isNull());
+ assertEquals(false, extendsBar.isNull());
+ }
+
+ @Test
+ public void testIsReference() {
+ assertEquals(true, unbounded.isReference());
+ assertEquals(true, superFoo.isReference());
+ assertEquals(true, superBar.isReference());
+ assertEquals(true, extendsFoo.isReference());
+ assertEquals(true, extendsBar.isReference());
+ }
+
+ @Test
+ public void testIsReferenceType() {
+ assertEquals(false, unbounded.isReferenceType());
+ assertEquals(false, superFoo.isReferenceType());
+ assertEquals(false, superBar.isReferenceType());
+ assertEquals(false, extendsFoo.isReferenceType());
+ assertEquals(false, extendsBar.isReferenceType());
+ }
+
+ @Test
+ public void testIsVoid() {
+ assertEquals(false, unbounded.isVoid());
+ assertEquals(false, superFoo.isVoid());
+ assertEquals(false, superBar.isVoid());
+ assertEquals(false, extendsFoo.isVoid());
+ assertEquals(false, extendsBar.isVoid());
+ }
+
+ @Test
+ public void testIsTypeVariable() {
+ assertEquals(false, unbounded.isTypeVariable());
+ assertEquals(false, superFoo.isTypeVariable());
+ assertEquals(false, superBar.isTypeVariable());
+ assertEquals(false, extendsFoo.isTypeVariable());
+ assertEquals(false, extendsBar.isTypeVariable());
+ }
+
+ @Test
+ public void testIsWildcard() {
+ assertEquals(true, unbounded.isWildcard());
+ assertEquals(true, superFoo.isWildcard());
+ assertEquals(true, superBar.isWildcard());
+ assertEquals(true, extendsFoo.isWildcard());
+ assertEquals(true, extendsBar.isWildcard());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsArrayTypeUsage() {
+ unbounded.asArrayType();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsReferenceTypeUsage() {
+ unbounded.asReferenceType();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsTypeParameter() {
+ unbounded.asTypeParameter();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsPrimitive() {
+ unbounded.asPrimitive();
+ }
+
+ @Test
+ public void testAsWildcard() {
+ assertTrue(unbounded == unbounded.asWildcard());
+ assertTrue(superFoo == superFoo.asWildcard());
+ assertTrue(superBar == superBar.asWildcard());
+ assertTrue(extendsFoo == extendsFoo.asWildcard());
+ assertTrue(extendsBar == extendsBar.asWildcard());
+ }
+
+ @Test
+ public void testAsDescribe() {
+ assertEquals("?", unbounded.describe());
+ assertEquals("? super com.github.javaparser.symbolsolver.model.typesystem.WildcardUsageTest.Foo", superFoo.describe());
+ assertEquals("? super com.github.javaparser.symbolsolver.model.typesystem.WildcardUsageTest.Bar", superBar.describe());
+ assertEquals("? extends com.github.javaparser.symbolsolver.model.typesystem.WildcardUsageTest.Foo", extendsFoo.describe());
+ assertEquals("? extends com.github.javaparser.symbolsolver.model.typesystem.WildcardUsageTest.Bar", extendsBar.describe());
+ }
+
+ @Test
+ public void testReplaceParam() {
+ ResolvedTypeParameterDeclaration tpA = ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList());
+ ResolvedTypeParameterDeclaration tpB = ResolvedTypeParameterDeclaration.onType("B", "foo.Bar", Collections.emptyList());
+ assertTrue(unbounded == unbounded.replaceTypeVariables(tpA, string));
+ assertTrue(superFoo == superFoo.replaceTypeVariables(tpA, string));
+ assertTrue(extendsFoo == extendsFoo.replaceTypeVariables(tpA, string));
+ assertEquals(superString, superA.replaceTypeVariables(tpA, string));
+ assertEquals(extendsString, extendsA.replaceTypeVariables(tpA, string));
+ assertTrue(superA == superA.replaceTypeVariables(tpB, string));
+ assertTrue(extendsA == extendsA.replaceTypeVariables(tpB, string));
+ }
+
+ @Test
+ public void testIsAssignableBySimple() {
+ assertEquals(false, unbounded.isAssignableBy(object));
+ assertEquals(true, object.isAssignableBy(unbounded));
+ assertEquals(false, string.isAssignableBy(unbounded));
+ assertEquals(true, superFoo.isAssignableBy(foo));
+ assertEquals(false, foo.isAssignableBy(superFoo));
+ assertEquals(false, extendsFoo.isAssignableBy(foo));
+ assertEquals(true, foo.isAssignableBy(extendsFoo));
+ }
+
+ /*@Test
+ public void testIsAssignableByGenerics() {
+ assertEquals(false, listOfStrings.isAssignableBy(listOfWildcardExtendsString));
+ assertEquals(false, listOfStrings.isAssignableBy(listOfWildcardExtendsString));
+ assertEquals(true, listOfWildcardExtendsString.isAssignableBy(listOfStrings));
+ assertEquals(false, listOfWildcardExtendsString.isAssignableBy(listOfWildcardSuperString));
+ assertEquals(true, listOfWildcardSuperString.isAssignableBy(listOfStrings));
+ assertEquals(false, listOfWildcardSuperString.isAssignableBy(listOfWildcardExtendsString));
+ }
+
+ @Test
+ public void testIsAssignableByGenericsInheritance() {
+ assertEquals(true, collectionOfString.isAssignableBy(collectionOfString));
+ assertEquals(true, collectionOfString.isAssignableBy(listOfStrings));
+ assertEquals(true, collectionOfString.isAssignableBy(linkedListOfString));
+
+ assertEquals(false, listOfStrings.isAssignableBy(collectionOfString));
+ assertEquals(true, listOfStrings.isAssignableBy(listOfStrings));
+ assertEquals(true, listOfStrings.isAssignableBy(linkedListOfString));
+
+ assertEquals(false, linkedListOfString.isAssignableBy(collectionOfString));
+ assertEquals(false, linkedListOfString.isAssignableBy(listOfStrings));
+ assertEquals(true, linkedListOfString.isAssignableBy(linkedListOfString));
+ }
+
+ @Test
+ public void testGetAllAncestorsConsideringTypeParameters() {
+ assertTrue(linkedListOfString.getAllAncestors().contains(object));
+ assertTrue(linkedListOfString.getAllAncestors().contains(listOfStrings));
+ assertTrue(linkedListOfString.getAllAncestors().contains(collectionOfString));
+ assertFalse(linkedListOfString.getAllAncestors().contains(listOfA));
+ }
+
+ @Test
+ public void testGetAllAncestorsConsideringGenericsCases() {
+ ReferenceTypeUsage foo = new ReferenceTypeUsage(new ReflectionClassDeclaration(Foo.class, typeSolver), typeSolver);
+ ReferenceTypeUsage bar = new ReferenceTypeUsage(new ReflectionClassDeclaration(Bar.class, typeSolver), typeSolver);
+ ReferenceTypeUsage left, right;
+
+ //YES MoreBazzing<Foo, Bar> e1 = new MoreBazzing<Foo, Bar>();
+ assertEquals(true,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver))
+ );
+
+ //YES MoreBazzing<? extends Foo, Bar> e2 = new MoreBazzing<Foo, Bar>();
+ assertEquals(true,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(WildcardUsage.extendsBound(foo), bar), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver))
+ );
+
+ //YES MoreBazzing<Foo, ? extends Bar> e3 = new MoreBazzing<Foo, Bar>();
+ assertEquals(true,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, WildcardUsage.extendsBound(bar)), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver))
+ );
+
+ //YES MoreBazzing<? extends Foo, ? extends Foo> e4 = new MoreBazzing<Foo, Bar>();
+ assertEquals(true,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(WildcardUsage.extendsBound(foo), WildcardUsage.extendsBound(foo)), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver))
+ );
+
+ //YES MoreBazzing<? extends Foo, ? extends Foo> e5 = new MoreBazzing<Bar, Bar>();
+ left = new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(WildcardUsage.extendsBound(foo), WildcardUsage.extendsBound(foo)), typeSolver);
+ right = new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(bar, bar), typeSolver);
+ assertEquals(true, left.isAssignableBy(right));
+
+ //YES Bazzer<Object, String, String> e6 = new MoreBazzing<String, Object>();
+ left = new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(object, string, string), typeSolver);
+ right = new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(string, object), typeSolver);
+ assertEquals(true, left.isAssignableBy(right));
+
+ //YES Bazzer<String,String,String> e7 = new MoreBazzing<String, String>();
+ assertEquals(true,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(string, string, string), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(string, string), typeSolver))
+ );
+
+ //YES Bazzer<Bar,String,Foo> e8 = new MoreBazzing<Foo, Bar>();
+ assertEquals(true,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(bar, string, foo), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(foo, bar), typeSolver))
+ );
+
+ //YES Bazzer<Foo,String,Bar> e9 = new MoreBazzing<Bar, Foo>();
+ assertEquals(true,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(foo, string, bar), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(bar, foo), typeSolver))
+ );
+
+ //NO Bazzer<Bar,String,Foo> n1 = new MoreBazzing<Bar, Foo>();
+ assertEquals(false,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(bar,string,foo), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(bar, foo), typeSolver))
+ );
+
+ //NO Bazzer<Bar,String,Bar> n2 = new MoreBazzing<Bar, Foo>();
+ assertEquals(false,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(bar, string, foo), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(bar, foo), typeSolver))
+ );
+
+ //NO Bazzer<Foo,Object,Bar> n3 = new MoreBazzing<Bar, Foo>();
+ assertEquals(false,
+ new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(Bazzer.class, typeSolver),
+ ImmutableList.of(foo, object, bar), typeSolver)
+ .isAssignableBy(new ReferenceTypeUsage(
+ new ReflectionClassDeclaration(MoreBazzing.class, typeSolver),
+ ImmutableList.of(bar, foo), typeSolver))
+ );
+ }
+
+ @Test
+ public void charSequenceIsAssignableToObject() {
+ TypeSolver typeSolver = new JreTypeSolver();
+ ReferenceTypeUsage charSequence = new ReferenceTypeUsage(new ReflectionInterfaceDeclaration(CharSequence.class, typeSolver), typeSolver);
+ ReferenceTypeUsage object = new ReferenceTypeUsage(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
+ assertEquals(false, charSequence.isAssignableBy(object));
+ assertEquals(true, object.isAssignableBy(charSequence));
+ }
+
+ @Test
+ public void testGetFieldTypeExisting() {
+ class Foo<A> {
+ List<A> elements;
+ }
+
+ TypeSolver typeSolver = new JreTypeSolver();
+ ReferenceTypeUsage ref = new ReferenceTypeUsage(new ReflectionClassDeclaration(Foo.class, typeSolver), typeSolver);
+
+ assertEquals(true, ref.getFieldType("elements").isPresent());
+ assertEquals(true, ref.getFieldType("elements").get().isReferenceType());
+ assertEquals(List.class.getCanonicalName(), ref.getFieldType("elements").get().asReferenceType().getQualifiedName());
+ assertEquals(1, ref.getFieldType("elements").get().asReferenceType().typeParametersValues().size());
+ assertEquals(true, ref.getFieldType("elements").get().asReferenceType().typeParametersValues().get(0).isTypeParameter());
+ assertEquals("A", ref.getFieldType("elements").get().asReferenceType().typeParametersValues().get(0).asTypeParameter().getName());
+
+ ref = new ReferenceTypeUsage(new ReflectionClassDeclaration(Foo.class, typeSolver),
+ ImmutableList.of(new ReferenceTypeUsage(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver)),
+ typeSolver);
+
+ assertEquals(true, ref.getFieldType("elements").isPresent());
+ assertEquals(true, ref.getFieldType("elements").get().isReferenceType());
+ assertEquals(List.class.getCanonicalName(), ref.getFieldType("elements").get().asReferenceType().getQualifiedName());
+ assertEquals(1, ref.getFieldType("elements").get().asReferenceType().typeParametersValues().size());
+ assertEquals(true, ref.getFieldType("elements").get().asReferenceType().typeParametersValues().get(0).isReferenceType());
+ assertEquals(String.class.getCanonicalName(), ref.getFieldType("elements").get().asReferenceType().typeParametersValues().get(0).asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetFieldTypeUnexisting() {
+ class Foo<A> {
+ List<A> elements;
+ }
+
+ TypeSolver typeSolver = new JreTypeSolver();
+ ReferenceTypeUsage ref = new ReferenceTypeUsage(new ReflectionClassDeclaration(Foo.class, typeSolver), typeSolver);
+
+ assertEquals(false, ref.getFieldType("bar").isPresent());
+
+ ref = new ReferenceTypeUsage(new ReflectionClassDeclaration(Foo.class, typeSolver),
+ ImmutableList.of(new ReferenceTypeUsage(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver)),
+ typeSolver);
+
+ assertEquals(false, ref.getFieldType("bar").isPresent());
+ }*/
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionClassDeclarationTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionClassDeclarationTest.java
new file mode 100644
index 000000000..8de0e2391
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionClassDeclarationTest.java
@@ -0,0 +1,776 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.reflectionmodel;
+
+import com.github.javaparser.ast.AccessSpecifier;
+import com.github.javaparser.resolution.declarations.*;
+import com.github.javaparser.resolution.types.ResolvedReferenceType;
+import com.github.javaparser.resolution.types.ResolvedTypeVariable;
+import com.github.javaparser.symbolsolver.AbstractTest;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import org.junit.Test;
+
+import java.io.Serializable;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ReflectionClassDeclarationTest extends AbstractTest {
+
+ private TypeSolver typeResolver = new ReflectionTypeSolver(false);
+
+ @Test
+ public void testIsClass() {
+ class Foo<E> {
+ E field;
+ }
+ class Bar extends Foo<String> {
+ }
+
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+
+ ResolvedClassDeclaration foo = new ReflectionClassDeclaration(Foo.class, typeResolver);
+ ResolvedClassDeclaration bar = new ReflectionClassDeclaration(Bar.class, typeResolver);
+
+ assertEquals(true, foo.isClass());
+ assertEquals(true, bar.isClass());
+ }
+
+ @Test
+ public void testGetSuperclassSimpleImplicit() {
+ class Foo<E> {
+ E field;
+ }
+
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+
+ ResolvedClassDeclaration foo = new ReflectionClassDeclaration(Foo.class, typeResolver);
+
+ assertEquals(Object.class.getCanonicalName(), foo.getSuperClass().getQualifiedName());
+ assertEquals(Collections.emptyList(), foo.getSuperClass().typeParametersValues());
+ }
+
+ @Test
+ public void testGetSuperclassSimple() {
+ class Bar {
+ }
+ class Foo<E> extends Bar {
+ E field;
+ }
+
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+
+ ResolvedClassDeclaration foo = new ReflectionClassDeclaration(Foo.class, typeResolver);
+
+ assertEquals("Bar", foo.getSuperClass().getTypeDeclaration().getName());
+ assertEquals(Collections.emptyList(), foo.getSuperClass().typeParametersValues());
+ }
+
+ @Test
+ public void testGetSuperclassWithGenericSimple() {
+ class Foo<E> {
+ E field;
+ }
+ class Bar extends Foo<String> {
+ }
+
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+
+ ResolvedClassDeclaration foo = new ReflectionClassDeclaration(Foo.class, typeResolver);
+ ResolvedClassDeclaration bar = new ReflectionClassDeclaration(Bar.class, typeResolver);
+
+ assertEquals("Foo", bar.getSuperClass().getTypeDeclaration().getName());
+ assertEquals(1, bar.getSuperClass().typeParametersValues().size());
+ assertEquals(String.class.getCanonicalName(), bar.getSuperClass().typeParametersValues().get(0).asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetSuperclassWithGenericInheritanceSameName() {
+ class Foo<E> {
+ E field;
+ }
+ class Bar<E> extends Foo<E> {
+ }
+
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+
+ ResolvedClassDeclaration foo = new ReflectionClassDeclaration(Foo.class, typeResolver);
+ ResolvedClassDeclaration bar = new ReflectionClassDeclaration(Bar.class, typeResolver);
+
+ assertEquals("Foo", bar.getSuperClass().getTypeDeclaration().getName());
+ assertEquals(1, bar.getSuperClass().typeParametersValues().size());
+ assertEquals(true, bar.getSuperClass().typeParametersValues().get(0).isTypeVariable());
+ assertEquals("E", bar.getSuperClass().typeParametersValues().get(0).asTypeParameter().getName());
+ assertEquals(true, bar.getSuperClass().typeParametersValues().get(0).asTypeParameter().declaredOnType());
+ assertEquals(false, bar.getSuperClass().typeParametersValues().get(0).asTypeParameter().declaredOnMethod());
+ assertTrue(bar.getSuperClass().typeParametersValues().get(0).asTypeParameter().getQualifiedName().endsWith("Bar.E"));
+ }
+
+ @Test
+ public void testGetSuperclassWithGenericInheritanceDifferentName() {
+ class Foo<E> {
+ E field;
+ }
+ class Bar extends Foo<String> {
+ }
+
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+
+ ResolvedClassDeclaration foo = new ReflectionClassDeclaration(Foo.class, typeResolver);
+ ResolvedClassDeclaration bar = new ReflectionClassDeclaration(Bar.class, typeResolver);
+
+ assertEquals(true, foo.isClass());
+ assertEquals(true, bar.isClass());
+ }
+
+ @Test
+ public void testGetFieldDeclarationTypeVariableInheritance() {
+ class Foo<E> {
+ E field;
+ }
+ class Bar extends Foo<String> {
+ }
+
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+
+ ResolvedReferenceTypeDeclaration foo = new ReflectionClassDeclaration(Foo.class, typeResolver);
+ ResolvedReferenceTypeDeclaration bar = new ReflectionClassDeclaration(Bar.class, typeResolver);
+
+ ResolvedFieldDeclaration fooField = foo.getField("field");
+ assertEquals(true, fooField.getType().isTypeVariable());
+ assertEquals("E", fooField.getType().asTypeParameter().getName());
+
+ ResolvedFieldDeclaration barField = bar.getField("field");
+ assertEquals(true, barField.getType().isReferenceType());
+ assertEquals(String.class.getCanonicalName(), barField.getType().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetDeclaredMethods() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedReferenceTypeDeclaration string = new ReflectionClassDeclaration(String.class, typeResolver);
+ List<ResolvedMethodDeclaration> methods = string.getDeclaredMethods().stream()
+ .filter(m -> m.accessSpecifier() != AccessSpecifier.PRIVATE && m.accessSpecifier() != AccessSpecifier.DEFAULT)
+ .sorted((a, b) -> a.getName().compareTo(b.getName()))
+ .collect(Collectors.toList());
+ if (isJava9()) {
+ assertEquals(69, methods.size());
+ } else {
+ assertEquals(67, methods.size());
+ }
+ assertEquals("charAt", methods.get(0).getName());
+ assertEquals(false, methods.get(0).isAbstract());
+ assertEquals(1, methods.get(0).getNumberOfParams());
+ assertEquals("int", methods.get(0).getParam(0).getType().describe());
+ if (isJava9()) {
+ assertEquals("compareTo", methods.get(6).getName());
+ assertEquals(false, methods.get(6).isAbstract());
+ assertEquals(1, methods.get(6).getNumberOfParams());
+ assertEquals("java.lang.String", methods.get(6).getParam(0).getType().describe());
+ } else {
+ assertEquals("concat", methods.get(6).getName());
+ assertEquals(false, methods.get(6).isAbstract());
+ assertEquals(1, methods.get(6).getNumberOfParams());
+ assertEquals("java.lang.String", methods.get(6).getParam(0).getType().describe());
+ }
+ }
+
+ @Test
+ public void testGetInterfaces() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedClassDeclaration arraylist = new ReflectionClassDeclaration(ArrayList.class, typeResolver);
+ // Serializable, Cloneable, List<E>, RandomAccess
+ assertEquals(ImmutableSet.of(Serializable.class.getCanonicalName(),
+ Cloneable.class.getCanonicalName(),
+ List.class.getCanonicalName(),
+ RandomAccess.class.getCanonicalName()),
+ arraylist.getInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllInterfaces() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedClassDeclaration arraylist = new ReflectionClassDeclaration(ArrayList.class, typeResolver);
+ // Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess
+ assertEquals(ImmutableSet.of(Serializable.class.getCanonicalName(),
+ Cloneable.class.getCanonicalName(),
+ List.class.getCanonicalName(),
+ RandomAccess.class.getCanonicalName(),
+ Collection.class.getCanonicalName(),
+ Iterable.class.getCanonicalName()),
+ arraylist.getAllInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllSuperclasses() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedClassDeclaration arraylist = new ReflectionClassDeclaration(ArrayList.class, typeResolver);
+ assertEquals(ImmutableSet.of(Object.class.getCanonicalName(),
+ AbstractCollection.class.getCanonicalName(),
+ AbstractList.class.getCanonicalName()),
+ arraylist.getAllSuperClasses().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ ResolvedClassDeclaration string = new ReflectionClassDeclaration(String.class, typeResolver);
+ assertEquals(ImmutableSet.of(Object.class.getCanonicalName()),
+ string.getAllSuperClasses().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetPackageName() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedClassDeclaration arraylist = new ReflectionClassDeclaration(ArrayList.class, typeResolver);
+ assertEquals("java.util", arraylist.getPackageName());
+ ResolvedClassDeclaration string = new ReflectionClassDeclaration(String.class, typeResolver);
+ assertEquals("java.lang", string.getPackageName());
+ }
+
+ @Test
+ public void testGetClassName() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedClassDeclaration arraylist = new ReflectionClassDeclaration(ArrayList.class, typeResolver);
+ assertEquals("ArrayList", arraylist.getClassName());
+ ResolvedClassDeclaration string = new ReflectionClassDeclaration(String.class, typeResolver);
+ assertEquals("String", string.getClassName());
+ }
+
+ @Test
+ public void testGetQualifiedName() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedClassDeclaration arraylist = new ReflectionClassDeclaration(ArrayList.class, typeResolver);
+ assertEquals("java.util.ArrayList", arraylist.getQualifiedName());
+ ResolvedClassDeclaration string = new ReflectionClassDeclaration(String.class, typeResolver);
+ assertEquals("java.lang.String", string.getQualifiedName());
+ }
+
+ // solveMethod
+ // isAssignableBy
+ // canBeAssignedTo
+ // hasField
+ // solveSymbol
+ // solveType
+ // getDeclaredMethods
+ // getAllMethods
+
+ @Test
+ public void testGetAllFields() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedClassDeclaration arraylist = new ReflectionClassDeclaration(ArrayList.class, typeResolver);
+ assertEquals(ImmutableSet.of("modCount", "serialVersionUID", "MAX_ARRAY_SIZE", "size", "elementData", "EMPTY_ELEMENTDATA", "DEFAULTCAPACITY_EMPTY_ELEMENTDATA", "DEFAULT_CAPACITY"),
+ arraylist.getAllFields().stream().map(ResolvedDeclaration::getName).collect(Collectors.toSet()));
+ }
+
+ ///
+ /// Test ancestors
+ ///
+
+ @Test
+ public void testAllAncestors() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedClassDeclaration arraylist = new ReflectionClassDeclaration(ArrayList.class, typeResolver);
+ Map<String, ResolvedReferenceType> ancestors = new HashMap<>();
+ arraylist.getAllAncestors().forEach(a -> ancestors.put(a.getQualifiedName(), a));
+ assertEquals(9, ancestors.size());
+
+ ResolvedTypeVariable typeVariable = new ResolvedTypeVariable(arraylist.getTypeParameters().get(0));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(RandomAccess.class, typeResolver), typeResolver), ancestors.get("java.util.RandomAccess"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(AbstractCollection.class, typeResolver), ImmutableList.of(typeVariable), typeResolver), ancestors.get("java.util.AbstractCollection"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(List.class, typeResolver), ImmutableList.of(typeVariable), typeResolver), ancestors.get("java.util.List"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Cloneable.class, typeResolver), typeResolver), ancestors.get("java.lang.Cloneable"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Collection.class, typeResolver), ImmutableList.of(typeVariable), typeResolver), ancestors.get("java.util.Collection"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(AbstractList.class, typeResolver), ImmutableList.of(typeVariable), typeResolver), ancestors.get("java.util.AbstractList"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeResolver), typeResolver), ancestors.get("java.lang.Object"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Iterable.class, typeResolver), ImmutableList.of(typeVariable), typeResolver), ancestors.get("java.lang.Iterable"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Serializable.class, typeResolver), typeResolver), ancestors.get("java.io.Serializable"));
+ }
+
+ @Test
+ public void testGetSuperclassWithoutTypeParameters() {
+ ReflectionClassDeclaration compilationUnit = (ReflectionClassDeclaration) typeResolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals("com.github.javaparser.ast.Node", compilationUnit.getSuperClass().getQualifiedName());
+ }
+
+ @Test
+ public void testGetSuperclassWithTypeParameters() {
+ ReflectionClassDeclaration compilationUnit = (ReflectionClassDeclaration) typeResolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals("com.github.javaparser.ast.body.CallableDeclaration", compilationUnit.getSuperClass().getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", compilationUnit.getSuperClass().typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.CallableDeclaration.T").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAllSuperclassesWithoutTypeParameters() {
+ ReflectionClassDeclaration cu = (ReflectionClassDeclaration) typeResolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of("com.github.javaparser.ast.Node", "java.lang.Object"), cu.getAllSuperClasses().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllSuperclassesWithTypeParameters() {
+ ReflectionClassDeclaration constructorDeclaration = (ReflectionClassDeclaration) typeResolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(4, constructorDeclaration.getAllSuperClasses().size());
+ assertEquals(true, constructorDeclaration.getAllSuperClasses().stream().anyMatch(s -> s.getQualifiedName().equals("com.github.javaparser.ast.body.CallableDeclaration")));
+ assertEquals(true, constructorDeclaration.getAllSuperClasses().stream().anyMatch(s -> s.getQualifiedName().equals("com.github.javaparser.ast.body.BodyDeclaration")));
+ assertEquals(true, constructorDeclaration.getAllSuperClasses().stream().anyMatch(s -> s.getQualifiedName().equals("com.github.javaparser.ast.Node")));
+ assertEquals(true, constructorDeclaration.getAllSuperClasses().stream().anyMatch(s -> s.getQualifiedName().equals("java.lang.Object")));
+
+ ResolvedReferenceType ancestor;
+
+ ancestor = constructorDeclaration.getAllSuperClasses().get(0);
+ assertEquals("com.github.javaparser.ast.body.CallableDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.CallableDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllSuperClasses().get(1);
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllSuperClasses().get(2);
+ assertEquals("com.github.javaparser.ast.Node", ancestor.getQualifiedName());
+
+ ancestor = constructorDeclaration.getAllSuperClasses().get(3);
+ assertEquals("java.lang.Object", ancestor.getQualifiedName());
+ }
+
+ @Test
+ public void testGetInterfacesWithoutParameters() {
+ ReflectionClassDeclaration compilationUnit = (ReflectionClassDeclaration) typeResolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of(), compilationUnit.getInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+
+ ReflectionClassDeclaration coid = (ReflectionClassDeclaration) typeResolver.solveType("com.github.javaparser.ast.body.ClassOrInterfaceDeclaration");
+
+ assertEquals(ImmutableSet.of("com.github.javaparser.ast.nodeTypes.NodeWithExtends",
+ "com.github.javaparser.ast.nodeTypes.modifiers.NodeWithFinalModifier",
+ "com.github.javaparser.ast.nodeTypes.NodeWithConstructors",
+ "com.github.javaparser.ast.nodeTypes.NodeWithImplements",
+ "com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAbstractModifier",
+ "com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters",
+ "com.github.javaparser.resolution.Resolvable"),
+ coid.getInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetInterfacesWithParameters() {
+ ReflectionClassDeclaration constructorDeclaration = (ReflectionClassDeclaration) typeResolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ System.out.println(constructorDeclaration.getInterfaces().stream().map(t -> t.getQualifiedName()).collect(Collectors.toList()));
+ assertEquals(8, constructorDeclaration.getInterfaces().size());
+
+ ResolvedReferenceType interfaze;
+
+ interfaze = constructorDeclaration.getInterfaces().get(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(1);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(2);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(4);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getInterfaces().get(7);
+ assertEquals("com.github.javaparser.resolution.Resolvable", interfaze.getQualifiedName());
+ }
+
+ @Test
+ public void testGetAllInterfacesWithoutParameters() {
+ ReflectionClassDeclaration compilationUnit = (ReflectionClassDeclaration) typeResolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of("java.lang.Cloneable", "com.github.javaparser.ast.visitor.Visitable", "com.github.javaparser.ast.observer.Observable",
+ "com.github.javaparser.HasParentNode", "com.github.javaparser.ast.nodeTypes.NodeWithRange",
+ "com.github.javaparser.ast.nodeTypes.NodeWithTokenRange").stream().sorted().collect(Collectors.toList()),
+ compilationUnit.getAllInterfaces().stream().map(i -> i.getQualifiedName()).sorted().collect(Collectors.toList()));
+
+ ReflectionClassDeclaration coid = (ReflectionClassDeclaration) typeResolver.solveType("com.github.javaparser.ast.body.ClassOrInterfaceDeclaration");
+ assertEquals(ImmutableSet.of("com.github.javaparser.ast.nodeTypes.NodeWithExtends",
+ "com.github.javaparser.ast.nodeTypes.NodeWithAnnotations",
+ "java.lang.Cloneable",
+ "com.github.javaparser.HasParentNode",
+ "com.github.javaparser.ast.visitor.Visitable",
+ "com.github.javaparser.ast.nodeTypes.NodeWithImplements",
+ "com.github.javaparser.ast.nodeTypes.NodeWithSimpleName",
+ "com.github.javaparser.ast.nodeTypes.NodeWithModifiers",
+ "com.github.javaparser.ast.nodeTypes.NodeWithJavadoc",
+ "com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters",
+ "com.github.javaparser.ast.nodeTypes.NodeWithMembers",
+ "com.github.javaparser.ast.observer.Observable",
+ "com.github.javaparser.ast.nodeTypes.modifiers.NodeWithFinalModifier",
+ "com.github.javaparser.ast.nodeTypes.modifiers.NodeWithProtectedModifier",
+ "com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPrivateModifier",
+ "com.github.javaparser.ast.nodeTypes.modifiers.NodeWithStaticModifier",
+ "com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAbstractModifier",
+ "com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPublicModifier",
+ "com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers",
+ "com.github.javaparser.ast.nodeTypes.modifiers.NodeWithStrictfpModifier",
+ "com.github.javaparser.ast.nodeTypes.NodeWithRange",
+ "com.github.javaparser.ast.nodeTypes.NodeWithTokenRange",
+ "com.github.javaparser.ast.nodeTypes.NodeWithConstructors",
+ "com.github.javaparser.resolution.Resolvable"), coid.getAllInterfaces().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllInterfacesWithParameters() {
+ ReflectionClassDeclaration constructorDeclaration = (ReflectionClassDeclaration) typeResolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ List<ResolvedReferenceType> interfaces = constructorDeclaration.getAllInterfaces();
+ assertEquals(34, interfaces.size());
+
+ ResolvedReferenceType interfaze;
+ int i = 0;
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPublicModifier", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPublicModifier.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPrivateModifier", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPrivateModifier.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithProtectedModifier", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithProtectedModifier.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.resolution.Resolvable", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("java.lang.Cloneable", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.HasParentNode", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.Node", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.HasParentNode.T").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.observer.Observable", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.visitor.Visitable", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithRange", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.Node", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithRange.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithTokenRange", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.Node", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithTokenRange.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPublicModifier", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPublicModifier.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPrivateModifier", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPrivateModifier.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithProtectedModifier", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithProtectedModifier.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", interfaze.getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAbstractModifier", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAbstractModifier.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithStaticModifier", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithStaticModifier.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithFinalModifier", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithFinalModifier.N").get().asReferenceType().getQualifiedName());
+
+ interfaze = constructorDeclaration.getAllInterfaces().get(i++);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithStrictfpModifier", interfaze.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithStrictfpModifier.N").get().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void testGetAncestorsWithTypeParameters() {
+ ReflectionClassDeclaration constructorDeclaration = (ReflectionClassDeclaration) typeResolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+ assertEquals(9, constructorDeclaration.getAncestors().size());
+
+ ResolvedReferenceType ancestor;
+ List<ResolvedReferenceType> ancestors = constructorDeclaration.getAncestors();
+ ancestors.sort(Comparator.comparing(ResolvedReferenceType::getQualifiedName));
+
+ ancestor = ancestors.get(0);
+ assertEquals("com.github.javaparser.ast.body.CallableDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.CallableDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.get(1);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.get(2);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.get(3);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.get(4);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.get(5);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.get(6);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.get(7);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.get(8);
+ assertEquals("com.github.javaparser.resolution.Resolvable", ancestor.getQualifiedName());
+ }
+
+ @Test
+ public void testGetAllAncestorsWithoutTypeParameters() {
+ ReflectionClassDeclaration cu = (ReflectionClassDeclaration) typeResolver.solveType("com.github.javaparser.ast.CompilationUnit");
+ assertEquals(ImmutableSet.of("java.lang.Cloneable", "com.github.javaparser.ast.visitor.Visitable",
+ "com.github.javaparser.ast.observer.Observable", "com.github.javaparser.ast.Node",
+ "com.github.javaparser.ast.nodeTypes.NodeWithTokenRange", "java.lang.Object", "com.github.javaparser.HasParentNode",
+ "com.github.javaparser.ast.nodeTypes.NodeWithRange"), cu.getAllAncestors().stream().map(i -> i.getQualifiedName()).collect(Collectors.toSet()));
+ }
+
+ @Test
+ public void testGetAllAncestorsWithTypeParameters() {
+ ReflectionClassDeclaration constructorDeclaration = (ReflectionClassDeclaration) typeResolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ ResolvedReferenceType ancestor;
+ List<ResolvedReferenceType> ancestors = constructorDeclaration.getAllAncestors();
+ ancestors.sort(Comparator.comparing(ResolvedReferenceType::getQualifiedName));
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.HasParentNode", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.Node", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.HasParentNode.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.Node", ancestor.getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.body.BodyDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.body.CallableDeclaration", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.CallableDeclaration.T").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", ancestor.getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithRange", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.Node", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithRange.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithTokenRange", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.Node", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithTokenRange.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAbstractModifier", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAbstractModifier.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithFinalModifier", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithFinalModifier.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPrivateModifier", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPrivateModifier.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithProtectedModifier", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithProtectedModifier.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPublicModifier", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPublicModifier.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithStaticModifier", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithStaticModifier.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithStrictfpModifier", ancestor.getQualifiedName());
+ assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithStrictfpModifier.N").get().asReferenceType().getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.observer.Observable", ancestor.getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.ast.visitor.Visitable", ancestor.getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("com.github.javaparser.resolution.Resolvable", ancestor.getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("java.lang.Cloneable", ancestor.getQualifiedName());
+
+ ancestor = ancestors.remove(0);
+ assertEquals("java.lang.Object", ancestor.getQualifiedName());
+
+ assertTrue(ancestors.isEmpty());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionEnumDeclarationTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionEnumDeclarationTest.java
new file mode 100644
index 000000000..00379b0ba
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionEnumDeclarationTest.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.reflectionmodel;
+
+import com.github.javaparser.symbolsolver.AbstractTest;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class ReflectionEnumDeclarationTest extends AbstractTest {
+
+ private TypeSolver typeSolver = new ReflectionTypeSolver(false);
+
+ ///
+ /// Test misc
+ ///
+
+ @Test
+ public void testIsClass() {
+ ReflectionEnumDeclaration modifier = (ReflectionEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(false, modifier.isClass());
+ }
+
+ @Test
+ public void testIsInterface() {
+ ReflectionEnumDeclaration modifier = (ReflectionEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(false, modifier.isInterface());
+ }
+
+ @Test
+ public void testIsEnum() {
+ ReflectionEnumDeclaration modifier = (ReflectionEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(true, modifier.isEnum());
+ }
+
+ @Test
+ public void testIsTypeVariable() {
+ ReflectionEnumDeclaration modifier = (ReflectionEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(false, modifier.isTypeParameter());
+ }
+
+ @Test
+ public void testIsType() {
+ ReflectionEnumDeclaration modifier = (ReflectionEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(true, modifier.isType());
+ }
+
+ @Test
+ public void testAsType() {
+ ReflectionEnumDeclaration modifier = (ReflectionEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(modifier, modifier.asType());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsClass() {
+ ReflectionEnumDeclaration modifier = (ReflectionEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ modifier.asClass();
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testAsInterface() {
+ ReflectionEnumDeclaration modifier = (ReflectionEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ modifier.asInterface();
+ }
+
+ @Test
+ public void testAsEnum() {
+ ReflectionEnumDeclaration modifier = (ReflectionEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals(modifier, modifier.asEnum());
+ }
+
+ @Test
+ public void testGetPackageName() {
+ ReflectionEnumDeclaration modifier = (ReflectionEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals("com.github.javaparser.ast", modifier.getPackageName());
+ }
+
+ @Test
+ public void testGetClassName() {
+ ReflectionEnumDeclaration modifier = (ReflectionEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals("Modifier", modifier.getClassName());
+ }
+
+ @Test
+ public void testGetQualifiedName() {
+ ReflectionEnumDeclaration modifier = (ReflectionEnumDeclaration) typeSolver.solveType("com.github.javaparser.ast.Modifier");
+ assertEquals("com.github.javaparser.ast.Modifier", modifier.getQualifiedName());
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionInterfaceDeclarationTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionInterfaceDeclarationTest.java
new file mode 100644
index 000000000..a52661078
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionInterfaceDeclarationTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.reflectionmodel;
+
+import com.github.javaparser.resolution.declarations.ResolvedInterfaceDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration;
+import com.github.javaparser.resolution.types.ResolvedReferenceType;
+import com.github.javaparser.resolution.types.ResolvedTypeVariable;
+import com.github.javaparser.symbolsolver.AbstractTest;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import com.google.common.collect.ImmutableList;
+import org.junit.Test;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+
+public class ReflectionInterfaceDeclarationTest extends AbstractTest {
+
+ @Test
+ public void testGetDeclaredMethods() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedReferenceTypeDeclaration list = new ReflectionInterfaceDeclaration(List.class, typeResolver);
+ List<ResolvedMethodDeclaration> methods = list.getDeclaredMethods().stream()
+ .sorted((a, b) -> a.getName().compareTo(b.getName()))
+ .collect(Collectors.toList());
+ if (isJava9()) {
+ assertEquals(40, methods.size());
+ assertEquals("clear", methods.get(4).getName());
+ assertEquals(true, methods.get(4).isAbstract());
+ assertEquals(0, methods.get(4).getNumberOfParams());
+ assertEquals("contains", methods.get(5).getName());
+ assertEquals(true, methods.get(5).isAbstract());
+ assertEquals(1, methods.get(5).getNumberOfParams());
+ assertEquals(true, methods.get(5).getParam(0).getType().isReferenceType());
+ assertEquals(Object.class.getCanonicalName(), methods.get(5).getParam(0).getType().asReferenceType().getQualifiedName());
+ } else {
+ assertEquals(28, methods.size());
+ assertEquals("clear", methods.get(4).getName());
+ assertEquals(true, methods.get(4).isAbstract());
+ assertEquals(0, methods.get(4).getNumberOfParams());
+ assertEquals("contains", methods.get(5).getName());
+ assertEquals(true, methods.get(5).isAbstract());
+ assertEquals(1, methods.get(5).getNumberOfParams());
+ assertEquals(true, methods.get(5).getParam(0).getType().isReferenceType());
+ assertEquals(Object.class.getCanonicalName(), methods.get(5).getParam(0).getType().asReferenceType().getQualifiedName());
+ }
+ }
+
+ @Test
+ public void testAllAncestors() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+ ResolvedInterfaceDeclaration list = new ReflectionInterfaceDeclaration(List.class, typeResolver);
+ Map<String, ResolvedReferenceType> ancestors = new HashMap<>();
+ list.getAllAncestors().forEach(a -> ancestors.put(a.getQualifiedName(), a));
+ assertEquals(3, ancestors.size());
+
+ ResolvedTypeVariable typeVariable = new ResolvedTypeVariable(list.getTypeParameters().get(0));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Collection.class, typeResolver), ImmutableList.of(typeVariable), typeResolver), ancestors.get("java.util.Collection"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeResolver), typeResolver), ancestors.get("java.lang.Object"));
+ assertEquals(new ReferenceTypeImpl(new ReflectionInterfaceDeclaration(Iterable.class, typeResolver), ImmutableList.of(typeVariable), typeResolver), ancestors.get("java.lang.Iterable"));
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionMethodDeclarationTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionMethodDeclarationTest.java
new file mode 100644
index 000000000..8a5be170f
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/reflectionmodel/ReflectionMethodDeclarationTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.reflectionmodel;
+
+import com.github.javaparser.resolution.declarations.ResolvedClassDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedInterfaceDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+
+public class ReflectionMethodDeclarationTest {
+
+ @Test
+ public void testGetSignature() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+
+ ResolvedClassDeclaration object = new ReflectionClassDeclaration(Object.class, typeResolver);
+ ResolvedInterfaceDeclaration list = new ReflectionInterfaceDeclaration(List.class, typeResolver);
+
+ ResolvedMethodDeclaration hashCode = object.getAllMethods().stream().filter(m -> m.getName().equals("hashCode")).findFirst().get().getDeclaration();
+ ResolvedMethodDeclaration equals = object.getAllMethods().stream().filter(m -> m.getName().equals("equals")).findFirst().get().getDeclaration();
+ ResolvedMethodDeclaration containsAll = list.getAllMethods().stream().filter(m -> m.getName().equals("containsAll")).findFirst().get().getDeclaration();
+ ResolvedMethodDeclaration subList = list.getAllMethods().stream().filter(m -> m.getName().equals("subList")).findFirst().get().getDeclaration();
+
+ assertEquals("hashCode()", hashCode.getSignature());
+ assertEquals("equals(java.lang.Object)", equals.getSignature());
+ assertEquals("containsAll(java.util.Collection<? extends java.lang.Object>)", containsAll.getSignature());
+ assertEquals("subList(int, int)", subList.getSignature());
+ }
+
+ @Test
+ public void testGetGenericReturnType() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+
+ ResolvedInterfaceDeclaration map = new ReflectionInterfaceDeclaration(Map.class, typeResolver);
+
+ ResolvedMethodDeclaration put = map.getAllMethods().stream().filter(m -> m.getName().equals("put")).findFirst().get().getDeclaration();
+ assertEquals(true, put.getReturnType().isTypeVariable());
+ assertEquals(true, put.getReturnType().asTypeParameter().declaredOnType());
+ assertEquals("java.util.Map.V", put.getReturnType().asTypeParameter().getQualifiedName());
+ }
+
+ @Test
+ public void testGetGenericParameters() {
+ TypeSolver typeResolver = new ReflectionTypeSolver();
+
+ ResolvedInterfaceDeclaration map = new ReflectionInterfaceDeclaration(Map.class, typeResolver);
+
+ ResolvedMethodDeclaration put = map.getAllMethods().stream().filter(m -> m.getName().equals("put")).findFirst().get().getDeclaration();
+ assertEquals(true, put.getParam(0).getType().isTypeVariable());
+ assertEquals(true, put.getParam(0).getType().asTypeParameter().declaredOnType());
+ assertEquals("java.util.Map.K", put.getParam(0).getType().asTypeParameter().getQualifiedName());
+
+ assertEquals(true, put.getParam(1).getType().isTypeVariable());
+ assertEquals(true, put.getParam(1).getType().asTypeParameter().declaredOnType());
+ assertEquals("java.util.Map.V", put.getParam(1).getType().asTypeParameter().getQualifiedName());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AbstractResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AbstractResolutionTest.java
new file mode 100644
index 000000000..ded9267d8
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AbstractResolutionTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.symbolsolver.AbstractTest;
+
+import java.io.InputStream;
+
+/**
+ * @author Federico Tomassetti
+ */
+public abstract class AbstractResolutionTest extends AbstractTest {
+
+ protected CompilationUnit parseSampleWithStandardExtension(String sampleName) {
+ return parseSample(sampleName, "java");
+ }
+
+ protected CompilationUnit parseSample(String sampleName) {
+ return parseSample(sampleName, "java.txt");
+ }
+
+ private CompilationUnit parseSample(String sampleName, String extension) {
+ InputStream is = this.getClass().getClassLoader().getResourceAsStream(sampleName + "." + extension);
+ if (is == null) {
+ throw new RuntimeException("Unable to find sample " + sampleName);
+ }
+ return JavaParser.parse(is);
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AnalyseJavaParserTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AnalyseJavaParserTest.java
new file mode 100644
index 000000000..7b9f61b29
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AnalyseJavaParserTest.java
@@ -0,0 +1,267 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.SlowTest;
+import com.github.javaparser.symbolsolver.AbstractTest;
+import com.github.javaparser.symbolsolver.SourceFileInfoExtractor;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+@Category(SlowTest.class)
+public class AnalyseJavaParserTest extends AbstractTest {
+
+ private static final File src = adaptPath(new File("src/test/test_sourcecode/javaparser_src/proper_source"));
+
+ private SourceFileInfoExtractor getSourceFileInfoExtractor() {
+ CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
+ combinedTypeSolver.add(new ReflectionTypeSolver());
+ combinedTypeSolver.add(new JavaParserTypeSolver(src));
+ combinedTypeSolver.add(new JavaParserTypeSolver(adaptPath(new File("src/test/test_sourcecode/javaparser_src/generated"))));
+ SourceFileInfoExtractor sourceFileInfoExtractor = new SourceFileInfoExtractor();
+ sourceFileInfoExtractor.setTypeSolver(combinedTypeSolver);
+ sourceFileInfoExtractor.setPrintFileName(false);
+ return sourceFileInfoExtractor;
+ }
+
+ static String readFile(File file)
+ throws IOException {
+ byte[] encoded = Files.readAllBytes(Paths.get(file.getAbsolutePath()));
+ return new String(encoded, StandardCharsets.UTF_8);
+ }
+
+ private static final boolean DEBUG = true;
+
+ private void parse(String fileName) throws IOException, ParseException {
+ File sourceFile = new File(src.getAbsolutePath() + "/" + fileName + ".java");
+ SourceFileInfoExtractor sourceFileInfoExtractor = getSourceFileInfoExtractor();
+ OutputStream outErrStream = new ByteArrayOutputStream();
+ PrintStream outErr = new PrintStream(outErrStream);
+
+ sourceFileInfoExtractor.setOut(outErr);
+ sourceFileInfoExtractor.setErr(outErr);
+ sourceFileInfoExtractor.solve(sourceFile);
+ String output = outErrStream.toString();
+
+ String path = "src/test/resources/javaparser_expected_output/" + fileName.replaceAll("/", "_") + ".txt";
+ File dstFile = adaptPath(new File(path));
+
+ if (DEBUG && (sourceFileInfoExtractor.getKo() != 0 || sourceFileInfoExtractor.getUnsupported() != 0)) {
+ System.err.println(output);
+ }
+
+ assertTrue("No failures expected when analyzing " + path, 0 == sourceFileInfoExtractor.getKo());
+ assertTrue("No UnsupportedOperationException expected when analyzing " + path, 0 == sourceFileInfoExtractor.getUnsupported());
+
+ String expected = readFile(dstFile);
+
+ String[] outputLines = output.split("\n");
+ String[] expectedLines = expected.split("\n");
+
+ for (int i = 0; i < Math.min(outputLines.length, expectedLines.length); i++) {
+ assertEquals("Line " + (i + 1) + " of " + path + " is different from what is expected", expectedLines[i].trim(), outputLines[i].trim());
+ }
+
+ assertEquals(expectedLines.length, outputLines.length);
+
+ JavaParserFacade.clearInstances();
+
+ // If we need to update the file uncomment these lines
+ //PrintWriter writer = new PrintWriter(dstFile.getAbsoluteFile(), "UTF-8");
+ //writer.print(output);
+ //writer.close();
+ }
+
+ @Test
+ public void parsePositionUtils() throws IOException, ParseException {
+ parse("com/github/javaparser/PositionUtils");
+ }
+
+ @Test
+ public void parseJavaParser() throws IOException, ParseException {
+ parse("com/github/javaparser/JavaParser");
+ }
+
+ @Test
+ public void parseStatement() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/stmt/Statement");
+ }
+
+ @Test
+ public void parseCatchClause() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/stmt/CatchClause");
+ }
+
+ @Test
+ public void parseStatements() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/stmt/LabeledStmt");
+ parse("com/github/javaparser/ast/stmt/BreakStmt");
+ parse("com/github/javaparser/ast/stmt/ReturnStmt");
+ parse("com/github/javaparser/ast/stmt/DoStmt");
+ parse("com/github/javaparser/ast/stmt/AssertStmt");
+ parse("com/github/javaparser/ast/stmt/ContinueStmt");
+ parse("com/github/javaparser/ast/stmt/BlockStmt");
+ parse("com/github/javaparser/ast/stmt/ExplicitConstructorInvocationStmt");
+ parse("com/github/javaparser/ast/stmt/ExpressionStmt");
+ parse("com/github/javaparser/ast/stmt/EmptyStmt");
+ parse("com/github/javaparser/ast/stmt/SwitchStmt");
+ parse("com/github/javaparser/ast/stmt/IfStmt");
+ parse("com/github/javaparser/ast/stmt/SwitchEntryStmt");
+ parse("com/github/javaparser/ast/stmt/SynchronizedStmt");
+ parse("com/github/javaparser/ast/stmt/ForeachStmt");
+ parse("com/github/javaparser/ast/stmt/ForStmt");
+ parse("com/github/javaparser/ast/stmt/WhileStmt");
+ parse("com/github/javaparser/ast/stmt/ThrowStmt");
+ parse("com/github/javaparser/ast/stmt/TryStmt");
+ parse("com/github/javaparser/ast/stmt/TypeDeclarationStmt");
+ }
+
+ @Test
+ public void parseExpressions() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/expr/NameExpr");
+ parse("com/github/javaparser/ast/expr/FieldAccessExpr");
+ parse("com/github/javaparser/ast/expr/CharLiteralExpr");
+ parse("com/github/javaparser/ast/expr/IntegerLiteralMinValueExpr");
+ parse("com/github/javaparser/ast/expr/IntegerLiteralExpr");
+ parse("com/github/javaparser/ast/expr/ArrayCreationExpr");
+ parse("com/github/javaparser/ast/expr/VariableDeclarationExpr");
+ parse("com/github/javaparser/ast/expr/SuperExpr");
+ parse("com/github/javaparser/ast/expr/ArrayInitializerExpr");
+ parse("com/github/javaparser/ast/expr/EnclosedExpr");
+ parse("com/github/javaparser/ast/expr/Expression");
+ parse("com/github/javaparser/ast/expr/SingleMemberAnnotationExpr");
+ parse("com/github/javaparser/ast/expr/MethodReferenceExpr");
+ parse("com/github/javaparser/ast/expr/ThisExpr");
+ parse("com/github/javaparser/ast/expr/LiteralExpr");
+ parse("com/github/javaparser/ast/expr/AnnotationExpr");
+ parse("com/github/javaparser/ast/expr/InstanceOfExpr");
+ parse("com/github/javaparser/ast/expr/LongLiteralExpr");
+ parse("com/github/javaparser/ast/expr/StringLiteralExpr");
+ parse("com/github/javaparser/ast/expr/NullLiteralExpr");
+ parse("com/github/javaparser/ast/expr/ObjectCreationExpr");
+ parse("com/github/javaparser/ast/expr/TypeExpr");
+ parse("com/github/javaparser/ast/expr/DoubleLiteralExpr");
+ parse("com/github/javaparser/ast/expr/LongLiteralMinValueExpr");
+ parse("com/github/javaparser/ast/expr/MarkerAnnotationExpr");
+ parse("com/github/javaparser/ast/expr/LambdaExpr");
+ parse("com/github/javaparser/ast/expr/AssignExpr");
+ parse("com/github/javaparser/ast/expr/NormalAnnotationExpr");
+ parse("com/github/javaparser/ast/expr/QualifiedNameExpr");
+ parse("com/github/javaparser/ast/expr/MemberValuePair");
+ parse("com/github/javaparser/ast/expr/ArrayAccessExpr");
+ parse("com/github/javaparser/ast/expr/ClassExpr");
+ parse("com/github/javaparser/ast/expr/MethodCallExpr");
+ parse("com/github/javaparser/ast/expr/ConditionalExpr");
+ parse("com/github/javaparser/ast/expr/CastExpr");
+ parse("com/github/javaparser/ast/expr/BooleanLiteralExpr");
+ parse("com/github/javaparser/ast/expr/BinaryExpr");
+ parse("com/github/javaparser/ast/expr/UnaryExpr");
+ }
+
+ @Test
+ public void parseTypes() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/type/ClassOrInterfaceType");
+ parse("com/github/javaparser/ast/type/PrimitiveType");
+ parse("com/github/javaparser/ast/type/WildcardType");
+ parse("com/github/javaparser/ast/type/UnknownType");
+ parse("com/github/javaparser/ast/type/ReferenceType");
+ parse("com/github/javaparser/ast/type/VoidType");
+ parse("com/github/javaparser/ast/type/Type");
+ }
+
+ @Test
+ public void parseVisitors() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/visitor/EqualsVisitor");
+ parse("com/github/javaparser/ast/visitor/ModifierVisitorAdapter");
+ parse("com/github/javaparser/ast/visitor/DumpVisitor");
+ parse("com/github/javaparser/ast/visitor/VoidVisitor");
+ parse("com/github/javaparser/ast/visitor/GenericVisitor");
+ parse("com/github/javaparser/ast/visitor/VoidVisitorAdapter");
+ parse("com/github/javaparser/ast/visitor/GenericVisitorAdapter");
+ }
+
+ @Test
+ public void parseCloneVisitor() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/visitor/CloneVisitor");
+ }
+
+ @Test
+ public void parseSourcesHelper() throws IOException, ParseException {
+ parse("com/github/javaparser/SourcesHelper");
+ }
+
+ @Test
+ public void parseComments() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/comments/LineComment");
+ parse("com/github/javaparser/ast/comments/Comment");
+ parse("com/github/javaparser/ast/comments/CommentsParser");
+ parse("com/github/javaparser/ast/comments/JavadocComment");
+ parse("com/github/javaparser/ast/comments/BlockComment");
+ parse("com/github/javaparser/ast/comments/CommentsCollection");
+ }
+
+ @Test
+ public void parseTheRest() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/internal/Utils");
+ parse("com/github/javaparser/ast/body/AnnotationMemberDeclaration");
+ parse("com/github/javaparser/ast/body/EnumDeclaration");
+ parse("com/github/javaparser/ast/body/Parameter");
+ parse("com/github/javaparser/ast/body/EnumConstantDeclaration");
+ parse("com/github/javaparser/ast/body/VariableDeclarator");
+ parse("com/github/javaparser/ast/body/TypeDeclaration");
+ parse("com/github/javaparser/ast/body/EmptyMemberDeclaration");
+ parse("com/github/javaparser/ast/body/ModifierSet");
+ parse("com/github/javaparser/ast/body/VariableDeclaratorId");
+ parse("com/github/javaparser/ast/body/BaseParameter");
+ parse("com/github/javaparser/ast/body/AnnotableNode");
+ parse("com/github/javaparser/ast/body/AnnotationDeclaration");
+ parse("com/github/javaparser/ast/body/MethodDeclaration");
+ parse("com/github/javaparser/ast/body/EmptyTypeDeclaration");
+ parse("com/github/javaparser/ast/body/InitializerDeclaration");
+ parse("com/github/javaparser/ast/body/BodyDeclaration");
+ parse("com/github/javaparser/ast/body/FieldDeclaration");
+ parse("com/github/javaparser/ast/body/ConstructorDeclaration");
+ parse("com/github/javaparser/ast/body/WithDeclaration");
+ parse("com/github/javaparser/ast/body/MultiTypeParameter");
+ parse("com/github/javaparser/ast/body/ClassOrInterfaceDeclaration");
+ parse("com/github/javaparser/ast/TreeVisitor");
+ parse("com/github/javaparser/ast/PackageDeclaration");
+ parse("com/github/javaparser/ast/DocumentableNode");
+ parse("com/github/javaparser/ast/NamedNode");
+ parse("com/github/javaparser/ast/Node");
+ parse("com/github/javaparser/ast/AccessSpecifier");
+ parse("com/github/javaparser/ast/CompilationUnit");
+ parse("com/github/javaparser/ast/TypeParameter");
+ parse("com/github/javaparser/ast/ImportDeclaration");
+ parse("com/github/javaparser/Position");
+ parse("com/github/javaparser/ASTHelper");
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AnalyseJavaSymbolSolver060Test.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AnalyseJavaSymbolSolver060Test.java
new file mode 100644
index 000000000..1cce12aa8
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AnalyseJavaSymbolSolver060Test.java
@@ -0,0 +1,349 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.SlowTest;
+import com.github.javaparser.symbolsolver.SourceFileInfoExtractor;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * We analyze JavaParser version 0.6.0.
+ */
+@Category(SlowTest.class)
+public class AnalyseJavaSymbolSolver060Test extends AbstractResolutionTest {
+
+ private static final File root = adaptPath(new File("src/test/resources/javasymbolsolver_0_6_0"));
+ private static final File src = adaptPath(new File(root + "/src"));
+ private static final File lib = adaptPath(new File(root + "/lib"));
+ private static final File expectedOutput = adaptPath(new File(root + "/expected_output"));
+
+ private static SourceFileInfoExtractor getSourceFileInfoExtractor() {
+ CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
+ combinedTypeSolver.add(new ReflectionTypeSolver());
+ combinedTypeSolver.add(new JavaParserTypeSolver(new File(src + "/java-symbol-solver-core")));
+ combinedTypeSolver.add(new JavaParserTypeSolver(new File(src + "/java-symbol-solver-logic")));
+ combinedTypeSolver.add(new JavaParserTypeSolver(new File(src + "/java-symbol-solver-model")));
+ try {
+ combinedTypeSolver.add(new JarTypeSolver(lib + "/guava-21.0.jar"));
+ combinedTypeSolver.add(new JarTypeSolver(lib + "/javaparser-core-3.3.0.jar"));
+ combinedTypeSolver.add(new JarTypeSolver(lib + "/javaslang-2.0.3.jar"));
+ combinedTypeSolver.add(new JarTypeSolver(lib + "/javassist-3.19.0-GA.jar"));
+ } catch (IOException e) {
+ Assert.fail("one or more jar dependencies could not be found.");
+ e.printStackTrace();
+ }
+ SourceFileInfoExtractor sourceFileInfoExtractor = new SourceFileInfoExtractor();
+ sourceFileInfoExtractor.setTypeSolver(combinedTypeSolver);
+ sourceFileInfoExtractor.setPrintFileName(false);
+ sourceFileInfoExtractor.setVerbose(true);
+ return sourceFileInfoExtractor;
+ }
+
+ private static SourceFileInfoExtractor sourceFileInfoExtractor = getSourceFileInfoExtractor();
+
+ static String readFile(File file)
+ throws IOException {
+ byte[] encoded = Files.readAllBytes(Paths.get(file.getAbsolutePath()));
+ return new String(encoded, StandardCharsets.UTF_8);
+ }
+
+ private static final boolean DEBUG = true;
+
+ /**
+ * @param projectName is one of "java-symbol-solver-core", "java-symbol-solver-logic", "java-symbol-solver-model"
+ * @param fileName describes the file being analyzed
+ * @throws IOException
+ * @throws ParseException
+ */
+ private void parse(String projectName, String fileName) throws IOException, ParseException {
+ File sourceFile = new File(src.getAbsolutePath() + "/" + projectName + "/" + fileName + ".java");
+ OutputStream outErrStream = new ByteArrayOutputStream();
+ PrintStream outErr = new PrintStream(outErrStream);
+
+ sourceFileInfoExtractor.setOut(outErr);
+ sourceFileInfoExtractor.setErr(outErr);
+ sourceFileInfoExtractor.solveMethodCalls(sourceFile);
+ String output = outErrStream.toString();
+
+ String path = adaptPath(expectedOutput).getPath() + "/" + projectName + "/" + fileName.replaceAll("/", "_") + ".txt";
+ File dstFile = new File(path);
+
+ if (isJava9()) {
+ String path9 = adaptPath(expectedOutput).getPath() + "/" + projectName + "/" + fileName.replaceAll("/", "_") + "_J9.txt";
+ File dstFile9 = new File(path9);
+ if (dstFile9.exists()) {
+ path = path9;
+ dstFile = dstFile9;
+ }
+ }
+
+ if (DEBUG && (sourceFileInfoExtractor.getKo() != 0 || sourceFileInfoExtractor.getUnsupported() != 0)) {
+ System.err.println(output);
+ }
+
+ assertTrue("No failures expected when analyzing " + path, 0 == sourceFileInfoExtractor.getKo());
+ assertTrue("No UnsupportedOperationException expected when analyzing " + path, 0 == sourceFileInfoExtractor.getUnsupported());
+
+ if (!dstFile.exists()) {
+ // If we need to update the file uncomment these lines
+// PrintWriter writer = new PrintWriter(dstFile.getAbsoluteFile(), "UTF-8");
+// writer.print(output);
+// writer.close();
+ }
+
+ String expected = readFile(dstFile);
+
+ String[] outputLines = output.split("\n");
+ String[] expectedLines = expected.split("\n");
+
+ for (int i = 0; i < Math.min(outputLines.length, expectedLines.length); i++) {
+ assertEquals("Line " + (i + 1) + " of " + path + " is different from what is expected", expectedLines[i].trim(), outputLines[i].trim());
+ }
+
+ assertEquals(expectedLines.length, outputLines.length);
+
+ JavaParserFacade.clearInstances();
+ }
+
+ @Test
+ public void parseCoreSourceFileInfoExtractor() throws IOException, ParseException {
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/SourceFileInfoExtractor");
+ }
+
+ @Test
+ public void parseCoreCoreResolution() throws IOException, ParseException {
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/core/resolution/Context");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/core/resolution/ContextHelper");
+ }
+
+ @Test
+ public void parseCoreDeclarationsCommon() throws IOException, ParseException {
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/declarations/common/MethodDeclarationCommonLogic");
+ }
+
+ @Test
+ public void parseCoreJavaparserNavigator() throws IOException, ParseException {
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparser/Navigator");
+ }
+
+ @Test
+ public void parseCoreJavaparsermodel() throws IOException, ParseException {
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/DefaultVisitorAdapter");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/JavaParserFacade");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/JavaParserFactory");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/LambdaArgumentTypePlaceholder");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/TypeExtractor");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/UnsolvedSymbolException");
+ }
+
+ @Test
+ public void parseCoreJavaparsermodelContexts() throws IOException, ParseException {
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/AbstractJavaParserContext");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/AbstractMethodLikeDeclarationContext");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/AnonymousClassDeclarationContext");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/CatchClauseContext");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/ClassOrInterfaceDeclarationContext");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/CompilationUnitContext");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/ConstructorContext");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/ContextHelper");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/EnumDeclarationContext");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/FieldAccessContext");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/ForechStatementContext");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/ForStatementContext");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/JavaParserTypeDeclarationAdapter");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/LambdaExprContext");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/MethodCallExprContext");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/MethodContext");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/StatementContext");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/SwitchEntryContext");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/contexts/TryWithResourceContext");
+ }
+
+ @Test
+ public void parseCoreJavaparsermodelDeclarations() throws IOException, ParseException {
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarations/DefaultConstructorDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarations/Helper");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserAnnotationDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserAnonymousClassDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserClassDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserConstructorDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserEnumConstantDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserEnumDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserFieldDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserInterfaceDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserMethodDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserParameterDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserSymbolDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserTypeAdapter");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserTypeParameter");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserTypeVariableDeclaration");
+ }
+
+ @Test
+ public void parseCoreJavaparsermodelDeclarators() throws IOException, ParseException {
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarators/AbstractSymbolDeclarator");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarators/FieldSymbolDeclarator");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarators/NoSymbolDeclarator");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarators/ParameterSymbolDeclarator");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javaparsermodel/declarators/VariableSymbolDeclarator");
+ }
+
+ @Test
+ public void parseCoreJavassistmodel() throws IOException, ParseException {
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javassistmodel/JavassistClassDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javassistmodel/JavassistConstructorDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javassistmodel/JavassistEnumDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javassistmodel/JavassistFactory");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javassistmodel/JavassistFieldDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javassistmodel/JavassistInterfaceDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javassistmodel/JavassistMethodDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javassistmodel/JavassistParameterDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javassistmodel/JavassistTypeDeclarationAdapter");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javassistmodel/JavassistTypeParameter");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/javassistmodel/JavassistUtils");
+ }
+
+ @Test
+ public void parseCoreModelTypesystem() throws IOException, ParseException {
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/model/typesystem/LazyType");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/model/typesystem/ReferenceTypeImpl");
+ }
+
+ @Test
+ public void parseCoreReflectionmodel() throws IOException, ParseException {
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/reflectionmodel/MyObjectProvider");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/reflectionmodel/ReflectionClassAdapter");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/reflectionmodel/ReflectionClassDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/reflectionmodel/ReflectionConstructorDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/reflectionmodel/ReflectionEnumDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/reflectionmodel/ReflectionFactory");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/reflectionmodel/ReflectionFieldDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/reflectionmodel/ReflectionInterfaceDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/reflectionmodel/ReflectionMethodDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/reflectionmodel/ReflectionMethodResolutionLogic");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/reflectionmodel/ReflectionParameterDeclaration");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/reflectionmodel/ReflectionTypeParameter");
+ }
+
+ @Test
+ public void parseCoreReflectionmodelComparators() throws IOException, ParseException {
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/reflectionmodel/comparators/ClassComparator");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/reflectionmodel/comparators/MethodComparator");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/reflectionmodel/comparators/ParameterComparator");
+ }
+
+ @Test
+ public void parseCoreResolution() throws IOException, ParseException {
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/resolution/ConstructorResolutionLogic");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/resolution/MethodResolutionLogic");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/resolution/SymbolDeclarator");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/resolution/SymbolSolver");
+ }
+
+ @Test
+ public void parseCoreResolutionTypesolvers() throws IOException, ParseException {
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/resolution/typesolvers/CombinedTypeSolver");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/resolution/typesolvers/JarTypeSolver");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/resolution/typesolvers/JavaParserTypeSolver");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/resolution/typesolvers/MemoryTypeSolver");
+ parse("java-symbol-solver-core", "com/github/javaparser/symbolsolver/resolution/typesolvers/ReflectionTypeSolver");
+ }
+
+ @Test
+ public void parseLogic() throws IOException, ParseException {
+ parse("java-symbol-solver-logic", "com/github/javaparser/symbolsolver/logic/AbstractClassDeclaration");
+ parse("java-symbol-solver-logic", "com/github/javaparser/symbolsolver/logic/AbstractTypeDeclaration");
+ parse("java-symbol-solver-logic", "com/github/javaparser/symbolsolver/logic/ConfilictingGenericTypesException");
+ parse("java-symbol-solver-logic", "com/github/javaparser/symbolsolver/logic/FunctionalInterfaceLogic");
+ parse("java-symbol-solver-logic", "com/github/javaparser/symbolsolver/logic/InferenceContext");
+ parse("java-symbol-solver-logic", "com/github/javaparser/symbolsolver/logic/InferenceVariableType");
+ parse("java-symbol-solver-logic", "com/github/javaparser/symbolsolver/logic/ObjectProvider");
+ }
+
+ @Test
+ public void parseModelDeclarations() throws IOException, ParseException {
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/AccessLevel");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/AnnotationDeclaration");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/ClassDeclaration");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/ConstructorDeclaration");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/Declaration");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/EnumDeclaration");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/FieldDeclaration");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/HasAccessLevel");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/InterfaceDeclaration");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/MethodAmbiguityException");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/MethodDeclaration");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/MethodLikeDeclaration");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/ParameterDeclaration");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/ReferenceTypeDeclaration");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/TypeDeclaration");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/TypeParameterDeclaration");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/TypeParametrizable");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/declarations/ValueDeclaration");
+ }
+
+ @Test
+ public void parseModelMethodsMethodUsage() throws IOException, ParseException {
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/methods/MethodUsage");
+ }
+
+ @Test
+ public void parseModelResolution() throws IOException, ParseException {
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/resolution/SymbolReference");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/resolution/TypeSolver");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/resolution/UnsolvedSymbolException");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/resolution/Value");
+ }
+
+ @Test
+ public void parseModelTypesystem() throws IOException, ParseException {
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/typesystem/ArrayType");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/typesystem/LambdaConstraintType");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/typesystem/NullType");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/typesystem/PrimitiveType");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/typesystem/ReferenceType");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/typesystem/Type");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/typesystem/TypeTransformer");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/typesystem/TypeVariable");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/typesystem/VoidType");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/typesystem/Wildcard");
+ }
+
+ @Test
+ public void parseModelTypesystemParametrization() throws IOException, ParseException {
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/typesystem/parametrization/TypeParametersMap");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/typesystem/parametrization/TypeParameterValueProvider");
+ parse("java-symbol-solver-model", "com/github/javaparser/symbolsolver/model/typesystem/parametrization/TypeParametrized");
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AnalyseNewJavaParserHelpersTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AnalyseNewJavaParserHelpersTest.java
new file mode 100644
index 000000000..254609e0c
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AnalyseNewJavaParserHelpersTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.expr.NameExpr;
+import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * We analize a more recent version of JavaParser, after the project moved to Java 8.
+ */
+public class AnalyseNewJavaParserHelpersTest extends AbstractResolutionTest {
+
+ private static final File src = adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-core"));
+
+ private static TypeSolver TYPESOLVER = typeSolver();
+
+ private static TypeSolver typeSolver() {
+ CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
+ combinedTypeSolver.add(new ReflectionTypeSolver());
+ combinedTypeSolver.add(new JavaParserTypeSolver(src));
+ combinedTypeSolver.add(new JavaParserTypeSolver(adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-generated-sources"))));
+ return combinedTypeSolver;
+ }
+
+ private CompilationUnit parse(String fileName) throws IOException {
+ File sourceFile = new File(src.getAbsolutePath() + "/" + fileName + ".java");
+ return JavaParser.parse(sourceFile);
+ }
+
+// @Test
+// public void o1TypeIsCorrect() throws IOException, ParseException {
+// CompilationUnit cu = parse("com/github/javaparser/utils/PositionUtils");
+// NameExpr o1 = Navigator.findAllNodesOfGivenClass(cu, NameExpr.class).stream().filter(it -> it.getName()!=null && it.getName().equals("o1")).findFirst().get();
+// System.out.println(JavaParserFacade.get(TYPESOLVER).solve(o1).getCorrespondingDeclaration().getType());
+// }
+//
+// @Test
+// public void o2TypeIsCorrect() throws IOException, ParseException {
+// CompilationUnit cu = parse("com/github/javaparser/utils/PositionUtils");
+// NameExpr o2 = Navigator.findAllNodesOfGivenClass(cu, NameExpr.class).stream().filter(it -> it.getName()!=null && it.getName().equals("o2")).findFirst().get();
+// System.out.println(JavaParserFacade.get(TYPESOLVER).solve(o2).getCorrespondingDeclaration().getType());
+// }
+//
+// // To calculate the type of o1 and o2 I need to first calculate the type of the lambda
+// @Test
+// public void lambdaTypeIsCorrect() throws IOException, ParseException {
+// CompilationUnit cu = parse("com/github/javaparser/utils/PositionUtils");
+// LambdaExpr lambda = Navigator.findAllNodesOfGivenClass(cu, LambdaExpr.class).stream().filter(it -> it.getRange().begin.line == 50).findFirst().get();
+// System.out.println(JavaParserFacade.get(TYPESOLVER).getType(lambda));
+// }
+
+ @Test
+ public void nodesTypeIsCorrect() throws IOException {
+ CompilationUnit cu = parse("com/github/javaparser/utils/PositionUtils");
+ NameExpr nodes = cu.findAll(NameExpr.class).stream().filter(it -> it.getName() != null && it.getName().getId().equals("nodes")).findFirst().get();
+ ResolvedType type = JavaParserFacade.get(TYPESOLVER).solve(nodes).getCorrespondingDeclaration().getType();
+ assertEquals("java.util.List<T>", type.describe());
+ assertEquals(1, type.asReferenceType().typeParametersValues().size());
+ assertEquals(true, type.asReferenceType().typeParametersValues().get(0).isTypeVariable());
+ assertEquals("T", type.asReferenceType().typeParametersValues().get(0).asTypeParameter().getName());
+ assertEquals("com.github.javaparser.utils.PositionUtils.sortByBeginPosition(java.util.List<T>).T", type.asReferenceType().typeParametersValues().get(0).asTypeParameter().getQualifiedName());
+ assertEquals(1, type.asReferenceType().typeParametersValues().get(0).asTypeParameter().getBounds().size());
+ ResolvedTypeParameterDeclaration.Bound bound = type.asReferenceType().typeParametersValues().get(0).asTypeParameter().getBounds().get(0);
+ assertEquals(true, bound.isExtends());
+ assertEquals("com.github.javaparser.ast.Node", bound.getType().describe());
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AnalyseNewJavaParserTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AnalyseNewJavaParserTest.java
new file mode 100644
index 000000000..53c0e040e
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/AnalyseNewJavaParserTest.java
@@ -0,0 +1,328 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.SlowTest;
+import com.github.javaparser.symbolsolver.SourceFileInfoExtractor;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * We analyze a more recent version of JavaParser, after the project moved to Java 8.
+ */
+@Category(SlowTest.class)
+public class AnalyseNewJavaParserTest extends AbstractResolutionTest {
+
+ private static final File src = adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-core"));
+
+ private static SourceFileInfoExtractor getSourceFileInfoExtractor() {
+ CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
+ combinedTypeSolver.add(new ReflectionTypeSolver());
+ combinedTypeSolver.add(new JavaParserTypeSolver(src));
+ combinedTypeSolver.add(new JavaParserTypeSolver(adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-generated-sources"))));
+ SourceFileInfoExtractor sourceFileInfoExtractor = new SourceFileInfoExtractor();
+ sourceFileInfoExtractor.setTypeSolver(combinedTypeSolver);
+ sourceFileInfoExtractor.setPrintFileName(false);
+ sourceFileInfoExtractor.setVerbose(true);
+ return sourceFileInfoExtractor;
+ }
+
+ private static SourceFileInfoExtractor sourceFileInfoExtractor = getSourceFileInfoExtractor();
+
+ static String readFile(File file)
+ throws IOException {
+ byte[] encoded = Files.readAllBytes(Paths.get(file.getAbsolutePath()));
+ return new String(encoded, StandardCharsets.UTF_8);
+ }
+
+ private static final boolean DEBUG = true;
+
+ private void parse(String fileName) throws IOException, ParseException {
+ File sourceFile = new File(src.getAbsolutePath() + "/" + fileName + ".java");
+ OutputStream outErrStream = new ByteArrayOutputStream();
+ PrintStream outErr = new PrintStream(outErrStream);
+
+ sourceFileInfoExtractor.setOut(outErr);
+ sourceFileInfoExtractor.setErr(outErr);
+ sourceFileInfoExtractor.solveMethodCalls(sourceFile);
+ String output = outErrStream.toString();
+
+ File expectedOutput = new File("src/test/resources/javaparser_methodcalls_expected_output");
+ String path = adaptPath(expectedOutput).getPath() + "/" + fileName.replaceAll("/", "_") + ".txt";
+ File dstFile = new File(path);
+
+ if (isJava9()) {
+ String path9 = adaptPath(expectedOutput).getPath() + "/" + fileName.replaceAll("/", "_") + "_J9.txt";
+ File dstFile9 = new File(path9);
+ if (dstFile9.exists()) {
+ path = path9;
+ dstFile = dstFile9;
+ }
+ }
+
+ if (DEBUG && (sourceFileInfoExtractor.getKo() != 0 || sourceFileInfoExtractor.getUnsupported() != 0)) {
+ System.err.println(output);
+ }
+
+ assertTrue("No failures expected when analyzing " + path, 0 == sourceFileInfoExtractor.getKo());
+ assertTrue("No UnsupportedOperationException expected when analyzing " + path, 0 == sourceFileInfoExtractor.getUnsupported());
+
+ if (!dstFile.exists()) {
+ // If we need to update the file uncomment these lines
+ PrintWriter writer = new PrintWriter(dstFile.getAbsoluteFile(), "UTF-8");
+ writer.print(output);
+ writer.close();
+ }
+
+ String expected = readFile(dstFile);
+
+ String[] outputLines = output.split("\n");
+ String[] expectedLines = expected.split("\n");
+
+ for (int i = 0; i < Math.min(outputLines.length, expectedLines.length); i++) {
+ assertEquals("Line " + (i + 1) + " of " + path + " is different from what is expected", expectedLines[i].trim(), outputLines[i].trim());
+ }
+
+ assertEquals(expectedLines.length, outputLines.length);
+
+ JavaParserFacade.clearInstances();
+ }
+
+ @Test
+ public void parseUtilsUtils() throws IOException, ParseException {
+ parse("com/github/javaparser/utils/Utils");
+ }
+
+ @Test
+ public void parseCommentsInserter() throws IOException, ParseException {
+ parse("com/github/javaparser/CommentsInserter");
+ }
+
+ @Test
+ public void parsePositionUtils() throws IOException, ParseException {
+ parse("com/github/javaparser/utils/PositionUtils");
+ }
+
+ @Test
+ public void parseModifier() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/Modifier");
+ }
+
+ @Test
+ public void parseNodeWithMembers() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithMembers");
+ }
+
+ @Test
+ public void parseAstStmts() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/stmt/AssertStmt");
+ parse("com/github/javaparser/ast/stmt/BlockStmt");
+ parse("com/github/javaparser/ast/stmt/BreakStmt");
+ parse("com/github/javaparser/ast/stmt/CatchClause");
+ parse("com/github/javaparser/ast/stmt/ContinueStmt");
+ parse("com/github/javaparser/ast/stmt/DoStmt");
+ parse("com/github/javaparser/ast/stmt/EmptyStmt");
+ parse("com/github/javaparser/ast/stmt/ExplicitConstructorInvocationStmt");
+ parse("com/github/javaparser/ast/stmt/ExpressionStmt");
+ parse("com/github/javaparser/ast/stmt/ForStmt");
+ parse("com/github/javaparser/ast/stmt/ForeachStmt");
+ parse("com/github/javaparser/ast/stmt/IfStmt");
+ parse("com/github/javaparser/ast/stmt/LabeledStmt");
+ parse("com/github/javaparser/ast/stmt/ReturnStmt");
+ parse("com/github/javaparser/ast/stmt/Statement");
+ parse("com/github/javaparser/ast/stmt/SwitchEntryStmt");
+ parse("com/github/javaparser/ast/stmt/SwitchStmt");
+ parse("com/github/javaparser/ast/stmt/SynchronizedStmt");
+ parse("com/github/javaparser/ast/stmt/ThrowStmt");
+ parse("com/github/javaparser/ast/stmt/TryStmt");
+ parse("com/github/javaparser/ast/stmt/TypeDeclarationStmt");
+ parse("com/github/javaparser/ast/stmt/WhileStmt");
+ }
+
+ @Test
+ public void parseAstExprs() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/expr/AnnotationExpr");
+ parse("com/github/javaparser/ast/expr/ArrayAccessExpr");
+ parse("com/github/javaparser/ast/expr/ArrayCreationExpr");
+ parse("com/github/javaparser/ast/expr/ArrayInitializerExpr");
+ parse("com/github/javaparser/ast/expr/AssignExpr");
+ parse("com/github/javaparser/ast/expr/BinaryExpr");
+ parse("com/github/javaparser/ast/expr/BooleanLiteralExpr");
+ parse("com/github/javaparser/ast/expr/CastExpr");
+ parse("com/github/javaparser/ast/expr/CharLiteralExpr");
+ parse("com/github/javaparser/ast/expr/ClassExpr");
+ parse("com/github/javaparser/ast/expr/ConditionalExpr");
+ parse("com/github/javaparser/ast/expr/DoubleLiteralExpr");
+ parse("com/github/javaparser/ast/expr/EnclosedExpr");
+ parse("com/github/javaparser/ast/expr/Expression");
+ parse("com/github/javaparser/ast/expr/FieldAccessExpr");
+ parse("com/github/javaparser/ast/expr/InstanceOfExpr");
+ parse("com/github/javaparser/ast/expr/IntegerLiteralExpr");
+ parse("com/github/javaparser/ast/expr/IntegerLiteralMinValueExpr");
+ parse("com/github/javaparser/ast/expr/LambdaExpr");
+ parse("com/github/javaparser/ast/expr/LiteralExpr");
+ parse("com/github/javaparser/ast/expr/LongLiteralExpr");
+ parse("com/github/javaparser/ast/expr/LongLiteralMinValueExpr");
+ parse("com/github/javaparser/ast/expr/MarkerAnnotationExpr");
+ parse("com/github/javaparser/ast/expr/MemberValuePair");
+ parse("com/github/javaparser/ast/expr/MethodCallExpr");
+ parse("com/github/javaparser/ast/expr/MethodReferenceExpr");
+ parse("com/github/javaparser/ast/expr/NameExpr");
+ parse("com/github/javaparser/ast/expr/NormalAnnotationExpr");
+ parse("com/github/javaparser/ast/expr/NullLiteralExpr");
+ parse("com/github/javaparser/ast/expr/ObjectCreationExpr");
+ parse("com/github/javaparser/ast/expr/QualifiedNameExpr");
+ parse("com/github/javaparser/ast/expr/SingleMemberAnnotationExpr");
+ parse("com/github/javaparser/ast/expr/StringLiteralExpr");
+ parse("com/github/javaparser/ast/expr/SuperExpr");
+ parse("com/github/javaparser/ast/expr/ThisExpr");
+ parse("com/github/javaparser/ast/expr/TypeExpr");
+ parse("com/github/javaparser/ast/expr/UnaryExpr");
+ }
+
+ @Test
+ public void parseVariableDeclarationExpr() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/expr/VariableDeclarationExpr");
+ }
+
+ @Test
+ public void parseAstBody() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/body/AnnotationDeclaration");
+ parse("com/github/javaparser/ast/body/AnnotationMemberDeclaration");
+ parse("com/github/javaparser/ast/body/BodyDeclaration");
+ parse("com/github/javaparser/ast/body/ClassOrInterfaceDeclaration");
+ parse("com/github/javaparser/ast/body/ConstructorDeclaration");
+ parse("com/github/javaparser/ast/body/EmptyMemberDeclaration");
+ parse("com/github/javaparser/ast/body/EmptyTypeDeclaration");
+ parse("com/github/javaparser/ast/body/EnumConstantDeclaration");
+ parse("com/github/javaparser/ast/body/EnumDeclaration");
+ parse("com/github/javaparser/ast/body/FieldDeclaration");
+ parse("com/github/javaparser/ast/body/InitializerDeclaration");
+ parse("com/github/javaparser/ast/body/MethodDeclaration");
+ parse("com/github/javaparser/ast/body/Parameter");
+ parse("com/github/javaparser/ast/body/TypeDeclaration");
+ parse("com/github/javaparser/ast/body/VariableDeclarator");
+ parse("com/github/javaparser/ast/body/VariableDeclaratorId");
+ }
+
+ @Test
+ public void parseAstComments() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/comments/BlockComment");
+ parse("com/github/javaparser/ast/comments/Comment");
+ parse("com/github/javaparser/ast/comments/CommentsCollection");
+ parse("com/github/javaparser/ast/comments/JavadocComment");
+ parse("com/github/javaparser/ast/comments/LineComment");
+ }
+
+ @Test
+ public void parseAstRest() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/AccessSpecifier");
+ parse("com/github/javaparser/ast/ArrayBracketPair");
+ parse("com/github/javaparser/ast/ArrayCreationLevel");
+ parse("com/github/javaparser/ast/CompilationUnit");
+ parse("com/github/javaparser/ast/Example");
+ parse("com/github/javaparser/ast/ImportDeclaration");
+ parse("com/github/javaparser/ast/Node");
+ parse("com/github/javaparser/ast/PackageDeclaration");
+ parse("com/github/javaparser/ast/UserDataKey");
+ }
+
+ @Test
+ public void parseAstNodeTypes() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithAnnotations");
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithBlockStmt");
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithBody");
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithDeclaration");
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithElementType");
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithExtends");
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithImplements");
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithJavaDoc");
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithModifiers");
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithName");
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithParameters");
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithStatements");
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithThrowable");
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithType");
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithTypeArguments");
+ parse("com/github/javaparser/ast/nodeTypes/NodeWithVariables");
+ }
+
+ @Test
+ public void parseAstTypes() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/type/ArrayType");
+ parse("com/github/javaparser/ast/type/ClassOrInterfaceType");
+ parse("com/github/javaparser/ast/type/IntersectionType");
+ parse("com/github/javaparser/ast/type/PrimitiveType");
+ parse("com/github/javaparser/ast/type/ReferenceType");
+ parse("com/github/javaparser/ast/type/Type");
+ parse("com/github/javaparser/ast/type/TypeParameter");
+ parse("com/github/javaparser/ast/type/UnionType");
+ parse("com/github/javaparser/ast/type/UnknownType");
+ parse("com/github/javaparser/ast/type/VoidType");
+ parse("com/github/javaparser/ast/type/WildcardType");
+ }
+
+ @Test
+ public void parseAstVisitor() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/visitor/CloneVisitor");
+ parse("com/github/javaparser/ast/visitor/EqualsVisitor");
+ parse("com/github/javaparser/ast/visitor/GenericVisitor");
+ parse("com/github/javaparser/ast/visitor/GenericVisitorAdapter");
+ parse("com/github/javaparser/ast/visitor/ModifierVisitorAdapter");
+ parse("com/github/javaparser/ast/visitor/TreeVisitor");
+ parse("com/github/javaparser/ast/visitor/VoidVisitor");
+ parse("com/github/javaparser/ast/visitor/VoidVisitorAdapter");
+ }
+
+ @Test
+ public void parseDumpVisitor() throws IOException, ParseException {
+ parse("com/github/javaparser/ast/visitor/DumpVisitor");
+ }
+
+ @Test
+ public void parseUtils() throws IOException, ParseException {
+ parse("com/github/javaparser/utils/ClassUtils");
+ parse("com/github/javaparser/utils/Pair");
+ }
+
+ @Test
+ public void parseAllOtherNodes() throws IOException, ParseException {
+ parse("com/github/javaparser/JavaParser");
+ parse("com/github/javaparser/ParseProblemException");
+ parse("com/github/javaparser/ParseResult");
+ parse("com/github/javaparser/ParseStart");
+ parse("com/github/javaparser/ParserConfiguration");
+ parse("com/github/javaparser/Position");
+ parse("com/github/javaparser/Problem");
+ parse("com/github/javaparser/Providers");
+ parse("com/github/javaparser/Range");
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/ArrayExprTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/ArrayExprTest.java
new file mode 100644
index 000000000..92b973396
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/ArrayExprTest.java
@@ -0,0 +1,26 @@
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ast.body.FieldDeclaration;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * See issue #17
+ */
+public class ArrayExprTest {
+
+ @Test
+ public void verifyAnArrayAccessExprTypeIsCalculatedProperly() {
+ String code = "class A { String[] arrSQL; String toExamine = arrSQL[1]; }";
+ FieldDeclaration field = JavaParser.parse(code).getClassByName("A").get().getFieldByName("toExamine").get();
+
+ ResolvedType type = JavaParserFacade.get(new ReflectionTypeSolver()).getType(field.getVariables().get(0).getInitializer().get());
+ assertEquals(true, type.isReferenceType());
+ assertEquals("java.lang.String", type.asReferenceType().getQualifiedName());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/ContextTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/ContextTest.java
new file mode 100644
index 000000000..45cc56ea6
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/ContextTest.java
@@ -0,0 +1,475 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.body.Parameter;
+import com.github.javaparser.ast.expr.AssignExpr;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.expr.NameExpr;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.resolution.MethodUsage;
+import com.github.javaparser.resolution.declarations.ResolvedClassDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.AbstractTest;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.*;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collections;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class ContextTest extends AbstractTest {
+
+ private TypeSolver typeSolver = new CombinedTypeSolver(new MemoryTypeSolver(), new ReflectionTypeSolver());
+
+ private CompilationUnit parseSample(String sampleName) {
+ InputStream is = ContextTest.class.getClassLoader().getResourceAsStream(sampleName + ".java.txt");
+ return JavaParser.parse(is);
+ }
+
+ @Test
+ public void resolveDeclaredFieldReference() {
+ CompilationUnit cu = parseSample("ReferencesToField");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "ReferencesToField");
+ MethodDeclaration method1 = Navigator.demandMethod(referencesToField, "method1");
+ ExpressionStmt stmt = (ExpressionStmt) method1.getBody().get().getStatements().get(0);
+ AssignExpr assignExpr = (AssignExpr) stmt.getExpression();
+
+ SymbolSolver symbolSolver = new SymbolSolver(typeSolver);
+ SymbolReference symbolReference = symbolSolver.solveSymbol("i", assignExpr.getTarget());
+
+ assertEquals(true, symbolReference.isSolved());
+ assertEquals("i", symbolReference.getCorrespondingDeclaration().getName());
+ assertEquals(true, symbolReference.getCorrespondingDeclaration().isField());
+ }
+
+ @Test
+ public void resolveInheritedFieldReference() {
+ CompilationUnit cu = parseSample("ReferencesToField");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "ReferencesToFieldExtendingClass");
+ MethodDeclaration method1 = Navigator.demandMethod(referencesToField, "method2");
+ ExpressionStmt stmt = (ExpressionStmt) method1.getBody().get().getStatements().get(0);
+ AssignExpr assignExpr = (AssignExpr) stmt.getExpression();
+
+ SymbolSolver symbolSolver = new SymbolSolver(typeSolver);
+ SymbolReference symbolReference = symbolSolver.solveSymbol("i", assignExpr.getTarget());
+
+ assertEquals(true, symbolReference.isSolved());
+ assertEquals("i", symbolReference.getCorrespondingDeclaration().getName());
+ assertEquals(true, symbolReference.getCorrespondingDeclaration().isField());
+ }
+
+ @Test
+ public void resolveParameterReference() {
+ CompilationUnit cu = parseSample("ReferencesToParameter");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "ReferenceToParameter");
+ MethodDeclaration method1 = Navigator.demandMethod(referencesToField, "aMethod");
+ NameExpr foo = Navigator.findNameExpression(method1, "foo").get();
+
+ SymbolSolver symbolSolver = new SymbolSolver(typeSolver);
+ SymbolReference symbolReference = symbolSolver.solveSymbol("foo", foo);
+
+ assertEquals(true, symbolReference.isSolved());
+ assertEquals("foo", symbolReference.getCorrespondingDeclaration().getName());
+ assertEquals(true, symbolReference.getCorrespondingDeclaration().isParameter());
+ }
+
+ @Test
+ public void resolveReferenceToImportedType() {
+ CompilationUnit cu = parseSample("Navigator");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(referencesToField, "findType");
+ Parameter param = method.getParameters().get(0);
+
+ ResolvedClassDeclaration compilationUnitDecl = mock(ResolvedClassDeclaration.class);
+ when(compilationUnitDecl.getName()).thenReturn("CompilationUnit");
+ when(compilationUnitDecl.getQualifiedName()).thenReturn("com.github.javaparser.ast.CompilationUnit");
+ TypeSolver typeSolver = mock(TypeSolver.class);
+ when(typeSolver.getRoot()).thenReturn(typeSolver);
+ when(typeSolver.solveType("java.lang.Object")).thenReturn(new ReflectionClassDeclaration(Object.class, typeSolver));
+ when(typeSolver.tryToSolveType("com.github.javaparser.ast.CompilationUnit")).thenReturn(SymbolReference.solved(compilationUnitDecl));
+ SymbolSolver symbolSolver = new SymbolSolver(typeSolver);
+
+ SymbolReference<? extends ResolvedTypeDeclaration> ref = symbolSolver.solveType("CompilationUnit", param);
+
+ assertEquals(true, ref.isSolved());
+ assertEquals("CompilationUnit", ref.getCorrespondingDeclaration().getName());
+ assertEquals("com.github.javaparser.ast.CompilationUnit", ref.getCorrespondingDeclaration().getQualifiedName());
+ }
+
+ @Test
+ public void resolveReferenceUsingQualifiedName() {
+ CompilationUnit cu = parseSample("Navigator2");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(referencesToField, "findType");
+ Parameter param = method.getParameters().get(0);
+
+ ResolvedClassDeclaration compilationUnitDecl = mock(ResolvedClassDeclaration.class);
+ when(compilationUnitDecl.getName()).thenReturn("CompilationUnit");
+ when(compilationUnitDecl.getQualifiedName()).thenReturn("com.github.javaparser.ast.CompilationUnit");
+ TypeSolver typeSolver = mock(TypeSolver.class);
+ //when(typeSolver.tryToSolveType("java.lang.com.github.javaparser.ast.CompilationUnit")).thenReturn(SymbolReference.unsolved(ClassDeclaration.class));
+ when(typeSolver.getRoot()).thenReturn(typeSolver);
+ when(typeSolver.solveType("java.lang.Object")).thenReturn(new ReflectionClassDeclaration(Object.class, typeSolver));
+ when(typeSolver.tryToSolveType("com.github.javaparser.ast.CompilationUnit")).thenReturn(SymbolReference.solved(compilationUnitDecl));
+ SymbolSolver symbolSolver = new SymbolSolver(typeSolver);
+
+ SymbolReference<? extends ResolvedTypeDeclaration> ref = symbolSolver.solveType("com.github.javaparser.ast.CompilationUnit", param);
+
+ assertEquals(true, ref.isSolved());
+ assertEquals("CompilationUnit", ref.getCorrespondingDeclaration().getName());
+ assertEquals("com.github.javaparser.ast.CompilationUnit", ref.getCorrespondingDeclaration().getQualifiedName());
+ }
+
+ @Test
+ public void resolveReferenceToClassesInTheSamePackage() {
+ CompilationUnit cu = parseSample("Navigator3");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(referencesToField, "findType");
+ Parameter param = method.getParameters().get(0);
+
+ ResolvedClassDeclaration compilationUnitDecl = mock(ResolvedClassDeclaration.class);
+ when(compilationUnitDecl.getName()).thenReturn("CompilationUnit");
+ when(compilationUnitDecl.getQualifiedName()).thenReturn("my.packagez.CompilationUnit");
+ TypeSolver typeSolver = mock(TypeSolver.class);
+ when(typeSolver.getRoot()).thenReturn(typeSolver);
+ when(typeSolver.solveType("java.lang.Object")).thenReturn(new ReflectionClassDeclaration(Object.class, typeSolver));
+ when(typeSolver.tryToSolveType("my.packagez.CompilationUnit")).thenReturn(SymbolReference.solved(compilationUnitDecl));
+ SymbolSolver symbolSolver = new SymbolSolver(typeSolver);
+
+ SymbolReference<? extends ResolvedTypeDeclaration> ref = symbolSolver.solveType("CompilationUnit", param);
+
+ assertEquals(true, ref.isSolved());
+ assertEquals("CompilationUnit", ref.getCorrespondingDeclaration().getName());
+ assertEquals("my.packagez.CompilationUnit", ref.getCorrespondingDeclaration().getQualifiedName());
+ }
+
+ @Test
+ public void resolveReferenceToClassInJavaLang() {
+ CompilationUnit cu = parseSample("Navigator");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(referencesToField, "findType");
+ Parameter param = method.getParameters().get(1);
+
+ ResolvedClassDeclaration stringDecl = mock(ResolvedClassDeclaration.class);
+ when(stringDecl.getName()).thenReturn("String");
+ when(stringDecl.getQualifiedName()).thenReturn("java.lang.String");
+ TypeSolver typeSolver = mock(TypeSolver.class);
+ when(typeSolver.tryToSolveType("me.tomassetti.symbolsolver.javaparser.String")).thenReturn(SymbolReference.unsolved(ResolvedReferenceTypeDeclaration.class));
+ when(typeSolver.getRoot()).thenReturn(typeSolver);
+ when(typeSolver.solveType("java.lang.Object")).thenReturn(new ReflectionClassDeclaration(Object.class, typeSolver));
+ when(typeSolver.tryToSolveType("java.lang.String")).thenReturn(SymbolReference.solved(stringDecl));
+ SymbolSolver symbolSolver = new SymbolSolver(typeSolver);
+
+ SymbolReference<? extends ResolvedTypeDeclaration> ref = symbolSolver.solveType("String", param);
+
+ assertEquals(true, ref.isSolved());
+ assertEquals("String", ref.getCorrespondingDeclaration().getName());
+ assertEquals("java.lang.String", ref.getCorrespondingDeclaration().getQualifiedName());
+ }
+
+ @Test
+ public void resolveReferenceToMethod() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("Navigator");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(referencesToField, "findType");
+ MethodCallExpr callToGetTypes = Navigator.findMethodCall(method, "getTypes").get();
+
+ String pathToJar = adaptPath("src/test/resources/javaparser-core-2.1.0.jar");
+ TypeSolver typeSolver = new CombinedTypeSolver(new JarTypeSolver(pathToJar), new ReflectionTypeSolver(true));
+ SymbolSolver symbolSolver = new SymbolSolver(typeSolver);
+
+ MethodUsage ref = symbolSolver.solveMethod("getTypes", Collections.emptyList(), callToGetTypes);
+
+ assertEquals("getTypes", ref.getName());
+ assertEquals("com.github.javaparser.ast.CompilationUnit", ref.declaringType().getQualifiedName());
+
+ //verify(typeSolver);
+ }
+
+ @Test
+ public void resolveCascadeOfReferencesToMethod() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("Navigator");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(referencesToField, "findType");
+ MethodCallExpr callToStream = Navigator.findMethodCall(method, "stream").get();
+
+ String pathToJar = adaptPath("src/test/resources/javaparser-core-2.1.0.jar");
+ TypeSolver typeSolver = new CombinedTypeSolver(new JarTypeSolver(pathToJar), new ReflectionTypeSolver(true));
+ SymbolSolver symbolSolver = new SymbolSolver(typeSolver);
+ MethodUsage ref = symbolSolver.solveMethod("stream", Collections.emptyList(), callToStream);
+
+ assertEquals("stream", ref.getName());
+ assertEquals("java.util.Collection", ref.declaringType().getQualifiedName());
+ }
+
+ @Test
+ public void resolveReferenceToMethodCalledOnArrayAccess() {
+ CompilationUnit cu = parseSample("ArrayAccess");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "ArrayAccess");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "access");
+ MethodCallExpr callToTrim = Navigator.findMethodCall(method, "trim").get();
+
+ File src = adaptPath(new File("src/test/resources"));
+ TypeSolver typeSolver = new CombinedTypeSolver(new ReflectionTypeSolver(), new JavaParserTypeSolver(src));
+ SymbolSolver symbolSolver = new SymbolSolver(typeSolver);
+ MethodUsage ref = symbolSolver.solveMethod("trim", Collections.emptyList(), callToTrim);
+
+ assertEquals("trim", ref.getName());
+ assertEquals("java.lang.String", ref.declaringType().getQualifiedName());
+ }
+
+ @Test
+ public void resolveReferenceToJreType() {
+ CompilationUnit cu = parseSample("NavigatorSimplified");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "foo");
+ com.github.javaparser.ast.type.Type streamJavaParserType = method.getParameters().get(0).getType();
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ ResolvedType streamType = JavaParserFacade.get(typeSolver).convert(streamJavaParserType, method);
+
+ assertEquals("java.util.stream.Stream<java.lang.String>", streamType.describe());
+ }
+
+ @Test
+ public void resolveReferenceToMethodWithLambda() {
+ CompilationUnit cu = parseSample("NavigatorSimplified");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "findType");
+ MethodCallExpr methodCallExpr = Navigator.findMethodCall(method, "filter").get();
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ ResolvedType ref = JavaParserFacade.get(typeSolver).getType(methodCallExpr);
+
+ assertEquals("java.util.stream.Stream<java.lang.String>", ref.describe());
+ assertEquals(1, ref.asReferenceType().typeParametersValues().size());
+ assertEquals("java.lang.String", ref.asReferenceType().typeParametersValues().get(0).describe());
+ }
+
+ @Test
+ public void resolveReferenceToLambdaParamBase() {
+ CompilationUnit cu = parseSample("NavigatorSimplified");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "findType");
+ NameExpr refToT = Navigator.findNameExpression(method, "t").get();
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ ResolvedType ref = javaParserFacade.getType(refToT);
+
+ assertEquals("? super java.lang.String", ref.describe());
+ }
+
+ @Test
+ public void resolveReferenceToLambdaParamSimplified() {
+ CompilationUnit cu = parseSample("NavigatorSimplified");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "findType");
+ MethodCallExpr call = Navigator.findMethodCall(method, "isEmpty").get();
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ SymbolSolver symbolSolver = new SymbolSolver(typeSolver);
+ MethodUsage ref = symbolSolver.solveMethod("isEmpty", Collections.emptyList(), call);
+
+ assertEquals("isEmpty", ref.getName());
+ assertEquals("java.lang.String", ref.declaringType().getQualifiedName());
+ }
+
+ @Test
+ public void resolveGenericReturnTypeOfMethodInJar() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("Navigator");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "findType");
+ MethodCallExpr call = Navigator.findMethodCall(method, "getTypes").get();
+
+ String pathToJar = adaptPath("src/test/resources/javaparser-core-2.1.0.jar");
+ TypeSolver typeSolver = new CombinedTypeSolver(new ReflectionTypeSolver(), new JarTypeSolver(pathToJar));
+ MethodUsage methodUsage = JavaParserFacade.get(typeSolver).solveMethodAsUsage(call);
+
+ assertEquals("getTypes", methodUsage.getName());
+ assertEquals("java.util.List<com.github.javaparser.ast.body.TypeDeclaration>", methodUsage.returnType().describe());
+ assertEquals(1, methodUsage.returnType().asReferenceType().typeParametersValues().size());
+ assertEquals("com.github.javaparser.ast.body.TypeDeclaration", methodUsage.returnType().asReferenceType().typeParametersValues().get(0).describe());
+ }
+
+ @Test
+ public void resolveTypeUsageOfFirstMethodInGenericClass() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("Navigator");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "findType");
+ MethodCallExpr callToGetTypes = Navigator.findMethodCall(method, "getTypes").get();
+
+ String pathToJar = adaptPath("src/test/resources/javaparser-core-2.1.0.jar");
+ TypeSolver typeSolver = new CombinedTypeSolver(new ReflectionTypeSolver(), new JarTypeSolver(pathToJar));
+ MethodUsage filterUsage = JavaParserFacade.get(typeSolver).solveMethodAsUsage(callToGetTypes);
+
+ assertEquals("java.util.List<com.github.javaparser.ast.body.TypeDeclaration>", filterUsage.returnType().describe());
+ assertEquals(1, filterUsage.returnType().asReferenceType().typeParametersValues().size());
+ assertEquals("com.github.javaparser.ast.body.TypeDeclaration", filterUsage.returnType().asReferenceType().typeParametersValues().get(0).describe());
+ }
+
+ @Test
+ public void resolveTypeUsageOfMethodInGenericClass() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("Navigator");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "findType");
+ MethodCallExpr callToStream = Navigator.findMethodCall(method, "stream").get();
+
+ String pathToJar = adaptPath("src/test/resources/javaparser-core-2.1.0.jar");
+ TypeSolver typeSolver = new CombinedTypeSolver(new ReflectionTypeSolver(), new JarTypeSolver(pathToJar));
+ MethodUsage filterUsage = JavaParserFacade.get(typeSolver).solveMethodAsUsage(callToStream);
+
+ assertEquals("java.util.stream.Stream<com.github.javaparser.ast.body.TypeDeclaration>", filterUsage.returnType().describe());
+ }
+
+ @Test
+ public void resolveTypeUsageOfCascadeMethodInGenericClass() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("Navigator");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "findType");
+ MethodCallExpr callToFilter = Navigator.findMethodCall(method, "filter").get();
+
+ String pathToJar = adaptPath("src/test/resources/javaparser-core-2.1.0.jar");
+ TypeSolver typeSolver = new CombinedTypeSolver(new ReflectionTypeSolver(), new JarTypeSolver(pathToJar));
+ MethodUsage filterUsage = JavaParserFacade.get(typeSolver).solveMethodAsUsage(callToFilter);
+
+ assertEquals("java.util.stream.Stream<com.github.javaparser.ast.body.TypeDeclaration>", filterUsage.returnType().describe());
+ }
+
+ @Test
+ public void resolveLambdaType() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("Navigator");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "findType");
+ MethodCallExpr callToFilter = Navigator.findMethodCall(method, "filter").get();
+ Expression lambdaExpr = callToFilter.getArguments().get(0);
+
+ String pathToJar = adaptPath("src/test/resources/javaparser-core-2.1.0.jar");
+ TypeSolver typeSolver = new CombinedTypeSolver(new ReflectionTypeSolver(), new JarTypeSolver(pathToJar));
+ ResolvedType typeOfLambdaExpr = JavaParserFacade.get(typeSolver).getType(lambdaExpr);
+
+ assertEquals("java.util.function.Predicate<? super com.github.javaparser.ast.body.TypeDeclaration>", typeOfLambdaExpr.describe());
+ }
+
+ @Test
+ public void resolveReferenceToLambdaParam() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("Navigator");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "findType");
+ MethodCallExpr callToGetName = Navigator.findMethodCall(method, "getName").get();
+ Expression referenceToT = callToGetName.getScope().get();
+
+ String pathToJar = adaptPath("src/test/resources/javaparser-core-2.1.0.jar");
+ TypeSolver typeSolver = new CombinedTypeSolver(new ReflectionTypeSolver(), new JarTypeSolver(pathToJar));
+ ResolvedType typeOfT = JavaParserFacade.get(typeSolver).getType(referenceToT);
+
+ assertEquals("? super com.github.javaparser.ast.body.TypeDeclaration", typeOfT.describe());
+ }
+
+ @Test
+ public void resolveReferenceToCallOnLambdaParam() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("Navigator");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Navigator");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "findType");
+ MethodCallExpr callToGetName = Navigator.findMethodCall(method, "getName").get();
+
+ String pathToJar = adaptPath("src/test/resources/javaparser-core-2.1.0.jar");
+ TypeSolver typeSolver = new CombinedTypeSolver(new ReflectionTypeSolver(), new JarTypeSolver(pathToJar));
+ MethodUsage methodUsage = JavaParserFacade.get(typeSolver).solveMethodAsUsage(callToGetName);
+
+ assertEquals("getName", methodUsage.getName());
+ assertEquals("com.github.javaparser.ast.body.TypeDeclaration", methodUsage.declaringType().getQualifiedName());
+ }
+
+ @Test
+ public void resolveReferenceToOverloadMethodWithNullParam() {
+ CompilationUnit cu = parseSample("OverloadedMethods");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "OverloadedMethods");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "m1");
+ MethodCallExpr call = Navigator.findMethodCall(method, "overloaded").get();
+
+ ReflectionTypeSolver typeSolver = new ReflectionTypeSolver();
+ MethodUsage ref = JavaParserFacade.get(typeSolver).solveMethodAsUsage(call);
+
+ assertEquals("overloaded", ref.getName());
+ assertEquals(1, ref.getNoParams());
+ assertEquals("java.lang.String", ref.getParamTypes().get(0).describe());
+ }
+
+ @Test
+ public void resolveReferenceToOverloadMethodFindStricter() {
+ CompilationUnit cu = parseSample("OverloadedMethods");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "OverloadedMethods");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "m2");
+ MethodCallExpr call = Navigator.findMethodCall(method, "overloaded").get();
+
+ ReflectionTypeSolver typeSolver = new ReflectionTypeSolver();
+ MethodUsage ref = JavaParserFacade.get(typeSolver).solveMethodAsUsage(call);
+
+ assertEquals("overloaded", ref.getName());
+ assertEquals(1, ref.getNoParams());
+ assertEquals("java.lang.String", ref.getParamTypes().get(0).describe());
+ }
+
+ @Test
+ public void resolveInheritedMethodFromInterface() {
+ CompilationUnit cu = parseSample("InterfaceInheritance");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Test");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "test");
+ MethodCallExpr call = Navigator.findMethodCall(method, "foobar").get();
+
+ File src = adaptPath(new File("src/test/resources"));
+ TypeSolver typeSolver = new CombinedTypeSolver(new ReflectionTypeSolver(), new JavaParserTypeSolver(src));
+ ResolvedType type = JavaParserFacade.get(typeSolver).getType(call);
+
+ assertEquals("double", type.describe());
+ }
+
+ @Test
+ public void resolveReferenceToOverloadMethodFindOnlyCompatible() {
+ CompilationUnit cu = parseSample("OverloadedMethods");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "OverloadedMethods");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "m3");
+ MethodCallExpr call = Navigator.findMethodCall(method, "overloaded").get();
+
+ ReflectionTypeSolver typeSolver = new ReflectionTypeSolver();
+ MethodUsage ref = JavaParserFacade.get(typeSolver).solveMethodAsUsage(call);
+
+ assertEquals("overloaded", ref.getName());
+ assertEquals(1, ref.getNoParams());
+ assertEquals("java.lang.Object", ref.getParamTypes().get(0).describe());
+ }
+
+}
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
new file mode 100644
index 000000000..5fcead08f
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/DefaultPackageTest.java
@@ -0,0 +1,158 @@
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ast.AccessSpecifier;
+import com.github.javaparser.ast.type.ClassOrInterfaceType;
+import com.github.javaparser.resolution.UnsolvedSymbolException;
+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.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.logic.AbstractClassDeclaration;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.MemoryTypeSolver;
+import org.junit.Test;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * See issue #16
+ */
+public class DefaultPackageTest {
+
+ private class MyClassDeclaration extends AbstractClassDeclaration {
+
+ private String qualifiedName;
+
+ private MyClassDeclaration(String qualifiedName) {
+ this.qualifiedName = qualifiedName;
+ }
+
+ @Override
+ public AccessSpecifier accessSpecifier() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<ResolvedTypeParameterDeclaration> getTypeParameters() {
+ return new LinkedList<>();
+ }
+
+ @Override
+ public Set<ResolvedReferenceTypeDeclaration> internalTypes() {
+ return new HashSet<>();
+ }
+
+ @Override
+ public String getName() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<ResolvedReferenceType> getAncestors() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<ResolvedFieldDeclaration> getAllFields() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Set<ResolvedMethodDeclaration> getDeclaredMethods() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean isAssignableBy(ResolvedType type) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean isAssignableBy(ResolvedReferenceTypeDeclaration other) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean hasDirectlyAnnotation(String qualifiedName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public ResolvedReferenceType getSuperClass() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<ResolvedReferenceType> getInterfaces() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<ResolvedConstructorDeclaration> getConstructors() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ protected ResolvedReferenceType object() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public String getPackageName() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public String getClassName() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public String getQualifiedName() {
+ return qualifiedName;
+ }
+
+ @Override
+ public Optional<ResolvedReferenceTypeDeclaration> containerType() {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ @Test
+ public void aClassInDefaultPackageCanBeAccessedFromTheDefaultPackage() {
+ String code = "class A extends B {}";
+ MemoryTypeSolver memoryTypeSolver = new MemoryTypeSolver();
+ memoryTypeSolver.addDeclaration("B", new MyClassDeclaration("B"));
+
+ ClassOrInterfaceType jpType = JavaParser.parse(code).getClassByName("A").get().getExtendedTypes(0);
+ ResolvedType resolvedType = JavaParserFacade.get(memoryTypeSolver).convertToUsage(jpType);
+ assertEquals("B", resolvedType.asReferenceType().getQualifiedName());
+ }
+
+ @Test(expected = UnsolvedSymbolException.class)
+ public void aClassInDefaultPackageCanBeAccessedFromOutsideTheDefaultPackageImportingIt() {
+ String code = "package myPackage; import B; class A extends B {}";
+ MemoryTypeSolver memoryTypeSolver = new MemoryTypeSolver();
+ memoryTypeSolver.addDeclaration("B", new MyClassDeclaration("B"));
+
+ ClassOrInterfaceType jpType = JavaParser.parse(code).getClassByName("A").get().getExtendedTypes(0);
+ ResolvedType resolvedType = JavaParserFacade.get(memoryTypeSolver).convertToUsage(jpType);
+ assertEquals("B", resolvedType.asReferenceType().getQualifiedName());
+ }
+
+ @Test(expected = UnsolvedSymbolException.class)
+ public void aClassInDefaultPackageCanBeAccessedFromOutsideTheDefaultPackageWithoutImportingIt() {
+ String code = "package myPackage; class A extends B {}";
+ MemoryTypeSolver memoryTypeSolver = new MemoryTypeSolver();
+ memoryTypeSolver.addDeclaration("B", new MyClassDeclaration("B"));
+
+ ResolvedType resolvedType = JavaParserFacade.get(memoryTypeSolver).convertToUsage(JavaParser.parse(code).getClassByName("A").get().getExtendedTypes(0));
+ assertEquals("B", resolvedType.asReferenceType().getQualifiedName());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/EnumResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/EnumResolutionTest.java
new file mode 100644
index 000000000..edeaf8043
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/EnumResolutionTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.stmt.SwitchStmt;
+import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class EnumResolutionTest extends AbstractResolutionTest {
+
+ @Test
+ public void switchOnEnum() {
+ CompilationUnit cu = parseSample("SwitchOnEnum");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "SwitchOnEnum");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "foo");
+ SwitchStmt switchStmt = Navigator.findSwitch(method);
+ Expression expression = switchStmt.getEntries().get(0).getLabel().get();
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertTrue(ref.isSolved());
+ assertEquals("SwitchOnEnum.MyEnum", ref.getCorrespondingDeclaration().getType().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void enumAndStaticInitializer() {
+ CompilationUnit cu = parseSample("EnumAndStaticInitializer");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "MyClass");
+ MethodCallExpr call = Navigator.findMethodCall(clazz, "put").get();
+
+ ResolvedType ref = JavaParserFacade.get(new ReflectionTypeSolver()).getType(call);
+ assertEquals("MyClass.Primitive", ref.describe());
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/FieldsResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/FieldsResolutionTest.java
new file mode 100644
index 000000000..fd95e7314
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/FieldsResolutionTest.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.*;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.ast.stmt.ReturnStmt;
+import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class FieldsResolutionTest extends AbstractResolutionTest {
+
+ @Test
+ public void accessClassFieldThroughThis() {
+ CompilationUnit cu = parseSample("AccessClassMemberThroughThis");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "AccessClassMemberThroughThis");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "getLabel2");
+ ReturnStmt returnStmt = (ReturnStmt) method.getBody().get().getStatements().get(0);
+ Expression expression = returnStmt.getExpression().get();
+
+ ResolvedType ref = JavaParserFacade.get(new ReflectionTypeSolver()).getType(expression);
+ assertEquals("java.lang.String", ref.describe());
+ }
+
+ @Test
+ public void accessClassFieldThroughThisWithCompetingSymbolInParentContext() {
+ CompilationUnit cu = parseSample("AccessClassMemberThroughThis");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "AccessClassMemberThroughThis");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "setLabel");
+ ExpressionStmt expressionStmt = (ExpressionStmt) method.getBody().get().getStatements().get(0);
+ AssignExpr assignExpr = (AssignExpr) expressionStmt.getExpression();
+ FieldAccessExpr fieldAccessExpr = (FieldAccessExpr) assignExpr.getTarget();
+
+ File src = adaptPath(new File("src/test/resources"));
+ CombinedTypeSolver typeSolver = new CombinedTypeSolver(new JavaParserTypeSolver(src), new ReflectionTypeSolver());
+ SymbolSolver symbolSolver = new SymbolSolver(typeSolver);
+ SymbolReference<? extends ResolvedValueDeclaration> ref = symbolSolver.solveSymbol(fieldAccessExpr.getName().getId(), fieldAccessExpr);
+
+ assertTrue(ref.isSolved());
+ assertTrue(ref.getCorrespondingDeclaration().isField());
+ }
+
+ @Test
+ public void accessEnumFieldThroughThis() {
+ CompilationUnit cu = parseSample("AccessEnumMemberThroughThis");
+ com.github.javaparser.ast.body.EnumDeclaration enumDecl = Navigator.demandEnum(cu, "AccessEnumMemberThroughThis");
+ MethodDeclaration method = Navigator.demandMethod(enumDecl, "getLabel");
+ SimpleName expression = Navigator.findSimpleName(method, "label").get();
+
+ SymbolReference ref = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertTrue(ref.isSolved());
+ assertEquals("label", ref.getCorrespondingDeclaration().getName());
+ }
+
+ @Test
+ public void accessEnumMethodThroughThis() {
+ CompilationUnit cu = parseSample("AccessEnumMemberThroughThis");
+ com.github.javaparser.ast.body.EnumDeclaration enumDecl = Navigator.demandEnum(cu, "AccessEnumMemberThroughThis");
+ MethodDeclaration method = Navigator.demandMethod(enumDecl, "getLabel2");
+ ReturnStmt returnStmt = (ReturnStmt) method.getBody().get().getStatements().get(0);
+ Expression expression = returnStmt.getExpression().get();
+
+ ResolvedType ref = JavaParserFacade.get(new ReflectionTypeSolver()).getType(expression);
+ assertEquals("java.lang.String", ref.describe());
+ }
+
+ @Test
+ public void accessFieldThroughSuper() {
+ CompilationUnit cu = parseSample("AccessThroughSuper");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "AccessThroughSuper.SubClass");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "fieldTest");
+ ReturnStmt returnStmt = (ReturnStmt) method.getBody().get().getStatements().get(0);
+ Expression expression = returnStmt.getExpression().get();
+
+ ResolvedType ref = JavaParserFacade.get(new ReflectionTypeSolver()).getType(expression);
+ assertEquals("java.lang.String", ref.describe());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/GenericsResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/GenericsResolutionTest.java
new file mode 100644
index 000000000..bfc4bfd58
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/GenericsResolutionTest.java
@@ -0,0 +1,440 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.body.VariableDeclarator;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.expr.NameExpr;
+import com.github.javaparser.ast.expr.ThisExpr;
+import com.github.javaparser.ast.stmt.ExpressionStmt;
+import com.github.javaparser.ast.stmt.ReturnStmt;
+import com.github.javaparser.resolution.MethodUsage;
+import com.github.javaparser.resolution.types.ResolvedReferenceType;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.model.resolution.Value;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import java.util.List;
+import java.util.Optional;
+
+import static org.junit.Assert.assertEquals;
+
+public class GenericsResolutionTest extends AbstractResolutionTest {
+
+ @Test
+ public void resolveFieldWithGenericTypeToString() {
+ CompilationUnit cu = parseSample("Generics");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Generics");
+ VariableDeclarator fieldS = Navigator.demandField(clazz, "s");
+
+ SymbolSolver symbolSolver = new SymbolSolver(new ReflectionTypeSolver());
+ Optional<Value> symbolReference = symbolSolver.solveSymbolAsValue("s", fieldS);
+
+ assertEquals(true, symbolReference.isPresent());
+ assertEquals("s", symbolReference.get().getName());
+
+ ResolvedType type = symbolReference.get().getType();
+ assertEquals(1, type.asReferenceType().typeParametersValues().size());
+ assertEquals("java.lang.String", type.asReferenceType().typeParametersValues().get(0).describe());
+ }
+
+ @Test
+ public void resolveFieldWithGenericTypeToDeclaredClass() {
+ CompilationUnit cu = parseSample("Generics");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Generics");
+ VariableDeclarator fieldS = Navigator.demandField(clazz, "g");
+
+ SymbolSolver symbolSolver = new SymbolSolver(new ReflectionTypeSolver());
+ Optional<Value> symbolReference = symbolSolver.solveSymbolAsValue("g", fieldS);
+
+ assertEquals(true, symbolReference.isPresent());
+ assertEquals("g", symbolReference.get().getName());
+
+ ResolvedType type = symbolReference.get().getType();
+ assertEquals(1, type.asReferenceType().typeParametersValues().size());
+ assertEquals("me.tomassetti.symbolsolver.javaparser.Generics", type.asReferenceType().typeParametersValues().get(0).describe());
+ }
+
+ @Test
+ public void resolveFieldWithGenericTypeToInteger() {
+ CompilationUnit cu = parseSample("Generics");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Generics");
+ VariableDeclarator fieldS = Navigator.demandField(clazz, "i");
+
+ SymbolSolver symbolSolver = new SymbolSolver(new ReflectionTypeSolver());
+ Optional<Value> symbolReference = symbolSolver.solveSymbolAsValue("i", fieldS);
+
+ assertEquals(true, symbolReference.isPresent());
+ assertEquals("i", symbolReference.get().getName());
+
+ ResolvedType type = symbolReference.get().getType();
+ assertEquals(1, type.asReferenceType().typeParametersValues().size());
+ assertEquals("java.lang.Integer", type.asReferenceType().typeParametersValues().get(0).describe());
+ }
+
+ @Test
+ public void resolveFieldOfVariableType() {
+ CompilationUnit cu = parseSample("Generics");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "SomeCollection");
+ VariableDeclarator field = Navigator.demandField(clazz, "a");
+
+ SymbolSolver symbolSolver = new SymbolSolver(new ReflectionTypeSolver());
+ Optional<Value> symbolReference = symbolSolver.solveSymbolAsValue("a", field);
+
+ assertEquals(true, symbolReference.isPresent());
+ assertEquals("a", symbolReference.get().getName());
+
+ ResolvedType type = symbolReference.get().getType();
+ assertEquals(true, type.isTypeVariable());
+ assertEquals("A", type.describe());
+ }
+
+ @Test
+ public void resolveFieldOfGenericReferringToVariableType() {
+ CompilationUnit cu = parseSample("Generics");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "SomeCollection");
+ VariableDeclarator field = Navigator.demandField(clazz, "as");
+
+ SymbolSolver symbolSolver = new SymbolSolver(new ReflectionTypeSolver());
+ Optional<Value> symbolReference = symbolSolver.solveSymbolAsValue("as", field);
+
+ assertEquals(true, symbolReference.isPresent());
+ assertEquals("as", symbolReference.get().getName());
+
+ ResolvedType type = symbolReference.get().getType();
+ assertEquals(false, type.isTypeVariable());
+ assertEquals("java.util.List<A>", type.describe());
+ assertEquals(1, type.asReferenceType().typeParametersValues().size());
+ ResolvedType typeParam = type.asReferenceType().typeParametersValues().get(0);
+ assertEquals(true, typeParam.isTypeVariable());
+ assertEquals("A", typeParam.describe());
+ }
+
+ @Test
+ public void resolveUsageOfGenericFieldSimpleCase() {
+ CompilationUnit cu = parseSample("Generics");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "SomeCollection");
+
+ MethodDeclaration method = Navigator.demandMethod(clazz, "foo1");
+
+ ExpressionStmt stmt = (ExpressionStmt) method.getBody().get().getStatements().get(0);
+ Expression expression = stmt.getExpression();
+ ResolvedType type = JavaParserFacade.get(new ReflectionTypeSolver()).getType(expression);
+
+ assertEquals(false, type.isTypeVariable());
+ assertEquals("java.lang.String", type.describe());
+ }
+
+ //PRIMA UN TEST CHE DICA CHE IL TIPO DEL CAMPO AS e' LIST<A> NON LIST<E>
+ @Test
+ public void resolveUsageOfGenericFieldIntermediateCase() {
+ CompilationUnit cu = parseSample("Generics");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "SomeCollection");
+
+ VariableDeclarator field = Navigator.demandField(clazz, "as");
+
+ ResolvedType type = JavaParserFacade.get(new ReflectionTypeSolver()).getType(field);
+
+ assertEquals(false, type.isTypeVariable());
+ assertEquals("java.util.List<A>", type.describe());
+ assertEquals(1, type.asReferenceType().typeParametersValues().size());
+ assertEquals(true, type.asReferenceType().typeParametersValues().get(0).isTypeVariable());
+ assertEquals("A", type.asReferenceType().typeParametersValues().get(0).describe());
+ }
+
+ @Test
+ public void resolveUsageOfGenericFieldAdvancedCase() {
+ CompilationUnit cu = parseSample("Generics");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "SomeCollection");
+
+ MethodDeclaration method = Navigator.demandMethod(clazz, "foo2");
+
+ ExpressionStmt stmt = (ExpressionStmt) method.getBody().get().getStatements().get(0);
+ Expression expression = stmt.getExpression();
+ ResolvedType type = JavaParserFacade.get(new ReflectionTypeSolver()).getType(expression);
+
+ assertEquals(false, type.isTypeVariable());
+ assertEquals("java.util.List<java.lang.String>", type.describe());
+ assertEquals(1, type.asReferenceType().typeParametersValues().size());
+ assertEquals(false, type.asReferenceType().typeParametersValues().get(0).isTypeVariable());
+ assertEquals("java.lang.String", type.asReferenceType().typeParametersValues().get(0).describe());
+ }
+
+ @Test
+ public void resolveUsageOfMethodOfGenericClass() {
+ CompilationUnit cu = parseSample("Generics");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "GenericMethodCalls.Derived");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "caller");
+ MethodCallExpr expression = Navigator.findMethodCall(method, "callee").get();
+
+ MethodUsage methodUsage = JavaParserFacade.get(new ReflectionTypeSolver()).solveMethodAsUsage(expression);
+
+ assertEquals("callee", methodUsage.getName());
+ }
+
+ @Test
+ public void resolveElementOfList() {
+ CompilationUnit cu = parseSample("ElementOfList");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "ElementOfList");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "foo");
+ VariableDeclarator variableDeclarator = Navigator.demandVariableDeclaration(method, "a").get();
+ Expression expression = variableDeclarator.getInitializer().get();
+
+ ResolvedType type = JavaParserFacade.get(new ReflectionTypeSolver()).getType(expression);
+
+ assertEquals(false, type.isTypeVariable());
+ assertEquals("Comment", type.describe());
+ }
+
+ @Test
+ public void resolveElementOfListAdvancedExample() {
+ CompilationUnit cu = parseSample("ElementOfList");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "ElementOfList");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "annotations");
+ VariableDeclarator variableDeclarator = Navigator.demandVariableDeclaration(method, "a").get();
+ Expression expression = variableDeclarator.getInitializer().get();
+
+ ResolvedType type = JavaParserFacade.get(new ReflectionTypeSolver()).getType(expression);
+
+ assertEquals(false, type.isTypeVariable());
+ assertEquals("AnnotationExpr", type.describe());
+ }
+
+ @Test
+ public void genericsInheritance() {
+ CompilationUnit cu = parseSample("MethodTypeParams");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "VoidVisitorAdapter");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "visit");
+ MethodCallExpr call = Navigator.findMethodCall(method, "accept").get();
+ Expression thisRef = call.getArguments().get(0);
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+
+ ResolvedType voidVisitorAdapterOfA = javaParserFacade.getType(thisRef);
+ List<ResolvedReferenceType> allAncestors = voidVisitorAdapterOfA.asReferenceType().getAllAncestors();
+ assertEquals(2, allAncestors.size());
+ }
+
+ @Test
+ public void methodTypeParams() {
+ CompilationUnit cu = parseSample("MethodTypeParams");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "VoidVisitorAdapter");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "visit");
+ MethodCallExpr call = Navigator.findMethodCall(method, "accept").get();
+
+ ResolvedType type = JavaParserFacade.get(new ReflectionTypeSolver()).getType(call);
+
+ assertEquals(false, type.isTypeVariable());
+ assertEquals("void", type.describe());
+ }
+
+ @Test
+ public void classCastScope() {
+ CompilationUnit cu = parseSample("ClassCast");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "ClassCast");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "getNodesByType");
+ MethodCallExpr call = Navigator.findMethodCall(method, "cast").get();
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ Expression scope = call.getScope().get();
+ ResolvedType type = JavaParserFacade.get(typeSolver).getType(scope);
+
+ //System.out.println(typeUsage);
+
+ assertEquals(false, type.isTypeVariable());
+ assertEquals("java.lang.Class<N>", type.describe());
+ }
+
+ @Test
+ public void classCast() {
+ CompilationUnit cu = parseSample("ClassCast");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "ClassCast");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "getNodesByType");
+ ReturnStmt returnStmt = Navigator.findReturnStmt(method);
+
+ ResolvedType type = JavaParserFacade.get(new ReflectionTypeSolver()).getType(returnStmt.getExpression().get());
+
+ assertEquals(true, type.isTypeVariable());
+ assertEquals("N", type.describe());
+ }
+
+ @Test
+ public void typeParamOnReturnTypeStep1() {
+ CompilationUnit cu = parseSample("TypeParamOnReturnType");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypeParamOnReturnType");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "nodeEquals");
+ ThisExpr thisExpr = Navigator.findNodeOfGivenClass(method, ThisExpr.class);
+
+ ResolvedType type = JavaParserFacade.get(new ReflectionTypeSolver()).getType(thisExpr);
+
+ assertEquals(false, type.isTypeVariable());
+ assertEquals("TypeParamOnReturnType", type.describe());
+ }
+
+ @Test
+ public void typeParamOnReturnTypeStep2() {
+ CompilationUnit cu = parseSample("TypeParamOnReturnType");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypeParamOnReturnType");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "nodeEquals");
+ NameExpr n1 = Navigator.findNameExpression(method, "n1").get();
+
+ ResolvedType type = JavaParserFacade.get(new ReflectionTypeSolver()).getType(n1);
+
+ assertEquals(true, type.isTypeVariable());
+ assertEquals("T", type.describe());
+ }
+
+ @Test
+ public void typeParamOnReturnTypeStep3() {
+ CompilationUnit cu = parseSample("TypeParamOnReturnType");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypeParamOnReturnType");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "nodeEquals");
+ MethodCallExpr call = Navigator.findMethodCall(method, "accept").get();
+
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(new ReflectionTypeSolver());
+ ResolvedType type = javaParserFacade.getType(call);
+
+ assertEquals(false, type.isTypeVariable());
+ assertEquals("java.lang.Boolean", type.describe());
+ }
+
+ @Test
+ public void typeParamOnReturnType() {
+ CompilationUnit cu = parseSample("TypeParamOnReturnType");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypeParamOnReturnType");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "nodeEquals");
+ ReturnStmt returnStmt = Navigator.findReturnStmt(method);
+
+ ResolvedType type = JavaParserFacade.get(new ReflectionTypeSolver()).getType(returnStmt.getExpression().get());
+
+ assertEquals(false, type.isTypeVariable());
+ assertEquals("boolean", type.describe());
+ }
+
+ /*@Test
+ public void genericCollectionWithWildcardsAndExtensionsPrep() {
+ CompilationUnit cu = parseSample("GenericCollectionWithExtension");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Foo");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "bar");
+ ReturnStmt returnStmt = Navigator.findReturnStmt(method);
+
+ TypeSolver typeSolver = new JreTypeSolver();
+ MethodCallExpr call = (MethodCallExpr) returnStmt.getExpr();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+
+ List<TypeUsage> params = new ArrayList<>();
+ if (call.getArgs() != null) {
+ for (Expression param : call.getArgs()) {
+ params.add(javaParserFacade.getType(param, false));
+ }
+ }
+ Context context = JavaParserFactory.getContext(call, typeSolver);
+
+ ReferenceTypeUsage typeOfScope = javaParserFacade.getType(call.getScope()).asReferenceType();
+ me.tomassetti.symbolsolver.model.declarations.TypeDeclaration typeDeclaration = typeOfScope.getTypeDeclaration();
+ List<TypeUsage> typeParametersValues = typeOfScope.typeParametersValues();
+
+ List<MethodUsage> methods = new ArrayList<>();
+ for (Method m : List.class.getMethods()) {
+ if (m.getName().equals("addAll") && !m.isBridge() && !m.isSynthetic()) {
+ me.tomassetti.symbolsolver.model.declarations.MethodDeclaration methodDeclaration = new ReflectionMethodDeclaration(m, typeSolver);
+ if (methods.size() == 0) {
+ // ok, e' il primo
+ ReferenceTypeUsage paramType = methodDeclaration.getParam(0).getType(typeSolver).asReferenceType();
+ assertTrue(paramType.asReferenceType().typeParametersValues().get(0).isWildcard());
+ }
+ MethodUsage mu = new MethodUsage(methodDeclaration, typeSolver);
+ int i = 0;
+ for (TypeParameter tp : typeDeclaration.getTypeParameters()) {
+ mu = mu.replaceTypeParameter(tp.getName(), typeParametersValues.get(i));
+ i++;
+ }
+ methods.add(mu);
+ }
+
+ }
+
+ assertTrue(MethodResolutionLogic.isApplicable(methods.get(0), "addAll", params, typeSolver));
+ //Optional<MethodUsage> methodUsage = MethodResolutionLogic.findMostApplicableUsage(methods, "addAll", params, typeSolver);
+
+ //Optional<MethodUsage> methodUsage = typeDeclaration.solveMethodAsUsage("addAll", params, typeSolver, context, typeParametersValues);
+
+ //Optional<MethodUsage> methodUsage = context.solveMethodAsUsage("addAll", params, typeSolver);
+
+ //assertTrue(methodUsage.isPresent());
+
+ }*/
+
+ @Test
+ public void genericCollectionWithWildcardsAndExtensions() {
+ CompilationUnit cu = parseSample("GenericCollectionWithExtension");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Foo");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "bar");
+ ReturnStmt returnStmt = Navigator.findReturnStmt(method);
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ Expression returnStmtExpr = returnStmt.getExpression().get();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+
+ ResolvedType type = javaParserFacade.getType(returnStmtExpr);
+
+ assertEquals(false, type.isTypeVariable());
+ assertEquals("boolean", type.describe());
+ }
+
+ @Test
+ public void methodWithGenericParameterTypes() {
+ CompilationUnit cu = parseSample("GenericCollectionWithExtension");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Foo");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "bar");
+ MethodCallExpr methodCall = Navigator.findMethodCall(method, "foo").get();
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+
+ MethodUsage methodUsage = javaParserFacade.solveMethodAsUsage(methodCall);
+
+ assertEquals("foo", methodUsage.getName());
+ }
+
+ @Test
+ public void genericCollectionWithWildcards() {
+ CompilationUnit cu = parseSample("GenericCollection");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Foo");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "bar");
+ ReturnStmt returnStmt = Navigator.findReturnStmt(method);
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ Expression returnStmtExpr = returnStmt.getExpression().get();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+
+ ResolvedType type = javaParserFacade.getType(returnStmtExpr);
+
+ assertEquals(false, type.isTypeVariable());
+ assertEquals("boolean", type.describe());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/JavaParserFacadeResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/JavaParserFacadeResolutionTest.java
new file mode 100644
index 000000000..37fec2647
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/JavaParserFacadeResolutionTest.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.*;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.FieldDeclaration;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.expr.NameExpr;
+import com.github.javaparser.ast.stmt.CatchClause;
+import com.github.javaparser.ast.stmt.TryStmt;
+import com.github.javaparser.ast.type.Type;
+import com.github.javaparser.resolution.MethodUsage;
+import com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
+import com.github.javaparser.resolution.types.ResolvedReferenceType;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.resolution.types.ResolvedUnionType;
+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.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+
+public class JavaParserFacadeResolutionTest extends AbstractResolutionTest {
+
+ @Test
+ public void typeDeclarationSuperClassImplicitlyIncludeObject() {
+ CompilationUnit cu = parseSample("Generics");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Generics");
+ ResolvedTypeDeclaration typeDeclaration = JavaParserFacade.get(new ReflectionTypeSolver()).getTypeDeclaration(clazz);
+ ResolvedReferenceType superclass = typeDeclaration.asClass().getSuperClass();
+ assertEquals(Object.class.getCanonicalName(), superclass.getQualifiedName());
+ }
+
+ // See issue 42
+ @Test
+ public void solvingReferenceToUnsupportedOperationException() {
+ String code = "public class Bla {\n" +
+ " public void main()\n" +
+ " {\n" +
+ " try\n" +
+ " {\n" +
+ " int i = 0;\n" +
+ " }\n" +
+ " catch (UnsupportedOperationException e)\n" +
+ " {\n" +
+ " String s;\n" +
+ " e.getMessage();\n" +
+ " }\n" +
+ " }\n" +
+ "}";
+ MethodCallExpr methodCallExpr = Navigator.findNodeOfGivenClass(JavaParser.parse(code), MethodCallExpr.class);
+ MethodUsage methodUsage = JavaParserFacade.get(new ReflectionTypeSolver()).solveMethodAsUsage(methodCallExpr);
+ assertEquals("java.lang.Throwable.getMessage()", methodUsage.getQualifiedSignature());
+ }
+
+ // See issue 46
+ @Test
+ public void solvingReferenceToCatchClauseParam() {
+ String code = "public class Bla {\n" +
+ " public void main()\n" +
+ " {\n" +
+ " try\n" +
+ " {\n" +
+ " int i = 0;\n" +
+ " }\n" +
+ " catch (UnsupportedOperationException e)\n" +
+ " {\n" +
+ " String s;\n" +
+ " e.getMessage();\n" +
+ " }\n" +
+ " }\n" +
+ "}";
+ MethodCallExpr methodCallExpr = Navigator.findNodeOfGivenClass(JavaParser.parse(code), MethodCallExpr.class);
+ NameExpr nameE = (NameExpr)methodCallExpr.getScope().get();
+ SymbolReference<? extends ResolvedValueDeclaration> symbolReference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(nameE);
+ assertEquals(true, symbolReference.isSolved());
+ assertEquals(true, symbolReference.getCorrespondingDeclaration().isParameter());
+ assertEquals("e", symbolReference.getCorrespondingDeclaration().asParameter().getName());
+ assertEquals("java.lang.UnsupportedOperationException", symbolReference.getCorrespondingDeclaration().asParameter().getType().asReferenceType().getQualifiedName());
+ }
+
+ // See issue 47
+ @Test
+ public void solvingReferenceToAnAncestorInternalClass() {
+ String code = "public class Foo {\n" +
+ " public class Base {\n" +
+ " public class X {\n" +
+ " }\n" +
+ " }\n" +
+ "\n" +
+ " public class Derived extends Base {\n" +
+ " public X x = null;\n" +
+ " }\n" +
+ "}";
+ FieldDeclaration fieldDeclaration = Navigator.findNodeOfGivenClass(JavaParser.parse(code), FieldDeclaration.class);
+ Type jpType = fieldDeclaration.getCommonType();
+ ResolvedType jssType = JavaParserFacade.get(new ReflectionTypeSolver()).convertToUsage(jpType);
+ assertEquals("Foo.Base.X", jssType.asReferenceType().getQualifiedName());
+ }
+
+ // See issue 119
+ @Test
+ public void solveTryWithResourceVariable() {
+ String code = "import java.util.Scanner; class A { void foo() { try (Scanner sc = new Scanner(System.in)) {\n" +
+ " sc.nextLine();\n" +
+ "} } }";
+ CompilationUnit cu = JavaParser.parse(code);
+ MethodCallExpr methodCallExpr = Navigator.findMethodCall(cu, "nextLine").get();
+ Expression scope = methodCallExpr.getScope().get();
+ ResolvedType type = JavaParserFacade.get(new ReflectionTypeSolver()).getType(scope);
+ assertEquals(true, type.isReferenceType());
+ assertEquals("java.util.Scanner", type.asReferenceType().getQualifiedName());
+ }
+
+ private CompilationUnit parseWithTypeSolver(String code) {
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ ParserConfiguration parserConfiguration = new ParserConfiguration();
+ parserConfiguration.setSymbolResolver(new JavaSymbolSolver(typeSolver));
+ JavaParser javaParser = new JavaParser(parserConfiguration);
+ return javaParser.parse(ParseStart.COMPILATION_UNIT, new StringProvider(code)).getResult().get();
+ }
+
+ @Test
+ public void solveMultiCatchType() {
+ String code = "class A {\n" +
+ " public void foo() {\n" +
+ " try {\n" +
+ " \n" +
+ " } catch (IllegalStateException | IllegalArgumentException e) {\n" +
+ " \n" +
+ " }\n" +
+ " }\n" +
+ " }";
+ CompilationUnit cu = parseWithTypeSolver(code);
+ CatchClause catchClause = Navigator.findNodeOfGivenClass(cu, CatchClause.class);
+ Type jpType = catchClause.getParameter().getType();
+ ResolvedType jssType = jpType.resolve();
+ assertEquals(true, jssType instanceof ResolvedUnionType);
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/LambdaResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/LambdaResolutionTest.java
new file mode 100644
index 000000000..3620c5230
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/LambdaResolutionTest.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.LambdaExpr;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.stmt.ReturnStmt;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class LambdaResolutionTest extends AbstractResolutionTest {
+
+ @Test
+ public void lambdaMapParameter() {
+ CompilationUnit cu = parseSample("Lambda");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Agenda");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "lambdaMap");
+ ReturnStmt returnStmt = Navigator.findReturnStmt(method);
+ MethodCallExpr methodCallExpr = (MethodCallExpr) returnStmt.getExpression().get();
+ Expression expression = methodCallExpr.getArguments().get(0);
+
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(new ReflectionTypeSolver());
+ ResolvedType type = javaParserFacade.getType(expression);
+ assertEquals("java.util.function.Function<? super java.lang.String, ? extends java.lang.String>", type.describe());
+ }
+
+ @Test
+ public void personsStream() {
+ CompilationUnit cu = parseSample("Lambda");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Agenda");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "lambdaMap");
+ ReturnStmt returnStmt = Navigator.findReturnStmt(method);
+ Expression expression = returnStmt.getExpression().get();
+ expression = Navigator.findMethodCall(expression, "stream").get();
+
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(new ReflectionTypeSolver());
+ ResolvedType type = javaParserFacade.getType(expression);
+ assertEquals("java.util.stream.Stream<java.lang.String>", type.describe());
+ }
+
+ @Test
+ public void lambdaMap() {
+ CompilationUnit cu = parseSample("Lambda");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Agenda");
+ MethodDeclaration m1 = Navigator.demandMethod(clazz, "lambdaMap");
+ MethodDeclaration m2 = Navigator.demandMethod(clazz, "lambdaMap2");
+ ReturnStmt returnStmt1 = Navigator.findReturnStmt(m1);
+ ReturnStmt returnStmt2 = Navigator.findReturnStmt(m2);
+ Expression e1 = returnStmt1.getExpression().get();
+ Expression e2 = returnStmt2.getExpression().get();
+
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(new ReflectionTypeSolver());
+ ResolvedType type1 = javaParserFacade.getType(e1);
+ ResolvedType type2 = javaParserFacade.getType(e2);
+ assertEquals("java.util.stream.Stream<java.lang.String>", type1.describe());
+ assertEquals("java.util.stream.Stream<java.util.stream.IntStream>", type2.describe());
+ }
+
+ @Test
+ public void lambdaReduce() {
+ CompilationUnit cu = parseSample("Lambda");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Agenda");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "reduce");
+ ReturnStmt returnStmt = Navigator.findReturnStmt(method);
+ Expression expr = returnStmt.getExpression().get();
+
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(new ReflectionTypeSolver());
+ ResolvedType type1 = javaParserFacade.getType(expr);
+ assertEquals("java.util.Optional<java.lang.Integer>", type1.describe());
+ }
+
+ @Test
+ public void lambdaBifunc() {
+ CompilationUnit cu = parseSample("Lambda");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Agenda");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "bifunc");
+ ReturnStmt returnStmt = Navigator.findReturnStmt(method);
+ Expression expr = returnStmt.getExpression().get();
+
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(new ReflectionTypeSolver());
+ ResolvedType type1 = javaParserFacade.getType(expr);
+ assertEquals("double", type1.describe());
+ }
+
+ @Test
+ public void lambdaCollectParam() {
+ CompilationUnit cu = parseSample("LambdaCollect");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Agenda");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "lambdaMap");
+ ReturnStmt returnStmt = Navigator.findReturnStmt(method);
+ MethodCallExpr methodCallExpr = (MethodCallExpr) returnStmt.getExpression().get();
+ // Collectors.toList()
+ Expression expression = methodCallExpr.getArguments().get(0);
+
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(new ReflectionTypeSolver());
+ ResolvedType type = javaParserFacade.getType(expression);
+ assertEquals("java.util.stream.Collector<T, ? extends java.lang.Object, java.util.List<T>>", type.describe());
+ }
+
+ @Test
+ public void lambdaCollect() {
+ CompilationUnit cu = parseSample("LambdaCollect");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Agenda");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "lambdaMap");
+ ReturnStmt returnStmt = Navigator.findReturnStmt(method);
+ Expression expression = returnStmt.getExpression().get();
+
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(new ReflectionTypeSolver());
+ ResolvedType type = javaParserFacade.getType(expression);
+ assertEquals("java.util.List<java.lang.String>", type.describe());
+ }
+
+ @Test
+ public void lambdaBlockExplicitReturn() {
+ CompilationUnit cu = parseSample("LambdaMulti");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Agenda");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "lambdaSingleReturn");
+ ReturnStmt returnStmt = Navigator.findReturnStmt(method);
+ Expression expression = returnStmt.getExpression().get();
+
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(new ReflectionTypeSolver());
+ ResolvedType type = javaParserFacade.getType(expression);
+ assertEquals("java.lang.String", type.describe());
+ }
+
+ @Test
+ public void lambdaBlockMultiLineReturn() {
+ CompilationUnit cu = parseSample("LambdaMulti");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Agenda");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "multiLineReturn");
+ ReturnStmt returnStmt = Navigator.findReturnStmt(method);
+ Expression expression = returnStmt.getExpression().get();
+
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(new ReflectionTypeSolver());
+ ResolvedType type = javaParserFacade.getType(expression);
+ assertEquals("java.lang.String", type.describe());
+ }
+
+ @Test
+ public void typeOfVoidLambda() {
+ CompilationUnit cu = parseSample("LambdaVoid");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Agenda");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "lambdaEmpty");
+ ReturnStmt returnStmt = Navigator.findReturnStmt(method);
+ Expression expression = returnStmt.getExpression().get();
+ LambdaExpr lambdaExpr = Navigator.findNodeOfGivenClass(expression, LambdaExpr.class);
+
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(new ReflectionTypeSolver());
+ ResolvedType type = javaParserFacade.getType(lambdaExpr);
+ assertEquals("void", type.describe());
+ }
+
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/MethodsResolutionLogicTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/MethodsResolutionLogicTest.java
new file mode 100644
index 000000000..b53607dbd
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/MethodsResolutionLogicTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.resolution.MethodUsage;
+import com.github.javaparser.resolution.types.ResolvedReferenceType;
+import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserClassDeclaration;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionFactory;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import com.google.common.collect.ImmutableList;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+
+public class MethodsResolutionLogicTest extends AbstractResolutionTest {
+
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() {
+ File srcNewCode = adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-core"));
+ CombinedTypeSolver combinedTypeSolverNewCode = new CombinedTypeSolver();
+ combinedTypeSolverNewCode.add(new ReflectionTypeSolver());
+ combinedTypeSolverNewCode.add(new JavaParserTypeSolver(srcNewCode));
+ combinedTypeSolverNewCode.add(new JavaParserTypeSolver(adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-generated-sources"))));
+ typeSolver = combinedTypeSolverNewCode;
+ }
+
+ @Test
+ public void compatibilityShouldConsiderAlsoTypeVariablesNegative() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ ResolvedReferenceType stringType = (ResolvedReferenceType) ReflectionFactory.typeUsageFor(String.class, typeSolver);
+ ResolvedReferenceType rawClassType = (ResolvedReferenceType) ReflectionFactory.typeUsageFor(Class.class, typeSolver);
+ assertEquals(true, rawClassType.isRawType());
+ ResolvedReferenceType classOfStringType = (ResolvedReferenceType) rawClassType.replaceTypeVariables(rawClassType.getTypeDeclaration().getTypeParameters().get(0), stringType);
+ MethodUsage mu = constructorDeclaration.getAllMethods().stream().filter(m -> m.getDeclaration().getSignature().equals("isThrows(java.lang.Class<? extends java.lang.Throwable>)")).findFirst().get();
+
+ assertEquals(false, MethodResolutionLogic.isApplicable(mu, "isThrows", ImmutableList.of(classOfStringType), typeSolver));
+ }
+
+ @Test
+ public void compatibilityShouldConsiderAlsoTypeVariablesRaw() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ ResolvedReferenceType rawClassType = (ResolvedReferenceType) ReflectionFactory.typeUsageFor(Class.class, typeSolver);
+ MethodUsage mu = constructorDeclaration.getAllMethods().stream().filter(m -> m.getDeclaration().getSignature().equals("isThrows(java.lang.Class<? extends java.lang.Throwable>)")).findFirst().get();
+
+ assertEquals(true, MethodResolutionLogic.isApplicable(mu, "isThrows", ImmutableList.of(rawClassType), typeSolver));
+ }
+
+ @Test
+ public void compatibilityShouldConsiderAlsoTypeVariablesPositive() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ ResolvedReferenceType runtimeException = (ResolvedReferenceType) ReflectionFactory.typeUsageFor(RuntimeException.class, typeSolver);
+ ResolvedReferenceType rawClassType = (ResolvedReferenceType) ReflectionFactory.typeUsageFor(Class.class, typeSolver);
+ ResolvedReferenceType classOfRuntimeType = (ResolvedReferenceType) rawClassType.replaceTypeVariables(rawClassType.getTypeDeclaration().getTypeParameters().get(0), runtimeException);
+ MethodUsage mu = constructorDeclaration.getAllMethods().stream().filter(m -> m.getDeclaration().getSignature().equals("isThrows(java.lang.Class<? extends java.lang.Throwable>)")).findFirst().get();
+
+ assertEquals(true, MethodResolutionLogic.isApplicable(mu, "isThrows", ImmutableList.of(classOfRuntimeType), typeSolver));
+ }
+}
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
new file mode 100644
index 000000000..2e6dc946d
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/MethodsResolutionTest.java
@@ -0,0 +1,361 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.expr.ThisExpr;
+import com.github.javaparser.ast.stmt.ReturnStmt;
+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.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserAnonymousClassDeclaration;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class MethodsResolutionTest extends AbstractResolutionTest {
+
+ @Test
+ public void solveMethodAccessThroughSuper() {
+ CompilationUnit cu = parseSample("AccessThroughSuper");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "AccessThroughSuper.SubClass");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "methodTest");
+ ReturnStmt returnStmt = (ReturnStmt) method.getBody().get().getStatements().get(0);
+ Expression expression = returnStmt.getExpression().get();
+
+ ResolvedType ref = JavaParserFacade.get(new ReflectionTypeSolver()).getType(expression);
+ assertEquals("java.lang.String", ref.describe());
+ }
+
+ @Test
+ public void solveMethodWithClassExpressionAsParameter() {
+ CompilationUnit cu = parseSample("ClassExpression");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "ClassExpression");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "foo");
+ MethodCallExpr expression = Navigator.findMethodCall(method, "noneOf").get();
+
+ MethodUsage methodUsage = JavaParserFacade.get(new ReflectionTypeSolver()).solveMethodAsUsage(expression);
+ assertEquals("noneOf", methodUsage.getName());
+ }
+
+ @Test
+ public void solveMethodInInterfaceParent() {
+ CompilationUnit cu = parseSample("MethodCalls");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "MethodCalls");
+
+ MethodDeclaration method = Navigator.demandMethod(clazz, "inheritedInterfaceMethod");
+ MethodCallExpr expression = Navigator.findMethodCall(method, "toString").get();
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ MethodUsage call1 = javaParserFacade.solveMethodAsUsage(expression);
+ assertEquals("java.lang.Object.toString()", call1.getQualifiedSignature());
+ }
+
+ @Test
+ public void solveMethodWithTypePromotionsToLong() {
+ CompilationUnit cu = parseSample("Issue338");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypePromotions");
+
+ MethodDeclaration method = Navigator.demandMethod(clazz, "callingLong");
+
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(0).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("longParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(1).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("longParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(2).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("longParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(3).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("longParam", reference.getCorrespondingDeclaration().getName());
+ }
+
+ }
+
+ @Test
+ public void solveMethodWithTypePromotionsToInt() {
+ CompilationUnit cu = parseSample("Issue338");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypePromotions");
+
+ MethodDeclaration method = Navigator.demandMethod(clazz, "callingInt");
+
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(0).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("intParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(1).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("intParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(2).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("intParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(3).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(false, reference.isSolved());
+ }
+
+ }
+
+ @Test
+ public void solveMethodWithTypePromotionsToShort() {
+ CompilationUnit cu = parseSample("Issue338");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypePromotions");
+
+ MethodDeclaration method = Navigator.demandMethod(clazz, "callingShort");
+
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(0).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("shortParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(1).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("shortParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(2).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(false, reference.isSolved());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(3).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(false, reference.isSolved());
+ }
+
+ }
+
+ @Test
+ public void solveMethodWithTypePromotionsToByte() {
+ CompilationUnit cu = parseSample("Issue338");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypePromotions");
+
+ MethodDeclaration method = Navigator.demandMethod(clazz, "callingByte");
+
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(0).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("byteParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(1).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(false, reference.isSolved());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(2).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(false, reference.isSolved());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(3).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(false, reference.isSolved());
+ }
+
+ }
+
+ @Test
+ public void solveMethodWithTypePromotionsToLongWithExtraParam() {
+ CompilationUnit cu = parseSample("Issue338");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypePromotionsWithExtraParam");
+
+ MethodDeclaration method = Navigator.demandMethod(clazz, "callingLong");
+
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(0).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("longParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(1).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("longParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(2).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("longParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(3).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("longParam", reference.getCorrespondingDeclaration().getName());
+ }
+
+ }
+
+ @Test
+ public void solveMethodWithTypePromotionsToIntWithExtraParam() {
+ CompilationUnit cu = parseSample("Issue338");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypePromotionsWithExtraParam");
+
+ MethodDeclaration method = Navigator.demandMethod(clazz, "callingInt");
+
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(0).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("intParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(1).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("intParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(2).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("intParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(3).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(false, reference.isSolved());
+ }
+
+ }
+
+ @Test
+ public void solveMethodWithTypePromotionsToShortWithExtraParam() {
+ CompilationUnit cu = parseSample("Issue338");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypePromotionsWithExtraParam");
+
+ MethodDeclaration method = Navigator.demandMethod(clazz, "callingShort");
+
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(0).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("shortParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(1).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("shortParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(2).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(false, reference.isSolved());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(3).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(false, reference.isSolved());
+ }
+
+ }
+
+ @Test
+ public void solveMethodWithTypePromotionsToByteWithExtraParam() {
+ CompilationUnit cu = parseSample("Issue338");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypePromotionsWithExtraParam");
+
+ MethodDeclaration method = Navigator.demandMethod(clazz, "callingByte");
+
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(0).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(true, reference.isSolved());
+ assertEquals("byteParam", reference.getCorrespondingDeclaration().getName());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(1).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(false, reference.isSolved());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(2).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(false, reference.isSolved());
+ }
+ {
+ MethodCallExpr expression = method.getBody().get().getStatements().get(3).asExpressionStmt().getExpression().asMethodCallExpr();
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression);
+ assertEquals(false, reference.isSolved());
+ }
+
+ }
+
+ @Test
+ public void callOnThisInAnonymousClass() {
+ CompilationUnit cu = parseSample("ThisInAnonymousClass");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Bar");
+
+ MethodCallExpr fooCall = Navigator.findMethodCall(clazz, "foo").get();
+
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(fooCall);
+ assertEquals(true, reference.isSolved());
+ }
+
+ @Test
+ public void thisInAnonymousClass() {
+ CompilationUnit cu = parseSample("ThisInAnonymousClass");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Bar");
+
+ ThisExpr thisExpression = Navigator.findNodeOfGivenClass(clazz, ThisExpr.class);
+
+ ResolvedType type = JavaParserFacade.get(new ReflectionTypeSolver()).getType(thisExpression);
+ assertEquals(true, type.isReferenceType());
+ assertEquals(true, type.asReferenceType().getTypeDeclaration() instanceof JavaParserAnonymousClassDeclaration);
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/QualifiedNameResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/QualifiedNameResolutionTest.java
new file mode 100644
index 000000000..906ac68e6
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/QualifiedNameResolutionTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.NameExpr;
+import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class QualifiedNameResolutionTest extends AbstractResolutionTest {
+
+ @Test
+ public void resolveLocalVariableInParentOfParent() {
+ CompilationUnit cu = parseSample("QualifiedNameTest");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "QualifiedNameTest");
+ MethodDeclaration method = Navigator.demandMethod(referencesToField, "foo1");
+ NameExpr nameExpr = Navigator.findNameExpression(method, "s").get();
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = JavaParserFacade.get(new ReflectionTypeSolver()).solve(nameExpr);
+ assertTrue(ref.isSolved());
+ assertEquals("java.util.Scanner", ref.getCorrespondingDeclaration().getType().asReferenceType().getQualifiedName());
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/StatementContextResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/StatementContextResolutionTest.java
new file mode 100644
index 000000000..b96abf721
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/StatementContextResolutionTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.expr.NameExpr;
+import com.github.javaparser.resolution.MethodUsage;
+import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class StatementContextResolutionTest extends AbstractResolutionTest {
+
+ @Test
+ public void resolveLocalVariableInParentOfParent() {
+ CompilationUnit cu = parseSample("LocalVariableInParent");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "LocalVariableInParent");
+ MethodDeclaration method = Navigator.demandMethod(referencesToField, "foo1");
+ NameExpr nameExpr = Navigator.findNameExpression(method, "s").get();
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = JavaParserFacade.get(new ReflectionTypeSolver()).solve(nameExpr);
+ assertTrue(ref.isSolved());
+ assertEquals("java.lang.String", ref.getCorrespondingDeclaration().getType().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void resolveLocalVariableInParent() {
+ CompilationUnit cu = parseSample("LocalVariableInParent");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "LocalVariableInParent");
+ MethodDeclaration method = Navigator.demandMethod(referencesToField, "foo3");
+ NameExpr nameExpr = Navigator.findNameExpression(method, "s").get();
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = JavaParserFacade.get(new ReflectionTypeSolver()).solve(nameExpr);
+ assertTrue(ref.isSolved());
+ assertEquals("java.lang.String", ref.getCorrespondingDeclaration().getType().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void resolveLocalVariableInSameParent() {
+ CompilationUnit cu = parseSample("LocalVariableInParent");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "LocalVariableInParent");
+ MethodDeclaration method = Navigator.demandMethod(referencesToField, "foo2");
+ NameExpr nameExpr = Navigator.findNameExpression(method, "s").get();
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = JavaParserFacade.get(new ReflectionTypeSolver()).solve(nameExpr);
+ assertTrue(ref.isSolved());
+ assertEquals("java.lang.String", ref.getCorrespondingDeclaration().getType().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void resolveLocalAndSeveralAnnidatedLevels() {
+ CompilationUnit cu = parseSample("LocalVariableInParent");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "LocalVariableInParent");
+ MethodDeclaration method = Navigator.demandMethod(referencesToField, "foo4");
+ MethodCallExpr call = Navigator.findMethodCall(method, "add").get();
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = JavaParserFacade.get(typeSolver).solve(call.getScope().get());
+ assertTrue(ref.isSolved());
+ assertEquals("java.util.List<Comment>", ref.getCorrespondingDeclaration().getType().describe());
+
+ MethodUsage methodUsage = JavaParserFacade.get(typeSolver).solveMethodAsUsage(call);
+ assertEquals("add", methodUsage.getName());
+ }
+
+ @Test
+ public void resolveMethodOnGenericClass() {
+ CompilationUnit cu = parseSample("LocalVariableInParent");
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "LocalVariableInParent");
+ MethodDeclaration method = Navigator.demandMethod(referencesToField, "foo5");
+ MethodCallExpr call = Navigator.findMethodCall(method, "add").get();
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = JavaParserFacade.get(typeSolver).solve(call.getScope().get());
+ assertTrue(ref.isSolved());
+ assertEquals("java.util.List<Comment>", ref.getCorrespondingDeclaration().getType().describe());
+
+ MethodUsage methodUsage = JavaParserFacade.get(typeSolver).solveMethodAsUsage(call);
+ assertEquals("add", methodUsage.getName());
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverTest.java
new file mode 100644
index 000000000..eafe60122
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.visitor.VoidVisitor;
+import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
+import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
+import com.github.javaparser.symbolsolver.AbstractTest;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserClassDeclaration;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author Federico Tomassetti
+ */
+public class SymbolSolverTest extends AbstractTest {
+
+ private TypeSolver typeSolverNewCode;
+ private SymbolSolver symbolSolver;
+
+ @Before
+ public void setup() {
+
+ File srcNewCode = adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-core"));
+ CombinedTypeSolver combinedTypeSolverNewCode = new CombinedTypeSolver();
+ combinedTypeSolverNewCode.add(new ReflectionTypeSolver());
+ combinedTypeSolverNewCode.add(new JavaParserTypeSolver(srcNewCode));
+ combinedTypeSolverNewCode.add(new JavaParserTypeSolver(adaptPath(new File("src/test/test_sourcecode/javaparser_new_src/javaparser-generated-sources"))));
+ typeSolverNewCode = combinedTypeSolverNewCode;
+
+ symbolSolver = new SymbolSolver(typeSolverNewCode);
+ }
+
+ @Test
+ public void testSolveSymbolUnexisting() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<? extends ResolvedValueDeclaration> res = symbolSolver.solveSymbolInType(constructorDeclaration, "unexisting");
+ assertEquals(false, res.isSolved());
+ }
+
+ @Test
+ public void testSolveSymbolToDeclaredField() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<? extends ResolvedValueDeclaration> res = symbolSolver.solveSymbolInType(constructorDeclaration, "name");
+ assertEquals(true, res.isSolved());
+ assertEquals(true, res.getCorrespondingDeclaration().isField());
+ }
+
+ @Test
+ public void testSolveSymbolToInheritedPublicField() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<? extends ResolvedValueDeclaration> res = symbolSolver.solveSymbolInType(constructorDeclaration, "NODE_BY_BEGIN_POSITION");
+ assertEquals(true, res.isSolved());
+ assertEquals(true, res.getCorrespondingDeclaration().isField());
+ }
+
+ @Test
+ public void testSolveSymbolToInheritedPrivateField() {
+ JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
+
+ SymbolReference<? extends ResolvedValueDeclaration> res = symbolSolver.solveSymbolInType(constructorDeclaration, "parentNode");
+ assertEquals(false, res.isSolved());
+ }
+
+ @Test
+ public void testSolvePackageLocalClass() {
+ assertTrue(typeSolverNewCode.solveType("com.github.javaparser.FooClass").isClass());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverWithJavassistClassTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverWithJavassistClassTest.java
new file mode 100644
index 000000000..cf103f156
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverWithJavassistClassTest.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.resolution.UnsolvedSymbolException;
+import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
+import com.github.javaparser.symbolsolver.AbstractTest;
+import com.github.javaparser.symbolsolver.javassistmodel.JavassistClassDeclaration;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.*;
+
+public class SymbolSolverWithJavassistClassTest extends AbstractTest {
+ private TypeSolver typeSolver;
+ private SymbolSolver symbolSolver;
+ private JavassistClassDeclaration classDeclarationConcreteClass;
+ private JavassistClassDeclaration classDeclarationSubClassOwnJar;
+ private JavassistClassDeclaration classDeclarationInterfaceUserOwnJar;
+ private JavassistClassDeclaration classDeclarationSubClassIncludedJar;
+ private JavassistClassDeclaration classDeclarationInterfaceUserIncludedJar;
+ private JavassistClassDeclaration classDeclarationSubClassExcludedJar;
+ private JavassistClassDeclaration classDeclarationInterfaceUserExcludedJar;
+
+ @Before
+ public void setup() throws IOException {
+ final String pathToMainJar = adaptPath("src/test/resources/javassist_symbols/main_jar/main_jar.jar");
+ final String pathToIncludedJar = adaptPath("src/test/resources/javassist_symbols/included_jar/included_jar.jar");
+ typeSolver = new CombinedTypeSolver(new JarTypeSolver(pathToIncludedJar), new JarTypeSolver(pathToMainJar), new ReflectionTypeSolver());
+
+ symbolSolver = new SymbolSolver(typeSolver);
+
+ classDeclarationConcreteClass = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.ConcreteClass");
+ classDeclarationSubClassOwnJar = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.SubClassOwnJar");
+ classDeclarationSubClassIncludedJar = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.SubClassIncludedJar");
+ classDeclarationSubClassExcludedJar = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.SubClassExcludedJar");
+ classDeclarationInterfaceUserOwnJar = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.InterfaceUserOwnJar");
+ classDeclarationInterfaceUserIncludedJar = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.InterfaceUserIncludedJar");
+ classDeclarationInterfaceUserExcludedJar = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.InterfaceUserExcludedJar");
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCanSolveFirstOwnField() {
+ assertCanSolveSymbol("STATIC_STRING", classDeclarationConcreteClass);
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCanSolveSecondOwnField() {
+ assertCanSolveSymbol("SECOND_STRING", classDeclarationConcreteClass);
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCantResolveNonExistentField() {
+ SymbolReference<? extends ResolvedValueDeclaration> solvedSymbol = symbolSolver.solveSymbolInType(classDeclarationConcreteClass, "FIELD_THAT_DOES_NOT_EXIST");
+
+ assertFalse(solvedSymbol.isSolved());
+
+ try {
+ solvedSymbol.getCorrespondingDeclaration();
+ } catch (Exception e) {
+ assertTrue(e instanceof UnsupportedOperationException);
+ assertEquals("CorrespondingDeclaration not available for unsolved symbol.", e.getMessage());
+ return;
+ }
+ fail("Expected UnsupportedOperationException when requesting CorrespondingDeclaration on unsolved SymbolRefernce");
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCanResolveFieldInSuper() {
+ assertCanSolveSymbol("SUPER_FIELD", classDeclarationSubClassOwnJar);
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCanResolveFieldInSuperIncludedJar() {
+ assertCanSolveSymbol("SUPER_FIELD", classDeclarationSubClassIncludedJar);
+ }
+
+ @Test
+ public void testSolveSymbolInTypeThrowsExceptionOnResolveFieldInSuperExcludedJar() {
+ try {
+ symbolSolver.solveSymbolInType(classDeclarationSubClassExcludedJar, "SUPER_FIELD");
+ } catch (Exception e) {
+ assertTrue(e instanceof UnsolvedSymbolException);
+ assertEquals("Unsolved symbol : com.github.javaparser.javasymbolsolver.javassist_symbols.excluded_jar.SuperClassExcludedJar", e.getMessage());
+ return;
+ }
+ fail("Excepted NotFoundException wrapped in a RuntimeException, but got no exception.");
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCanResolveFieldInInterface() {
+ assertCanSolveSymbol("INTERFACE_FIELD", classDeclarationInterfaceUserOwnJar);
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCanResolveFieldInInterfaceIncludedJar() {
+ assertCanSolveSymbol("INTERFACE_FIELD", classDeclarationInterfaceUserIncludedJar);
+ }
+
+ @Test
+ public void testSolveSymbolInTypeThrowsExceptionOnResolveFieldInInterfaceExcludedJar() {
+ try {
+ symbolSolver.solveSymbolInType(classDeclarationInterfaceUserExcludedJar, "INTERFACE_FIELD");
+ } catch (Exception e) {
+ assertTrue(e instanceof UnsolvedSymbolException);
+ assertEquals("Unsolved symbol : com.github.javaparser.javasymbolsolver.javassist_symbols.excluded_jar.InterfaceExcludedJar", e.getMessage());
+ return;
+ }
+ fail("Excepted NotFoundException wrapped in a RuntimeException, but got no exception.");
+ }
+
+ private void assertCanSolveSymbol(String symbolName, JavassistClassDeclaration classDeclaration) {
+ SymbolReference<? extends ResolvedValueDeclaration> solvedSymbol = symbolSolver.solveSymbolInType(classDeclaration, symbolName);
+
+ assertTrue(solvedSymbol.isSolved());
+ assertEquals(symbolName, solvedSymbol.getCorrespondingDeclaration().asField().getName());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverWithJavassistEnumTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverWithJavassistEnumTest.java
new file mode 100644
index 000000000..120d2f14d
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverWithJavassistEnumTest.java
@@ -0,0 +1,106 @@
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.resolution.UnsolvedSymbolException;
+import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
+import com.github.javaparser.symbolsolver.AbstractTest;
+import com.github.javaparser.symbolsolver.javassistmodel.JavassistEnumDeclaration;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.*;
+import static org.junit.Assert.fail;
+
+public class SymbolSolverWithJavassistEnumTest extends AbstractTest {
+ private TypeSolver typeSolver;
+ private SymbolSolver symbolSolver;
+ private JavassistEnumDeclaration enumDeclarationConcrete;
+ private JavassistEnumDeclaration enumDeclarationInterfaceUserOwnJar;
+ private JavassistEnumDeclaration enumDeclarationInterfaceUserIncludedJar;
+ private JavassistEnumDeclaration enumDeclarationInterfaceUserExcludedJar;
+
+ @Before
+ public void setup() throws IOException {
+ final String pathToMainJar = adaptPath("src/test/resources/javassist_symbols/main_jar/main_jar.jar");
+ final String pathToIncludedJar = adaptPath("src/test/resources/javassist_symbols/included_jar/included_jar.jar");
+ typeSolver = new CombinedTypeSolver(new JarTypeSolver(pathToIncludedJar), new JarTypeSolver(pathToMainJar), new ReflectionTypeSolver());
+
+ symbolSolver = new SymbolSolver(typeSolver);
+
+ enumDeclarationConcrete = (JavassistEnumDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.ConcreteEnum");
+ enumDeclarationInterfaceUserOwnJar = (JavassistEnumDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.EnumInterfaceUserOwnJar");
+ enumDeclarationInterfaceUserIncludedJar = (JavassistEnumDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.EnumInterfaceUserIncludedJar");
+ enumDeclarationInterfaceUserExcludedJar = (JavassistEnumDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.EnumInterfaceUserExcludedJar");
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCanResolveFirstEnumValue() {
+ assertCanSolveSymbol("ENUM_VAL_ONE", enumDeclarationConcrete);
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCanResolveSecondEnumValue() {
+ assertCanSolveSymbol("ENUM_VAL_TWO", enumDeclarationConcrete);
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCanResolveFirstNormalField() {
+ assertCanSolveSymbol("STATIC_STRING", enumDeclarationConcrete);
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCanResolveSecondNormalField() {
+ assertCanSolveSymbol("SECOND_STRING", enumDeclarationConcrete);
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCantResolveNonExistentField() {
+ SymbolReference<? extends ResolvedValueDeclaration> solvedSymbol = symbolSolver.solveSymbolInType(enumDeclarationConcrete, "FIELD_THAT_DOES_NOT_EXIST");
+
+ assertFalse(solvedSymbol.isSolved());
+
+ try {
+ solvedSymbol.getCorrespondingDeclaration();
+ } catch (Exception e) {
+ assertTrue(e instanceof UnsupportedOperationException);
+ assertEquals("CorrespondingDeclaration not available for unsolved symbol.", e.getMessage());
+ return;
+ }
+ fail("Expected UnsupportedOperationException when requesting CorrespondingDeclaration on unsolved SymbolRefernce");
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCanResolveFieldInInterface() {
+ assertCanSolveSymbol("INTERFACE_FIELD", enumDeclarationInterfaceUserOwnJar);
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCanResolveFieldInInterfaceIncludedJar() {
+ assertCanSolveSymbol("INTERFACE_FIELD", enumDeclarationInterfaceUserIncludedJar);
+ }
+
+ @Test
+ public void testSolveSymbolInTypeThrowsExceptionOnResolveFieldInInterfaceExcludedJar() {
+ try {
+ symbolSolver.solveSymbolInType(enumDeclarationInterfaceUserExcludedJar, "INTERFACE_FIELD");
+ } catch (Exception e) {
+ assertTrue(e instanceof UnsolvedSymbolException);
+ assertEquals("Unsolved symbol : com.github.javaparser.javasymbolsolver.javassist_symbols.excluded_jar.InterfaceExcludedJar", e.getMessage());
+ return;
+ }
+ fail("Excepted NotFoundException wrapped in a RuntimeException, but got no exception.");
+ }
+
+ private void assertCanSolveSymbol(String symbolName, JavassistEnumDeclaration enumDeclaration) {
+ SymbolReference<? extends ResolvedValueDeclaration> solvedSymbol = symbolSolver.solveSymbolInType(enumDeclaration, symbolName);
+
+ assertTrue(solvedSymbol.isSolved());
+ assertEquals(symbolName, solvedSymbol.getCorrespondingDeclaration().asField().getName());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverWithJavassistInterfaceTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverWithJavassistInterfaceTest.java
new file mode 100644
index 000000000..7745e813f
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverWithJavassistInterfaceTest.java
@@ -0,0 +1,96 @@
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.resolution.UnsolvedSymbolException;
+import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
+import com.github.javaparser.symbolsolver.AbstractTest;
+import com.github.javaparser.symbolsolver.javassistmodel.JavassistInterfaceDeclaration;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.*;
+
+public class SymbolSolverWithJavassistInterfaceTest extends AbstractTest {
+ private TypeSolver typeSolver;
+ private SymbolSolver symbolSolver;
+ private JavassistInterfaceDeclaration interfaceDeclarationStandalone;
+ private JavassistInterfaceDeclaration interfaceDeclarationSubInterfaceOwnJar;
+ private JavassistInterfaceDeclaration interfaceDeclarationSubInterfaceIncludedJar;
+ private JavassistInterfaceDeclaration interfaceDeclarationSubInterfaceExcludedJar;
+
+ @Before
+ public void setup() throws IOException {
+ final String pathToMainJar = adaptPath("src/test/resources/javassist_symbols/main_jar/main_jar.jar");
+ final String pathToIncludedJar = adaptPath("src/test/resources/javassist_symbols/included_jar/included_jar.jar");
+ typeSolver = new CombinedTypeSolver(new JarTypeSolver(pathToIncludedJar), new JarTypeSolver(pathToMainJar), new ReflectionTypeSolver());
+
+ symbolSolver = new SymbolSolver(typeSolver);
+
+ interfaceDeclarationStandalone = (JavassistInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.StandaloneInterface");
+ interfaceDeclarationSubInterfaceOwnJar = (JavassistInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.SubInterfaceOwnJar");
+ interfaceDeclarationSubInterfaceIncludedJar = (JavassistInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.SubInterfaceIncludedJar");
+ interfaceDeclarationSubInterfaceExcludedJar = (JavassistInterfaceDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.SubInterfaceExcludedJar");
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCanResolveFirstNormalField() {
+ assertCanSolveSymbol("STATIC_STRING", interfaceDeclarationStandalone);
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCanResolveSecondNormalField() {
+ assertCanSolveSymbol("SECOND_STRING", interfaceDeclarationStandalone);
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCantResolveNonExistentField() {
+ SymbolReference<? extends ResolvedValueDeclaration> solvedSymbol = symbolSolver.solveSymbolInType(interfaceDeclarationStandalone, "FIELD_THAT_DOES_NOT_EXIST");
+
+ assertFalse(solvedSymbol.isSolved());
+
+ try {
+ solvedSymbol.getCorrespondingDeclaration();
+ } catch (Exception e) {
+ assertTrue(e instanceof UnsupportedOperationException);
+ assertEquals("CorrespondingDeclaration not available for unsolved symbol.", e.getMessage());
+ return;
+ }
+ fail("Expected UnsupportedOperationException when requesting CorrespondingDeclaration on unsolved SymbolRefernce");
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCanResolveFieldInExtendedInterfaceOwnJar() {
+ assertCanSolveSymbol("INTERFACE_FIELD", interfaceDeclarationSubInterfaceOwnJar);
+ }
+
+ @Test
+ public void testSolveSymbolInTypeCanResolveFieldInExtendedInterfaceIncludedJar() {
+ assertCanSolveSymbol("INTERFACE_FIELD", interfaceDeclarationSubInterfaceIncludedJar);
+ }
+
+ @Test
+ public void testSolveSymbolInTypeThrowsExceptionOnResolveFieldInExtendedInterfaceExcludedJar() {
+ try {
+ symbolSolver.solveSymbolInType(interfaceDeclarationSubInterfaceExcludedJar, "INTERFACE_FIELD");
+ } catch (Exception e) {
+ assertTrue(e instanceof UnsolvedSymbolException);
+ assertEquals("Unsolved symbol : com.github.javaparser.javasymbolsolver.javassist_symbols.excluded_jar.InterfaceExcludedJar", e.getMessage());
+ return;
+ }
+ fail("Excepted NotFoundException wrapped in a RuntimeException, but got no exception.");
+ }
+
+ private void assertCanSolveSymbol(String symbolName, JavassistInterfaceDeclaration interfaceDeclaration) {
+ SymbolReference<? extends ResolvedValueDeclaration> solvedSymbol = symbolSolver.solveSymbolInType(interfaceDeclaration, symbolName);
+
+ assertTrue(solvedSymbol.isSolved());
+ assertEquals(symbolName, solvedSymbol.getCorrespondingDeclaration().asField().getName());
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/VariadicResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/VariadicResolutionTest.java
new file mode 100644
index 000000000..48c0ca708
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/VariadicResolutionTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution;
+
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.stmt.ReturnStmt;
+import com.github.javaparser.resolution.MethodUsage;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class VariadicResolutionTest extends AbstractResolutionTest {
+
+ @Test
+ public void issue7() {
+ CompilationUnit cu = parseSample("Generics_issue7");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "SomeCollection");
+
+ MethodDeclaration method = Navigator.demandMethod(clazz, "foo3");
+
+ ReturnStmt stmt = (ReturnStmt) method.getBody().get().getStatements().get(0);
+ Expression expression = stmt.getExpression().get();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(new ReflectionTypeSolver());
+ ResolvedType type = javaParserFacade.getType(expression);
+ assertEquals(true, type.isReferenceType());
+ assertEquals(List.class.getCanonicalName(), type.asReferenceType().getQualifiedName());
+ assertEquals("java.util.List<java.lang.Long>", type.describe());
+ }
+
+ @Test
+ public void methodCallWithReferenceTypeAsVaridicArgumentIsSolved() {
+ CompilationUnit cu = parseSample("MethodCalls");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "MethodCalls");
+
+ MethodDeclaration method = Navigator.demandMethod(clazz, "variadicMethod");
+ MethodCallExpr callExpr = Navigator.findMethodCall(method, "variadicMethod").get();
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ MethodUsage callee = javaParserFacade.solveMethodAsUsage(callExpr);
+ assertEquals("variadicMethod", callee.getName());
+ }
+
+ @Test
+ public void resolveVariadicMethodWithGenericArgument() {
+ CompilationUnit cu = parseSample("MethodCalls");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "MethodCalls");
+
+ MethodDeclaration method = Navigator.demandMethod(clazz, "genericMethodTest");
+ MethodCallExpr callExpr = Navigator.findMethodCall(method, "variadicWithGenericArg").get();
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ MethodUsage callee = javaParserFacade.solveMethodAsUsage(callExpr);
+ assertEquals("variadicWithGenericArg", callee.getName());
+ }
+
+ @Test
+ public void selectMostSpecificVariadic() {
+ CompilationUnit cu = parseSample("MethodCalls");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "MethodCalls");
+
+ MethodDeclaration method = Navigator.demandMethod(clazz, "variadicTest");
+ List<MethodCallExpr> calls = method.findAll(MethodCallExpr.class);
+
+ File src = adaptPath(new File("src/test/resources"));
+ TypeSolver typeSolver = new CombinedTypeSolver(new ReflectionTypeSolver(), new JavaParserTypeSolver(src));
+
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ MethodUsage call1 = javaParserFacade.solveMethodAsUsage(calls.get(0));
+ MethodUsage call2 = javaParserFacade.solveMethodAsUsage(calls.get(1));
+ assertEquals("int", call1.returnType().describe());
+ assertEquals("void", call2.returnType().describe());
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/VarTypeTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/VarTypeTest.java
new file mode 100644
index 000000000..d8d0eafe0
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/VarTypeTest.java
@@ -0,0 +1,62 @@
+package com.github.javaparser.symbolsolver.resolution.javaparser;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ParseStart;
+import com.github.javaparser.ParserConfiguration;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.type.VarType;
+import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.JavaSymbolSolver;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import static com.github.javaparser.ParserConfiguration.LanguageLevel.JAVA_10;
+import static com.github.javaparser.Providers.provider;
+import static org.junit.Assert.assertEquals;
+
+public class VarTypeTest {
+ private final TypeSolver typeSolver = new ReflectionTypeSolver();
+ private final JavaParser javaParser = new JavaParser(new ParserConfiguration()
+ .setLanguageLevel(JAVA_10)
+ .setSymbolResolver(new JavaSymbolSolver(typeSolver)));
+
+ @Test
+ public void resolveAPrimitive() {
+ CompilationUnit ast = javaParser.parse(ParseStart.COMPILATION_UNIT, provider("class X{void x(){var abc = 1;}}")).getResult().get();
+ VarType varType = ast.findFirst(VarType.class).get();
+
+ ResolvedType resolvedType = varType.resolve();
+
+ assertEquals(ResolvedPrimitiveType.INT, resolvedType);
+ }
+
+ @Test
+ public void resolveAReferenceType() {
+ CompilationUnit ast = javaParser.parse(ParseStart.COMPILATION_UNIT, provider("class X{void x(){var abc = \"\";}}")).getResult().get();
+ VarType varType = ast.findFirst(VarType.class).get();
+
+ ResolvedType resolvedType = varType.resolve();
+
+ assertEquals(new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver), resolvedType);
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void failResolveNoInitializer() {
+ CompilationUnit ast = javaParser.parse(ParseStart.COMPILATION_UNIT, provider("class X{void x(){var abc;}}")).getResult().get();
+ VarType varType = ast.findFirst(VarType.class).get();
+
+ varType.resolve();
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void failResolveWrongLocation() {
+ CompilationUnit ast = javaParser.parse(ParseStart.COMPILATION_UNIT, provider("class X{void x(var x){};}")).getResult().get();
+ VarType varType = ast.findFirst(VarType.class).get();
+
+ varType.resolve();
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/ClassOrInterfaceDeclarationContextResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/ClassOrInterfaceDeclarationContextResolutionTest.java
new file mode 100644
index 000000000..a55941808
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/ClassOrInterfaceDeclarationContextResolutionTest.java
@@ -0,0 +1,490 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution.javaparser.contexts;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.resolution.MethodAmbiguityException;
+import com.github.javaparser.resolution.MethodUsage;
+import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
+import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.core.resolution.Context;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.contexts.ClassOrInterfaceDeclarationContext;
+import com.github.javaparser.symbolsolver.javaparsermodel.contexts.CompilationUnitContext;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.model.resolution.Value;
+import com.github.javaparser.symbolsolver.model.typesystem.NullType;
+import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
+import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.MemoryTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import com.google.common.collect.ImmutableList;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Optional;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Federico Tomassetti
+ */
+public class ClassOrInterfaceDeclarationContextResolutionTest extends AbstractResolutionTest {
+
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() {
+ typeSolver = new ReflectionTypeSolver();
+ }
+
+ @Test
+ public void getParentForTopClass() {
+ CompilationUnit cu = parseSample("ClassWithTypeVariables");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ assertFalse(null == context.getParent());
+ assertEquals(new CompilationUnitContext(cu, typeSolver), context.getParent());
+ }
+
+ @Test
+ public void solveExistingGenericType() {
+ CompilationUnit cu = parseSample("ClassWithTypeVariables");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ Optional<ResolvedType> a = context.solveGenericType("A", new MemoryTypeSolver());
+ Optional<ResolvedType> b = context.solveGenericType("B", new MemoryTypeSolver());
+ Optional<ResolvedType> c = context.solveGenericType("C", new MemoryTypeSolver());
+
+ assertEquals(true, a.isPresent());
+ assertEquals("A", a.get().describe());
+ assertEquals(true, a.get().isTypeVariable());
+ assertEquals(true, b.isPresent());
+ assertEquals("B", b.get().describe());
+ assertEquals(true, b.get().isTypeVariable());
+ assertEquals(true, c.isPresent());
+ assertEquals("C", c.get().describe());
+ assertEquals(true, c.get().isTypeVariable());
+ }
+
+ @Test
+ public void solveUnexistingGenericType() {
+ CompilationUnit cu = parseSample("ClassWithTypeVariables");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ Optional<ResolvedType> d = context.solveGenericType("D", new MemoryTypeSolver());
+
+ assertEquals(false, d.isPresent());
+ }
+
+ @Test
+ public void solveSymbolReferringToDeclaredInstanceField() {
+ CompilationUnit cu = parseSample("ClassWithSymbols");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = context.solveSymbol("i", new MemoryTypeSolver());
+ assertEquals(true, ref.isSolved());
+ assertEquals("int", ref.getCorrespondingDeclaration().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolReferringToDeclaredStaticField() {
+ CompilationUnit cu = parseSample("ClassWithSymbols");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = context.solveSymbol("j", new MemoryTypeSolver());
+ assertEquals(true, ref.isSolved());
+ assertEquals("long", ref.getCorrespondingDeclaration().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolReferringToInheritedInstanceField() {
+ CompilationUnit cu = parseSample("ClassWithSymbols");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = context.solveSymbol("k", new MemoryTypeSolver());
+ assertEquals(true, ref.isSolved());
+ assertEquals("boolean", ref.getCorrespondingDeclaration().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolReferringToInterfaceInheritedInstanceField() {
+ CompilationUnit cu = parseSample("ClassWithSymbols");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = context.solveSymbol("o", new MemoryTypeSolver());
+ assertEquals(true, ref.isSolved());
+ assertEquals("int", ref.getCorrespondingDeclaration().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolReferringToInheritedStaticField() {
+ CompilationUnit cu = parseSample("ClassWithSymbols");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = context.solveSymbol("m", new MemoryTypeSolver());
+ assertEquals(true, ref.isSolved());
+ assertEquals("char", ref.getCorrespondingDeclaration().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolReferringToUnknownElement() {
+ CompilationUnit cu = parseSample("ClassWithSymbols");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = context.solveSymbol("zzz", new MemoryTypeSolver());
+ assertEquals(false, ref.isSolved());
+ }
+
+ @Test
+ public void solveSymbolAsValueReferringToDeclaredInstanceField() {
+ CompilationUnit cu = parseSample("ClassWithSymbols");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ Optional<Value> ref = context.solveSymbolAsValue("i", new MemoryTypeSolver());
+ assertEquals(true, ref.isPresent());
+ assertEquals("int", ref.get().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolAsValueReferringToDeclaredStaticField() {
+ CompilationUnit cu = parseSample("ClassWithSymbols");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ Optional<Value> ref = context.solveSymbolAsValue("j", new MemoryTypeSolver());
+ assertEquals(true, ref.isPresent());
+ assertEquals("long", ref.get().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolAsValueReferringToInheritedInstanceField() {
+ CompilationUnit cu = parseSample("ClassWithSymbols");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ Optional<Value> ref = context.solveSymbolAsValue("k", new MemoryTypeSolver());
+ assertEquals(true, ref.isPresent());
+ assertEquals("boolean", ref.get().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolAsValueReferringToInterfaceInheritedInstanceField() {
+ CompilationUnit cu = parseSample("ClassWithSymbols");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ ClassOrInterfaceDeclarationContext context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ Optional<Value> ref = context.solveSymbolAsValue("o", new MemoryTypeSolver());
+ assertEquals(true, ref.isPresent());
+ assertEquals("int", ref.get().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolAsValueReferringToInheritedStaticField() {
+ CompilationUnit cu = parseSample("ClassWithSymbols");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ Optional<Value> ref = context.solveSymbolAsValue("m", new MemoryTypeSolver());
+ assertEquals(true, ref.isPresent());
+ assertEquals("char", ref.get().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolAsValueReferringToUnknownElement() {
+ CompilationUnit cu = parseSample("ClassWithSymbols");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ Optional<Value> ref = context.solveSymbolAsValue("zzz", new MemoryTypeSolver());
+ assertEquals(false, ref.isPresent());
+ }
+
+ @Test
+ public void solveTypeRefToItself() {
+ CompilationUnit cu = parseSample("ClassWithTypes");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<ResolvedTypeDeclaration> ref = context.solveType("A", new MemoryTypeSolver());
+ assertEquals(true, ref.isSolved());
+ }
+
+ @Test
+ public void solveTypeRefToUnexisting() {
+ CompilationUnit cu = parseSample("ClassWithTypes");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<ResolvedTypeDeclaration> ref = context.solveType("Foo", new MemoryTypeSolver());
+ assertEquals(false, ref.isSolved());
+ }
+
+ @Test
+ public void solveTypeRefToObject() {
+ CompilationUnit cu = parseSample("ClassWithTypes");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<ResolvedTypeDeclaration> ref = context.solveType("Object", new ReflectionTypeSolver());
+ assertEquals(true, ref.isSolved());
+ }
+
+ @Test
+ public void solveTypeRefToJavaLangObject() {
+ CompilationUnit cu = parseSample("ClassWithTypes");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<ResolvedTypeDeclaration> ref = context.solveType("java.lang.Object", new ReflectionTypeSolver());
+ assertEquals(true, ref.isSolved());
+ }
+
+ @Test
+ public void solveTypeRefToInternalClass() {
+ CompilationUnit cu = parseSample("ClassWithTypes");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<ResolvedTypeDeclaration> ref = context.solveType("B", new MemoryTypeSolver());
+ assertEquals(true, ref.isSolved());
+ }
+
+ @Test
+ public void solveTypeRefToInternalEnum() {
+ CompilationUnit cu = parseSample("ClassWithTypes");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<ResolvedTypeDeclaration> ref = context.solveType("E", new MemoryTypeSolver());
+ assertEquals(true, ref.isSolved());
+ }
+
+ @Test
+ public void solveTypeRefToInternalOfInternalClass() {
+ CompilationUnit cu = parseSample("ClassWithTypes");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<ResolvedTypeDeclaration> ref = context.solveType("C", new MemoryTypeSolver());
+ assertEquals(false, ref.isSolved());
+ }
+
+ @Test
+ public void solveTypeRefToAnotherClassInFile() {
+ CompilationUnit cu = parseSample("ClassWithTypes");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<ResolvedTypeDeclaration> ref = context.solveType("Super", new MemoryTypeSolver());
+ assertEquals(true, ref.isSolved());
+ }
+
+ @Test
+ public void solveTypeRefToQualifiedInternalClass() {
+ CompilationUnit cu = parseSample("ClassWithTypes");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<ResolvedTypeDeclaration> ref = context.solveType("A.B", new MemoryTypeSolver());
+ assertEquals(true, ref.isSolved());
+ }
+
+ @Test
+ public void solveTypeRefToQualifiedInternalOfInternalClass() {
+ CompilationUnit cu = parseSample("ClassWithTypes");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<ResolvedTypeDeclaration> ref = context.solveType("B.C", new MemoryTypeSolver());
+ assertEquals(true, ref.isSolved());
+ }
+
+ @Test
+ public void solveTypeRefToMoreQualifiedInternalOfInternalClass() {
+ CompilationUnit cu = parseSample("ClassWithTypes");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<ResolvedTypeDeclaration> ref = context.solveType("A.B.C", new MemoryTypeSolver());
+ assertEquals(true, ref.isSolved());
+ }
+
+ @Test
+ public void solveMethodSimpleCase() {
+ CompilationUnit cu = parseSample("ClassWithMethods");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<ResolvedMethodDeclaration> ref = context.solveMethod("foo0", ImmutableList.of(), false, new ReflectionTypeSolver());
+ assertEquals(true, ref.isSolved());
+ assertEquals("A", ref.getCorrespondingDeclaration().declaringType().getName());
+ assertEquals(0, ref.getCorrespondingDeclaration().getNumberOfParams());
+ }
+
+ @Test
+ public void solveMethodOverrideCase() {
+ CompilationUnit cu = parseSample("ClassWithMethods");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<ResolvedMethodDeclaration> ref = context.solveMethod("foo1", ImmutableList.of(), false, new ReflectionTypeSolver());
+ assertEquals(true, ref.isSolved());
+ assertEquals("A", ref.getCorrespondingDeclaration().declaringType().getName());
+ assertEquals(0, ref.getCorrespondingDeclaration().getNumberOfParams());
+ }
+
+ @Test
+ public void solveMethodInheritedCase() {
+ CompilationUnit cu = parseSample("ClassWithMethods");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<ResolvedMethodDeclaration> ref = context.solveMethod("foo2", ImmutableList.of(), false, new ReflectionTypeSolver());
+ assertEquals(true, ref.isSolved());
+ assertEquals("Super", ref.getCorrespondingDeclaration().declaringType().getName());
+ assertEquals(0, ref.getCorrespondingDeclaration().getNumberOfParams());
+ }
+
+ @Test
+ public void solveMethodWithPrimitiveParameters() {
+ CompilationUnit cu = parseSample("ClassWithMethods");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ ResolvedType intType = ResolvedPrimitiveType.INT;
+
+ SymbolReference<ResolvedMethodDeclaration> ref = context.solveMethod("foo3", ImmutableList.of(intType), false, new ReflectionTypeSolver());
+ assertEquals(true, ref.isSolved());
+ assertEquals("A", ref.getCorrespondingDeclaration().declaringType().getName());
+ assertEquals(1, ref.getCorrespondingDeclaration().getNumberOfParams());
+ }
+
+ @Test
+ public void solveMethodWithMoreSpecializedParameter() {
+ CompilationUnit cu = parseSample("ClassWithMethods");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ ResolvedType stringType = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver);
+
+ SymbolReference<ResolvedMethodDeclaration> ref = context.solveMethod("foo4", ImmutableList.of(stringType), false, new ReflectionTypeSolver());
+ assertEquals(true, ref.isSolved());
+ assertEquals("A", ref.getCorrespondingDeclaration().declaringType().getName());
+ assertEquals(1, ref.getCorrespondingDeclaration().getNumberOfParams());
+ }
+
+ @Test(expected = MethodAmbiguityException.class)
+ public void solveMethodWithAmbiguosCall() {
+ CompilationUnit cu = parseSample("ClassWithMethods");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ SymbolReference<ResolvedMethodDeclaration> ref = context.solveMethod("foo5", ImmutableList.of(NullType.INSTANCE), false, new ReflectionTypeSolver());
+ }
+
+ @Test
+ public void solveMethodAsUsageSimpleCase() {
+ CompilationUnit cu = parseSample("ClassWithMethods");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ Optional<MethodUsage> ref = context.solveMethodAsUsage("foo0", ImmutableList.of(), new ReflectionTypeSolver());
+ assertEquals(true, ref.isPresent());
+ assertEquals("A", ref.get().declaringType().getName());
+ assertEquals(0, ref.get().getNoParams());
+ }
+
+ @Test
+ public void solveMethodAsUsageOverrideCase() {
+ CompilationUnit cu = parseSample("ClassWithMethods");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ Optional<MethodUsage> ref = context.solveMethodAsUsage("foo1", ImmutableList.of(), new ReflectionTypeSolver());
+ assertEquals(true, ref.isPresent());
+ assertEquals("A", ref.get().declaringType().getName());
+ assertEquals(0, ref.get().getNoParams());
+ }
+
+ @Test
+ public void solveMethodAsUsageInheritedCase() {
+ CompilationUnit cu = parseSample("ClassWithMethods");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ Optional<MethodUsage> ref = context.solveMethodAsUsage("foo2", ImmutableList.of(), new ReflectionTypeSolver());
+ assertEquals(true, ref.isPresent());
+ assertEquals("Super", ref.get().declaringType().getName());
+ assertEquals(0, ref.get().getNoParams());
+ }
+
+ @Test
+ public void solveMethodAsUsageWithPrimitiveParameters() {
+ CompilationUnit cu = parseSample("ClassWithMethods");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ ResolvedType intType = ResolvedPrimitiveType.INT;
+
+ Optional<MethodUsage> ref = context.solveMethodAsUsage("foo3", ImmutableList.of(intType), new ReflectionTypeSolver());
+ assertEquals(true, ref.isPresent());
+ assertEquals("A", ref.get().declaringType().getName());
+ assertEquals(1, ref.get().getNoParams());
+ }
+
+ @Test
+ public void solveMethodAsUsageWithMoreSpecializedParameter() {
+ CompilationUnit cu = parseSample("ClassWithMethods");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ ResolvedType stringType = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver);
+
+ Optional<MethodUsage> ref = context.solveMethodAsUsage("foo4", ImmutableList.of(stringType), new ReflectionTypeSolver());
+ assertEquals(true, ref.isPresent());
+ assertEquals("A", ref.get().declaringType().getName());
+ assertEquals(1, ref.get().getNoParams());
+ }
+
+ @Test(expected = MethodAmbiguityException.class)
+ public void solveMethodAsUsageWithAmbiguosCall() {
+ CompilationUnit cu = parseSample("ClassWithMethods");
+ ClassOrInterfaceDeclaration classOrInterfaceDeclaration = Navigator.demandClass(cu, "A");
+ Context context = new ClassOrInterfaceDeclarationContext(classOrInterfaceDeclaration, typeSolver);
+
+ Optional<MethodUsage> ref = context.solveMethodAsUsage("foo5", ImmutableList.of(NullType.INSTANCE), new ReflectionTypeSolver());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/CompilationUnitContextResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/CompilationUnitContextResolutionTest.java
new file mode 100644
index 000000000..c079e5982
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/CompilationUnitContextResolutionTest.java
@@ -0,0 +1,236 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution.javaparser.contexts;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
+import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.core.resolution.Context;
+import com.github.javaparser.symbolsolver.javaparsermodel.contexts.CompilationUnitContext;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.model.resolution.Value;
+import com.github.javaparser.symbolsolver.model.typesystem.NullType;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.MemoryTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import com.google.common.collect.ImmutableList;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.Optional;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+/**
+ * @author Federico Tomassetti
+ */
+public class CompilationUnitContextResolutionTest extends AbstractResolutionTest {
+
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() {
+ typeSolver = new ReflectionTypeSolver();
+ }
+
+ @Test
+ public void getParent() {
+ CompilationUnit cu = parseSample("ClassWithTypeVariables");
+ Context context = new CompilationUnitContext(cu, typeSolver);
+
+ assertTrue(null == context.getParent());
+ }
+
+ @Test
+ public void solveExistingGenericType() {
+ CompilationUnit cu = parseSample("ClassWithTypeVariables");
+ Context context = new CompilationUnitContext(cu, typeSolver);
+
+ Optional<ResolvedType> a = context.solveGenericType("A", new MemoryTypeSolver());
+ Optional<ResolvedType> b = context.solveGenericType("B", new MemoryTypeSolver());
+ Optional<ResolvedType> c = context.solveGenericType("C", new MemoryTypeSolver());
+
+ assertEquals(false, a.isPresent());
+ assertEquals(false, b.isPresent());
+ assertEquals(false, c.isPresent());
+ }
+
+ @Test
+ public void solveUnexistingGenericType() {
+ CompilationUnit cu = parseSample("ClassWithTypeVariables");
+ Context context = new CompilationUnitContext(cu, typeSolver);
+
+ Optional<ResolvedType> d = context.solveGenericType("D", new MemoryTypeSolver());
+
+ assertEquals(false, d.isPresent());
+ }
+
+ @Test
+ public void solveSymbolReferringToStaticallyImportedValue() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("CompilationUnitSymbols");
+ Context context = new CompilationUnitContext(cu, typeSolver);
+
+ CombinedTypeSolver typeSolver = new CombinedTypeSolver();
+ typeSolver.add(new ReflectionTypeSolver());
+ typeSolver.add(new JarTypeSolver(adaptPath("src/test/resources/junit-4.8.1.jar")));
+ SymbolReference<? extends ResolvedValueDeclaration> ref = context.solveSymbol("out", typeSolver);
+ assertEquals(true, ref.isSolved());
+ assertEquals("java.io.PrintStream", ref.getCorrespondingDeclaration().getType().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void solveSymbolReferringToStaticallyImportedUsingAsteriskValue() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("CompilationUnitSymbols");
+ Context context = new CompilationUnitContext(cu, typeSolver);
+
+ CombinedTypeSolver typeSolver = new CombinedTypeSolver();
+ typeSolver.add(new ReflectionTypeSolver());
+ typeSolver.add(new JarTypeSolver(adaptPath("src/test/resources/junit-4.8.1.jar")));
+ SymbolReference<? extends ResolvedValueDeclaration> ref = context.solveSymbol("err", typeSolver);
+ assertEquals(true, ref.isSolved());
+ assertEquals("java.io.PrintStream", ref.getCorrespondingDeclaration().getType().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void solveSymbolReferringToStaticField() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("CompilationUnitSymbols");
+ Context context = new CompilationUnitContext(cu, typeSolver);
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = context.solveSymbol("java.lang.System.out", new ReflectionTypeSolver());
+ assertEquals(true, ref.isSolved());
+ assertEquals("java.io.PrintStream", ref.getCorrespondingDeclaration().getType().asReferenceType().getQualifiedName());
+ }
+
+ @Test
+ public void solveSymbolAsValueReferringToStaticallyImportedValue() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("CompilationUnitSymbols");
+ Context context = new CompilationUnitContext(cu, typeSolver);
+
+ CombinedTypeSolver typeSolver = new CombinedTypeSolver();
+ typeSolver.add(new ReflectionTypeSolver());
+ typeSolver.add(new JarTypeSolver(adaptPath("src/test/resources/junit-4.8.1.jar")));
+ Optional<Value> ref = context.solveSymbolAsValue("out", typeSolver);
+ assertEquals(true, ref.isPresent());
+ assertEquals("java.io.PrintStream", ref.get().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolAsValueReferringToStaticallyImportedUsingAsteriskValue() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("CompilationUnitSymbols");
+ Context context = new CompilationUnitContext(cu, typeSolver);
+
+ CombinedTypeSolver typeSolver = new CombinedTypeSolver();
+ typeSolver.add(new ReflectionTypeSolver());
+ typeSolver.add(new JarTypeSolver(adaptPath("src/test/resources/junit-4.8.1.jar")));
+ Optional<Value> ref = context.solveSymbolAsValue("err", typeSolver);
+ assertEquals(true, ref.isPresent());
+ assertEquals("java.io.PrintStream", ref.get().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolAsValueReferringToStaticField() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("CompilationUnitSymbols");
+ Context context = new CompilationUnitContext(cu, typeSolver);
+
+ Optional<Value> ref = context.solveSymbolAsValue("java.lang.System.out", new ReflectionTypeSolver());
+ assertEquals(true, ref.isPresent());
+ assertEquals("java.io.PrintStream", ref.get().getType().describe());
+ }
+
+ @Test
+ public void solveTypeInSamePackage() {
+ CompilationUnit cu = parseSample("CompilationUnitWithImports");
+ Context context = new CompilationUnitContext(cu, typeSolver);
+
+ ResolvedReferenceTypeDeclaration otherClass = mock(ResolvedReferenceTypeDeclaration.class);
+ when(otherClass.getQualifiedName()).thenReturn("com.foo.OtherClassInSamePackage");
+ MemoryTypeSolver memoryTypeSolver = new MemoryTypeSolver();
+ memoryTypeSolver.addDeclaration("com.foo.OtherClassInSamePackage", otherClass);
+
+ SymbolReference<ResolvedTypeDeclaration> ref = context.solveType("OtherClassInSamePackage", memoryTypeSolver);
+ assertEquals(true, ref.isSolved());
+ assertEquals("com.foo.OtherClassInSamePackage", ref.getCorrespondingDeclaration().getQualifiedName());
+ }
+
+ @Test
+ public void solveTypeImported() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("CompilationUnitWithImports");
+ Context context = new CompilationUnitContext(cu, typeSolver);
+
+ SymbolReference<ResolvedTypeDeclaration> ref = context.solveType("Assert", new JarTypeSolver(adaptPath("src/test/resources/junit-4.8.1.jar")));
+ assertEquals(true, ref.isSolved());
+ assertEquals("org.junit.Assert", ref.getCorrespondingDeclaration().getQualifiedName());
+ }
+
+ @Test
+ public void solveTypeNotImported() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("CompilationUnitWithImports");
+ Context context = new CompilationUnitContext(cu, typeSolver);
+
+ SymbolReference<ResolvedTypeDeclaration> ref = context.solveType("org.junit.Assume", new JarTypeSolver(adaptPath("src/test/resources/junit-4.8.1.jar")));
+ assertEquals(true, ref.isSolved());
+ assertEquals("org.junit.Assume", ref.getCorrespondingDeclaration().getQualifiedName());
+ }
+
+ @Test
+ public void solveMethodStaticallyImportedWithAsterisk() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("CompilationUnitWithImports");
+ Context context = new CompilationUnitContext(cu, typeSolver);
+
+ CombinedTypeSolver typeSolver = new CombinedTypeSolver();
+ typeSolver.add(new JarTypeSolver(adaptPath("src/test/resources/junit-4.8.1.jar")));
+ typeSolver.add(new ReflectionTypeSolver());
+
+ SymbolReference<ResolvedMethodDeclaration> ref = context.solveMethod("assertFalse", ImmutableList.of(ResolvedPrimitiveType.BOOLEAN), false, typeSolver);
+ assertEquals(true, ref.isSolved());
+ assertEquals("assertFalse", ref.getCorrespondingDeclaration().getName());
+ assertEquals(1, ref.getCorrespondingDeclaration().getNumberOfParams());
+ assertEquals("boolean", ref.getCorrespondingDeclaration().getParam(0).getType().describe());
+ assertEquals(true, ref.getCorrespondingDeclaration().getParam(0).getType().isPrimitive());
+ }
+
+ @Test
+ public void solveMethodStaticallyImportedWithoutAsterisk() throws ParseException, IOException {
+ CompilationUnit cu = parseSample("CompilationUnitSymbols");
+ Context context = new CompilationUnitContext(cu, typeSolver);
+
+ CombinedTypeSolver typeSolver = new CombinedTypeSolver();
+ typeSolver.add(new JarTypeSolver(adaptPath("src/test/resources/junit-4.8.1.jar")));
+ typeSolver.add(new ReflectionTypeSolver());
+
+ SymbolReference<ResolvedMethodDeclaration> ref = context.solveMethod("assertEquals", ImmutableList.of(NullType.INSTANCE, NullType.INSTANCE), false, typeSolver);
+ assertEquals(true, ref.isSolved());
+ assertEquals("assertEquals", ref.getCorrespondingDeclaration().getName());
+ assertEquals(2, ref.getCorrespondingDeclaration().getNumberOfParams());
+ assertEquals("java.lang.Object", ref.getCorrespondingDeclaration().getParam(0).getType().asReferenceType().getQualifiedName());
+ assertEquals("java.lang.Object", ref.getCorrespondingDeclaration().getParam(1).getType().asReferenceType().getQualifiedName());
+
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/EnumDeclarationContextResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/EnumDeclarationContextResolutionTest.java
new file mode 100644
index 000000000..93af30e48
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/EnumDeclarationContextResolutionTest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution.javaparser.contexts;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
+import com.github.javaparser.symbolsolver.core.resolution.Context;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.contexts.EnumDeclarationContext;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.model.resolution.Value;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.MemoryTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Optional;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author Federico Tomassetti
+ */
+public class EnumDeclarationContextResolutionTest extends AbstractResolutionTest {
+
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() {
+ typeSolver = new ReflectionTypeSolver();
+ }
+
+ @Test
+ public void solveSymbolReferringToDeclaredInstanceField() {
+ CompilationUnit cu = parseSample("AnEnum");
+ com.github.javaparser.ast.body.EnumDeclaration enumDeclaration = Navigator.demandEnum(cu, "MyEnum");
+ Context context = new EnumDeclarationContext(enumDeclaration, typeSolver);
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = context.solveSymbol("i", new MemoryTypeSolver());
+ assertEquals(true, ref.isSolved());
+ assertEquals("int", ref.getCorrespondingDeclaration().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolReferringToDeclaredStaticField() {
+ CompilationUnit cu = parseSample("AnEnum");
+ com.github.javaparser.ast.body.EnumDeclaration enumDeclaration = Navigator.demandEnum(cu, "MyEnum");
+ Context context = new EnumDeclarationContext(enumDeclaration, typeSolver);
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = context.solveSymbol("j", new MemoryTypeSolver());
+ assertEquals(true, ref.isSolved());
+ assertEquals("long", ref.getCorrespondingDeclaration().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolReferringToValue() {
+ CompilationUnit cu = parseSample("AnEnum");
+ com.github.javaparser.ast.body.EnumDeclaration enumDeclaration = Navigator.demandEnum(cu, "MyEnum");
+ Context context = new EnumDeclarationContext(enumDeclaration, typeSolver);
+
+ SymbolReference<? extends ResolvedValueDeclaration> ref = context.solveSymbol("E1", new MemoryTypeSolver());
+ assertEquals(true, ref.isSolved());
+ assertEquals("MyEnum", ref.getCorrespondingDeclaration().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolAsValueReferringToDeclaredInstanceField() {
+ CompilationUnit cu = parseSample("AnEnum");
+ com.github.javaparser.ast.body.EnumDeclaration enumDeclaration = Navigator.demandEnum(cu, "MyEnum");
+ Context context = new EnumDeclarationContext(enumDeclaration, typeSolver);
+
+ Optional<Value> ref = context.solveSymbolAsValue("i", new MemoryTypeSolver());
+ assertEquals(true, ref.isPresent());
+ assertEquals("int", ref.get().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolAsValueReferringToDeclaredStaticField() {
+ CompilationUnit cu = parseSample("AnEnum");
+ com.github.javaparser.ast.body.EnumDeclaration enumDeclaration = Navigator.demandEnum(cu, "MyEnum");
+ Context context = new EnumDeclarationContext(enumDeclaration, typeSolver);
+
+ Optional<Value> ref = context.solveSymbolAsValue("j", new MemoryTypeSolver());
+ assertEquals(true, ref.isPresent());
+ assertEquals("long", ref.get().getType().describe());
+ }
+
+ @Test
+ public void solveSymbolAsValueReferringToValue() {
+ CompilationUnit cu = parseSample("AnEnum");
+ com.github.javaparser.ast.body.EnumDeclaration enumDeclaration = Navigator.demandEnum(cu, "MyEnum");
+ Context context = new EnumDeclarationContext(enumDeclaration, typeSolver);
+
+ Optional<Value> ref = context.solveSymbolAsValue("E1", new MemoryTypeSolver());
+ assertEquals(true, ref.isPresent());
+ assertEquals("MyEnum", ref.get().getType().describe());
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/FieldAccessContextResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/FieldAccessContextResolutionTest.java
new file mode 100644
index 000000000..b13737e51
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/FieldAccessContextResolutionTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution.javaparser.contexts;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.resolution.MethodUsage;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author Malte Langkabel
+ */
+public class FieldAccessContextResolutionTest extends AbstractResolutionTest {
+
+ @Test
+ public void solveMethodCallInFieldAccessContext() {
+ CompilationUnit cu = parseSample("MethodCalls");
+
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "MethodCalls");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "bar2");
+ MethodCallExpr methodCallExpr = Navigator.findMethodCall(method, "getSelf").get();
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ MethodUsage methodUsage = JavaParserFacade.get(typeSolver).solveMethodAsUsage(methodCallExpr);
+
+ assertEquals(methodUsage.getName(), "getSelf");
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/LambdaExprContextResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/LambdaExprContextResolutionTest.java
new file mode 100644
index 000000000..63e513c7a
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/LambdaExprContextResolutionTest.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution.javaparser.contexts;
+
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.body.VariableDeclarator;
+import com.github.javaparser.ast.expr.LambdaExpr;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.stmt.ReturnStmt;
+import com.github.javaparser.symbolsolver.core.resolution.Context;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.contexts.LambdaExprContext;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.model.resolution.Value;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.Optional;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author Malte Langkabel
+ */
+public class LambdaExprContextResolutionTest extends AbstractResolutionTest {
+
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() {
+ typeSolver = new ReflectionTypeSolver();
+ }
+
+ @Test
+ public void solveParameterOfLambdaInMethodCallExpr() {
+ CompilationUnit cu = parseSample("Lambda");
+
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Agenda");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "lambdaMap");
+ ReturnStmt returnStmt = Navigator.findReturnStmt(method);
+ MethodCallExpr methodCallExpr = (MethodCallExpr) returnStmt.getExpression().get();
+ LambdaExpr lambdaExpr = (LambdaExpr) methodCallExpr.getArguments().get(0);
+
+ Context context = new LambdaExprContext(lambdaExpr, typeSolver);
+
+ Optional<Value> ref = context.solveSymbolAsValue("p", typeSolver);
+ assertTrue(ref.isPresent());
+ assertEquals("? super java.lang.String", ref.get().getType().describe());
+ }
+
+ @Test
+ public void solveParameterOfLambdaInFieldDecl() {
+ CompilationUnit cu = parseSample("Lambda");
+
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Agenda");
+ VariableDeclarator field = Navigator.demandField(clazz, "functional");
+ LambdaExpr lambdaExpr = (LambdaExpr) field.getInitializer().get();
+
+ File src = new File("src/test/resources");
+ CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
+ combinedTypeSolver.add(new ReflectionTypeSolver());
+ combinedTypeSolver.add(new JavaParserTypeSolver(adaptPath(src)));
+
+ Context context = new LambdaExprContext(lambdaExpr, combinedTypeSolver);
+
+ Optional<Value> ref = context.solveSymbolAsValue("p", typeSolver);
+ assertTrue(ref.isPresent());
+ assertEquals("java.lang.String", ref.get().getType().describe());
+ }
+
+ @Test
+ public void solveParameterOfLambdaInVarDecl() {
+ CompilationUnit cu = parseSample("Lambda");
+
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Agenda");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "testFunctionalVar");
+ VariableDeclarator varDecl = Navigator.demandVariableDeclaration(method, "a").get();
+ LambdaExpr lambdaExpr = (LambdaExpr) varDecl.getInitializer().get();
+
+ File src = adaptPath(new File("src/test/resources"));
+ CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
+ combinedTypeSolver.add(new ReflectionTypeSolver());
+ combinedTypeSolver.add(new JavaParserTypeSolver(src));
+
+ Context context = new LambdaExprContext(lambdaExpr, combinedTypeSolver);
+
+ Optional<Value> ref = context.solveSymbolAsValue("p", typeSolver);
+ assertTrue(ref.isPresent());
+ assertEquals("java.lang.String", ref.get().getType().describe());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/MethodCallExprContextResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/MethodCallExprContextResolutionTest.java
new file mode 100644
index 000000000..7fdaf73fd
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/MethodCallExprContextResolutionTest.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution.javaparser.contexts;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.resolution.MethodUsage;
+import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.core.resolution.Context;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.contexts.MethodCallExprContext;
+import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author Malte Langkabel
+ */
+public class MethodCallExprContextResolutionTest extends AbstractResolutionTest {
+ private MethodCallExpr getMethodCallExpr(String methodName, String callingMethodName) {
+ CompilationUnit cu = parseSample("MethodCalls");
+
+ com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "MethodCalls");
+ MethodDeclaration method = Navigator.demandMethod(clazz, methodName);
+ return Navigator.findMethodCall(method, callingMethodName).get();
+ }
+
+ private CombinedTypeSolver createTypeSolver() {
+ File src = adaptPath(new File("src/test/resources"));
+ CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
+ combinedTypeSolver.add(new ReflectionTypeSolver());
+ combinedTypeSolver.add(new JavaParserTypeSolver(src));
+ return combinedTypeSolver;
+ }
+
+ @Test
+ public void solveNestedMethodCallExprContextWithoutScope() {
+ MethodCallExpr methodCallExpr = getMethodCallExpr("bar1", "foo");
+ CombinedTypeSolver typeSolver = createTypeSolver();
+
+ Context context = new MethodCallExprContext(methodCallExpr, typeSolver);
+
+ Optional<MethodUsage> ref = context.solveMethodAsUsage("foo", Collections.emptyList(), typeSolver);
+ assertTrue(ref.isPresent());
+ assertEquals("MethodCalls", ref.get().declaringType().getQualifiedName());
+ }
+
+ @Test
+ public void solveGenericMethodCallMustUseProvidedTypeArgs() {
+ assertCanSolveGenericMethodCallMustUseProvidedTypeArgs("genericMethod0");
+ }
+
+ @Test
+ public void solveStaticGenericMethodCallMustUseProvidedTypeArgs() {
+ assertCanSolveGenericMethodCallMustUseProvidedTypeArgs("staticGenericMethod0");
+ }
+
+ private void assertCanSolveGenericMethodCallMustUseProvidedTypeArgs(String callMethodName) {
+ MethodCallExpr methodCallExpr = getMethodCallExpr("genericMethodTest", callMethodName);
+ CombinedTypeSolver typeSolver = createTypeSolver();
+
+ MethodCallExprContext context = new MethodCallExprContext(methodCallExpr, typeSolver);
+
+ Optional<MethodUsage> ref = context.solveMethodAsUsage(callMethodName, Collections.emptyList(), typeSolver);
+ assertTrue(ref.isPresent());
+ assertEquals("MethodCalls", ref.get().declaringType().getQualifiedName());
+ assertEquals(Collections.singletonList("java.lang.Integer"), ref.get().typeParametersMap().getTypes().stream().map(ty -> ty.asReferenceType().describe()).collect(Collectors.toList()));
+ }
+
+ @Test
+ public void solveGenericMethodCallCanInferFromArguments() {
+ assertCanSolveGenericMethodCallCanInferFromArguments("genericMethod1");
+ }
+
+ @Test
+ public void solveStaticGenericMethodCallCanInferFromArguments() {
+ assertCanSolveGenericMethodCallCanInferFromArguments("staticGenericMethod1");
+ }
+
+ private void assertCanSolveGenericMethodCallCanInferFromArguments(String callMethodName) {
+ MethodCallExpr methodCallExpr = getMethodCallExpr("genericMethodTest", callMethodName);
+ CombinedTypeSolver typeSolver = createTypeSolver();
+
+ MethodCallExprContext context = new MethodCallExprContext(methodCallExpr, typeSolver);
+
+ ResolvedReferenceTypeDeclaration stringType = typeSolver.solveType("java.lang.String");
+
+ List<ResolvedType> argumentsTypes = new ArrayList<>();
+ argumentsTypes.add(new ReferenceTypeImpl(stringType, typeSolver));
+
+ Optional<MethodUsage> ref = context.solveMethodAsUsage(callMethodName, argumentsTypes, typeSolver);
+ assertTrue(ref.isPresent());
+ assertEquals("MethodCalls", ref.get().declaringType().getQualifiedName());
+ assertEquals(Collections.singletonList("java.lang.String"), ref.get().typeParametersMap().getTypes().stream().map(ty -> ty.asReferenceType().describe()).collect(Collectors.toList()));
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/MethodContextResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/MethodContextResolutionTest.java
new file mode 100644
index 000000000..17d978079
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/contexts/MethodContextResolutionTest.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution.javaparser.contexts;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration;
+import com.github.javaparser.symbolsolver.core.resolution.Context;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.contexts.MethodContext;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.MemoryTypeSolver;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author Malte Langkabel
+ */
+public class MethodContextResolutionTest extends AbstractResolutionTest {
+
+ private TypeSolver typeSolver;
+
+ @Before
+ public void setup() {
+ typeSolver = new ReflectionTypeSolver();
+ }
+
+ @Test
+ public void solveTypeRefToLocalClass() {
+ CompilationUnit cu = parseSample("MethodWithTypes");
+ ClassOrInterfaceDeclaration cd = Navigator.demandClass(cu, "Main");
+ MethodDeclaration md = Navigator.demandMethod(cd, "methodWithLocalTypes");
+ Context context = new MethodContext(md, typeSolver);
+
+ SymbolReference<ResolvedTypeDeclaration> ref = context.solveType("LocalClass", new MemoryTypeSolver());
+ assertEquals(true, ref.isSolved());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/declarations/JavaParserTypeParameterResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/declarations/JavaParserTypeParameterResolutionTest.java
new file mode 100644
index 000000000..c72e7727f
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/javaparser/declarations/JavaParserTypeParameterResolutionTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution.javaparser.declarations;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+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.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class JavaParserTypeParameterResolutionTest extends AbstractResolutionTest {
+
+ private void testGenericArguments(String containingMethodName) {
+ CompilationUnit cu = parseSample("GenericMethodArguments");
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ ClassOrInterfaceDeclaration classDecl = Navigator.demandClass(cu, "GenericMethodArguments");
+ MethodDeclaration containingMethod = Navigator.demandMethod(classDecl, containingMethodName);
+ MethodCallExpr bar = Navigator.findMethodCall(containingMethod, "apply").get();
+
+ assertTrue(javaParserFacade.solve(bar).isSolved());
+ }
+
+ @Test
+ public void genericMethodWithGenericClassBasedArgument() {
+ testGenericArguments("useCase1");
+ }
+
+ @Test
+ public void genericMethodWithGenericClassArgument() {
+ testGenericArguments("useCase2");
+ }
+
+ @Test
+ public void declaredOnMethodPositiveCase() {
+ CompilationUnit cu = parseSample("MethodTypeParameter");
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ ClassOrInterfaceDeclaration classDecl = Navigator.demandClass(cu, "Foo");
+ MethodDeclaration methodDecl = Navigator.demandMethod(classDecl, "usage");
+ MethodCallExpr callToFoo = (MethodCallExpr) Navigator.findReturnStmt(methodDecl).getExpression().get();
+ ResolvedMethodDeclaration methodDeclaration = javaParserFacade.solve(callToFoo).getCorrespondingDeclaration();
+ for (ResolvedTypeParameterDeclaration tp : methodDeclaration.getTypeParameters()) {
+ assertTrue(tp instanceof JavaParserTypeParameter);
+ assertEquals("C", tp.getName());
+ assertEquals(true, tp.declaredOnMethod());
+ assertEquals(false, tp.declaredOnType());
+ }
+ }
+
+ @Test
+ public void declaredOnMethodNegativeCase() {
+ CompilationUnit cu = parseSample("ClassTypeParameter");
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver);
+ ClassOrInterfaceDeclaration classDecl = Navigator.demandClass(cu, "Foo");
+ MethodDeclaration methodDecl = Navigator.demandMethod(classDecl, "usage");
+ MethodCallExpr callToFoo = (MethodCallExpr) Navigator.findReturnStmt(methodDecl).getExpression().get();
+ ResolvedMethodDeclaration methodDeclaration = javaParserFacade.solve(callToFoo).getCorrespondingDeclaration();
+ ResolvedReferenceTypeDeclaration typeDeclaration = methodDeclaration.declaringType();
+ assertEquals(2, typeDeclaration.getTypeParameters().size());
+ assertTrue(typeDeclaration.getTypeParameters().get(0) instanceof JavaParserTypeParameter);
+ assertEquals("A", typeDeclaration.getTypeParameters().get(0).getName());
+ assertEquals(false, typeDeclaration.getTypeParameters().get(0).declaredOnMethod());
+ assertEquals(true, typeDeclaration.getTypeParameters().get(0).declaredOnType());
+ assertTrue(typeDeclaration.getTypeParameters().get(1) instanceof JavaParserTypeParameter);
+ assertEquals("B", typeDeclaration.getTypeParameters().get(1).getName());
+ assertEquals(false, typeDeclaration.getTypeParameters().get(1).declaredOnMethod());
+ assertEquals(true, typeDeclaration.getTypeParameters().get(1).declaredOnType());
+
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/reflectionmodel/SymbolResolutionResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/reflectionmodel/SymbolResolutionResolutionTest.java
new file mode 100644
index 000000000..8e0989f24
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/reflectionmodel/SymbolResolutionResolutionTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution.reflectionmodel;
+
+import com.github.javaparser.ParseException;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.body.VariableDeclarator;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.ast.stmt.ReturnStmt;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.javaparser.Navigator;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class SymbolResolutionResolutionTest extends AbstractResolutionTest {
+
+ @Test
+ public void getTypeOfField() {
+ CompilationUnit cu = parseSample("ReflectionFieldOfItself");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "MyClass");
+ VariableDeclarator field = Navigator.demandField(clazz, "PUBLIC");
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ ResolvedType ref = JavaParserFacade.get(typeSolver).getType(field);
+ assertEquals("int", ref.describe());
+ }
+
+ @Test
+ public void getTypeOfFieldAccess() {
+ CompilationUnit cu = parseSample("ReflectionFieldOfItself");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "MyClass");
+ VariableDeclarator field = Navigator.demandField(clazz, "PUBLIC");
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ ResolvedType ref = JavaParserFacade.get(typeSolver).getType(field.getInitializer().get());
+ assertEquals("int", ref.describe());
+ }
+
+ @Test
+ public void conditionalExpressionExample() {
+ CompilationUnit cu = parseSample("JreConditionalExpression");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "MyClass");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "foo1");
+ ReturnStmt returnStmt = Navigator.findReturnStmt(method);
+ Expression expression = returnStmt.getExpression().get();
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ ResolvedType ref = JavaParserFacade.get(typeSolver).getType(expression);
+ assertEquals("java.lang.String", ref.describe());
+ }
+
+ @Test
+ public void conditionalExpressionExampleFollowUp1() {
+ CompilationUnit cu = parseSample("JreConditionalExpression");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "MyClass");
+ MethodDeclaration method = Navigator.demandMethod(clazz, "foo1");
+ MethodCallExpr expression = Navigator.findMethodCall(method, "next").get();
+
+ TypeSolver typeSolver = new ReflectionTypeSolver();
+ ResolvedType ref = JavaParserFacade.get(typeSolver).getType(expression);
+ assertEquals("java.lang.String", ref.describe());
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typeinference/bounds/SameAsBoundTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typeinference/bounds/SameAsBoundTest.java
new file mode 100644
index 000000000..ba58dc797
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typeinference/bounds/SameAsBoundTest.java
@@ -0,0 +1,32 @@
+package com.github.javaparser.symbolsolver.resolution.typeinference.bounds;
+
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
+import com.github.javaparser.symbolsolver.resolution.typeinference.Bound;
+import com.github.javaparser.symbolsolver.resolution.typeinference.InferenceVariable;
+import com.github.javaparser.symbolsolver.resolution.typeinference.Instantiation;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import java.util.Optional;
+
+import static org.junit.Assert.assertEquals;
+
+public class SameAsBoundTest {
+
+ private TypeSolver typeSolver = new ReflectionTypeSolver();
+ private ResolvedType stringType = new ReferenceTypeImpl(new ReflectionTypeSolver().solveType(String.class.getCanonicalName()), typeSolver);
+
+ @Test
+ public void recognizeInstantiation() {
+ // { α = String } contains a single bound, instantiating α as String.
+ InferenceVariable inferenceVariable = new InferenceVariable("α", null);
+ Bound bound1 = new SameAsBound(inferenceVariable, stringType);
+ Bound bound2 = new SameAsBound(stringType, inferenceVariable);
+
+ assertEquals(Optional.of(new Instantiation(inferenceVariable, stringType)), bound1.isAnInstantiation());
+ assertEquals(Optional.of(new Instantiation(inferenceVariable, stringType)), bound2.isAnInstantiation());
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typeinference/bounds/SubtypeOfBoundTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typeinference/bounds/SubtypeOfBoundTest.java
new file mode 100644
index 000000000..ecda07701
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typeinference/bounds/SubtypeOfBoundTest.java
@@ -0,0 +1,86 @@
+package com.github.javaparser.symbolsolver.resolution.typeinference.bounds;
+
+import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
+import com.github.javaparser.resolution.types.ResolvedReferenceType;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.resolution.types.ResolvedWildcard;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
+import com.github.javaparser.symbolsolver.resolution.typeinference.*;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+import static com.github.javaparser.symbolsolver.resolution.typeinference.TypeHelper.isProperType;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+
+public class SubtypeOfBoundTest {
+
+ private TypeSolver typeSolver = new ReflectionTypeSolver();
+ private ResolvedReferenceType iterableType = new ReferenceTypeImpl(new ReflectionTypeSolver().solveType(Iterable.class.getCanonicalName()), typeSolver);
+ private ResolvedReferenceType listType = new ReferenceTypeImpl(new ReflectionTypeSolver().solveType(List.class.getCanonicalName()), typeSolver);
+ private ResolvedType integerType = new ReferenceTypeImpl(new ReflectionTypeSolver().solveType(Integer.class.getCanonicalName()), typeSolver);
+ private ResolvedType doubleType = new ReferenceTypeImpl(new ReflectionTypeSolver().solveType(Double.class.getCanonicalName()), typeSolver);
+ private ResolvedType objectType = new ReferenceTypeImpl(new ReflectionTypeSolver().solveType(Object.class.getCanonicalName()), typeSolver);
+
+ @Test
+ public void recognizeProperLowerBound1() {
+ ResolvedTypeParameterDeclaration typeParameterDeclaration = mock(ResolvedTypeParameterDeclaration.class);
+
+ // { Integer <: α, Double <: α, α <: Object } describes two proper lower bounds and one proper upper bound for α.
+
+ InferenceVariable inferenceVariable = new InferenceVariable("α", typeParameterDeclaration);
+ Bound bound = new SubtypeOfBound(integerType, inferenceVariable);
+
+ assertEquals(Optional.of(new ProperLowerBound(inferenceVariable, integerType)), bound.isProperLowerBound());
+ }
+
+ @Test
+ public void recognizeProperLowerBound2() {
+ ResolvedTypeParameterDeclaration typeParameterDeclaration = mock(ResolvedTypeParameterDeclaration.class);
+
+ // { Integer <: α, Double <: α, α <: Object } describes two proper lower bounds and one proper upper bound for α.
+
+ InferenceVariable inferenceVariable = new InferenceVariable("α", typeParameterDeclaration);
+ Bound bound = new SubtypeOfBound(doubleType, inferenceVariable);
+
+ assertEquals(Optional.of(new ProperLowerBound(inferenceVariable, doubleType)), bound.isProperLowerBound());
+ }
+
+ @Test
+ public void recognizeProperUpperBound1() {
+ ResolvedTypeParameterDeclaration typeParameterDeclaration = mock(ResolvedTypeParameterDeclaration.class);
+
+ // { Integer <: α, Double <: α, α <: Object } describes two proper lower bounds and one proper upper bound for α.
+
+ InferenceVariable inferenceVariable = new InferenceVariable("α", typeParameterDeclaration);
+ Bound bound = new SubtypeOfBound(inferenceVariable, objectType);
+
+ assertEquals(Optional.of(new ProperUpperBound(inferenceVariable, objectType)), bound.isProperUpperBound());
+ }
+
+ @Test
+ public void recognizeProperUpperBound2() {
+ ResolvedTypeParameterDeclaration typeParameterDeclaration1 = mock(ResolvedTypeParameterDeclaration.class);
+ ResolvedTypeParameterDeclaration typeParameterDeclaration2 = mock(ResolvedTypeParameterDeclaration.class);
+ // { α <: Iterable<?>, β <: Object, α <: List<β> } describes a proper upper bound for each of α and β, along with a dependency between them.
+
+ InferenceVariable alpha = new InferenceVariable("α", typeParameterDeclaration1);
+ InferenceVariable beta = new InferenceVariable("β", typeParameterDeclaration2);
+ ResolvedType iterableOfWildcard = new ReferenceTypeImpl(iterableType.getTypeDeclaration(), Arrays.asList(ResolvedWildcard.UNBOUNDED), typeSolver);
+ ResolvedType listOfBeta = new ReferenceTypeImpl(listType.getTypeDeclaration(), Arrays.asList(beta), typeSolver);
+
+ Bound bound1 = new SubtypeOfBound(alpha, iterableOfWildcard);
+ Bound bound2 = new SubtypeOfBound(beta, objectType);
+ Bound bound3 = new SubtypeOfBound(alpha, listOfBeta);
+
+ assertEquals(false, isProperType(listOfBeta));
+ assertEquals(Optional.of(new ProperUpperBound(alpha, iterableOfWildcard)), bound1.isProperUpperBound());
+ assertEquals(Optional.of(new ProperUpperBound(beta, objectType)), bound2.isProperUpperBound());
+ assertEquals(true, bound3.isADependency());
+ }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typeinference/constraintformulas/ConstraintFormulaTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typeinference/constraintformulas/ConstraintFormulaTest.java
new file mode 100644
index 000000000..0563ca5b3
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typeinference/constraintformulas/ConstraintFormulaTest.java
@@ -0,0 +1,70 @@
+package com.github.javaparser.symbolsolver.resolution.typeinference.constraintformulas;
+
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.StringLiteralExpr;
+import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
+import com.github.javaparser.symbolsolver.resolution.typeinference.BoundSet;
+import com.github.javaparser.symbolsolver.resolution.typeinference.ConstraintFormula;
+import com.github.javaparser.symbolsolver.resolution.typeinference.InferenceVariable;
+import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+
+public class ConstraintFormulaTest {
+
+ private TypeSolver typeSolver = new ReflectionTypeSolver();
+ private ResolvedType stringType = new ReferenceTypeImpl(new ReflectionTypeSolver().solveType(String.class.getCanonicalName()), typeSolver);
+
+ /**
+ * From JLS 18.1.2
+ *
+ * From Collections.singleton("hi"), we have the constraint formula ‹"hi" → α›.
+ * Through reduction, this will become the constraint formula: ‹String <: α›.
+ */
+ @Test
+ public void testExpressionCompatibleWithTypeReduce1() {
+ ResolvedTypeParameterDeclaration tp = mock(ResolvedTypeParameterDeclaration.class);
+
+ Expression e = new StringLiteralExpr("hi");
+ InferenceVariable inferenceVariable = new InferenceVariable("α", tp);
+
+ ExpressionCompatibleWithType formula = new ExpressionCompatibleWithType(typeSolver, e, inferenceVariable);
+
+ ConstraintFormula.ReductionResult res1 = formula.reduce(BoundSet.empty());
+ assertEquals(
+ ConstraintFormula.ReductionResult.empty().withConstraint(new TypeCompatibleWithType(typeSolver, stringType, inferenceVariable)),
+ res1);
+
+ assertEquals(
+ ConstraintFormula.ReductionResult.empty().withConstraint(new TypeSubtypeOfType(typeSolver, stringType, inferenceVariable)),
+ res1.getConstraint(0).reduce(BoundSet.empty()));
+ }
+
+// /**
+// * From JLS 18.1.2
+// *
+// * From Arrays.asList(1, 2.0), we have the constraint formulas ‹1 → α› and ‹2.0 → α›. Through reduction,
+// * these will become the constraint formulas ‹int → α› and ‹double → α›, and then ‹Integer <: α› and ‹Double <: α›.
+// */
+// @Test
+// public void testExpressionCompatibleWithTypeReduce2() {
+// throw new UnsupportedOperationException();
+// }
+//
+// /**
+// * From JLS 18.1.2
+// *
+// * From the target type of the constructor invocation List<Thread> lt = new ArrayList<>(), we have the constraint
+// * formula ‹ArrayList<α> → List<Thread>›. Through reduction, this will become the constraint formula ‹α <= Thread›,
+// * and then ‹α = Thread›.
+// */
+// @Test
+// public void testExpressionCompatibleWithTypeReduce3() {
+// throw new UnsupportedOperationException();
+// }
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typesolvers/AarTypeSolverTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typesolvers/AarTypeSolverTest.java
new file mode 100644
index 000000000..b9be96899
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typesolvers/AarTypeSolverTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution.typesolvers;
+
+import com.github.javaparser.symbolsolver.AbstractTest;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+public class AarTypeSolverTest extends AbstractTest {
+
+ @Test
+ public void initial() throws IOException {
+ String pathToJar = adaptPath("src/test/resources/aars/support-compat-24.2.0.aar");
+ AarTypeSolver aarTypeSolver = new AarTypeSolver(new File(pathToJar));
+ assertEquals(true, aarTypeSolver.tryToSolveType("android.support.v4.app.ActivityCompat").isSolved());
+ assertEquals(true, aarTypeSolver.tryToSolveType("android.support.v4.app.ActivityManagerCompat").isSolved());
+ assertEquals(true, aarTypeSolver.tryToSolveType("android.support.v4.app.NotificationCompat").isSolved());
+ assertEquals(true, aarTypeSolver.tryToSolveType("android.support.v4.app.NotificationCompat.Action").isSolved());
+ assertEquals(true, aarTypeSolver.tryToSolveType("android.support.v4.app.NotificationCompat.Action.Builder").isSolved());
+ assertEquals(false, aarTypeSolver.tryToSolveType("com.github.javaparser.ASTParser.Foo").isSolved());
+ assertEquals(false, aarTypeSolver.tryToSolveType("com.github.javaparser.Foo").isSolved());
+ assertEquals(false, aarTypeSolver.tryToSolveType("Foo").isSolved());
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typesolvers/JarTypeSolverTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typesolvers/JarTypeSolverTest.java
new file mode 100644
index 000000000..346fcfd60
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/typesolvers/JarTypeSolverTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2016 Federico Tomassetti
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.github.javaparser.symbolsolver.resolution.typesolvers;
+
+import com.github.javaparser.symbolsolver.AbstractTest;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+
+public class JarTypeSolverTest extends AbstractTest {
+
+ @Test
+ public void initial() throws IOException {
+ String pathToJar = adaptPath("src/test/resources/javaparser-core-2.1.0.jar");
+ JarTypeSolver jarTypeSolver = new JarTypeSolver(pathToJar);
+ assertEquals(true, jarTypeSolver.tryToSolveType("com.github.javaparser.SourcesHelper").isSolved());
+ assertEquals(true, jarTypeSolver.tryToSolveType("com.github.javaparser.Token").isSolved());
+ assertEquals(true, jarTypeSolver.tryToSolveType("com.github.javaparser.ASTParser.JJCalls").isSolved());
+ assertEquals(false, jarTypeSolver.tryToSolveType("com.github.javaparser.ASTParser.Foo").isSolved());
+ assertEquals(false, jarTypeSolver.tryToSolveType("com.github.javaparser.Foo").isSolved());
+ assertEquals(false, jarTypeSolver.tryToSolveType("Foo").isSolved());
+ }
+
+}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/utils/SymbolSolverQuickSetupTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/utils/SymbolSolverQuickSetupTest.java
new file mode 100644
index 000000000..ddc1bc622
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/utils/SymbolSolverQuickSetupTest.java
@@ -0,0 +1,50 @@
+package com.github.javaparser.symbolsolver.utils;
+
+import com.github.javaparser.ParserConfiguration;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.symbolsolver.JavaSymbolSolver;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.utils.SourceRoot;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+
+/**
+ * Try to resolve all the ClassOrInterfaceDeclaration and MethodCallExpr in some resources folder. If it fails to do
+ * so, an IllegalStateException is thrown.
+ */
+public class SymbolSolverQuickSetupTest {
+
+ private Path root = Paths.get("src/test/resources/symbolsolver_quicksetup");
+ private ParserConfiguration parserConfiguration = new ParserConfiguration();
+
+ @Before
+ public void setUp() throws IOException {
+ SymbolSolverQuickSetup ssr = new SymbolSolverQuickSetup(root);
+ TypeSolver typeSolver = ssr.walk();
+
+ parserConfiguration.setSymbolResolver(new JavaSymbolSolver(typeSolver));
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void notResolve() throws IOException {
+ SourceRoot sourceRoot = new SourceRoot(root);
+ sourceRoot.tryToParse();
+ // try to resolve, this will fail
+ sourceRoot.getCompilationUnits().forEach(compilationUnit ->
+ compilationUnit.findAll(ClassOrInterfaceDeclaration.class).forEach(ClassOrInterfaceDeclaration::resolve));
+ }
+
+ @Test
+ public void resolve() throws IOException {
+ SourceRoot sourceRoot = new SourceRoot(root, parserConfiguration);
+ sourceRoot.tryToParse();
+ // try to resolve, this should succeed
+ sourceRoot.getCompilationUnits().forEach(compilationUnit ->
+ compilationUnit.findAll(ClassOrInterfaceDeclaration.class).forEach(ClassOrInterfaceDeclaration::resolve));
+ }
+} \ No newline at end of file