fix JavaParserClassDeclaration canBeAssignedTo() to not cause a recursion when java.lang.Object is resolved as a JavaParserClassDeclaration, including unit test. issue #2602
diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserClassDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserClassDeclaration.java
index 2625383..f4b4a70 100644
--- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserClassDeclaration.java
+++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserClassDeclaration.java
@@ -241,7 +241,7 @@
return true;
}
ResolvedClassDeclaration superclass = (ResolvedClassDeclaration) getSuperClass().getTypeDeclaration();
- if (superclass != null) {
+ if (superclass != null && superclass != this ) {
if (superclass.canBeAssignedTo(other)) {
return true;
}
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue2602Test.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue2602Test.java
new file mode 100644
index 0000000..9b1ecab
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/Issue2602Test.java
@@ -0,0 +1,86 @@
+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.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.body.TypeDeclaration;
+import com.github.javaparser.ast.expr.MethodCallExpr;
+import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration;
+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.MemoryTypeSolver;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+import static com.github.javaparser.Providers.provider;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class Issue2602Test extends AbstractSymbolResolutionTest {
+
+ private JavaParser javaParser;
+ private CompilationUnit cu;
+ private MemoryTypeSolver typeSolver;
+ private ParserConfiguration configuration;
+
+
+ @BeforeEach
+ public void setUp() {
+ typeSolver = new MemoryTypeSolver();
+ configuration = new ParserConfiguration().setSymbolResolver(new JavaSymbolSolver(typeSolver));
+
+ javaParser = new JavaParser(configuration);
+
+ //language=JAVA
+ String src = "package java.lang;" +
+ " class Object {}\n" +
+ "\n" +
+ "class A extends Object {}\n" +
+ "\n" +
+ "class B extends Object {}\n";
+
+
+ ParseResult<CompilationUnit> parseResult = javaParser.parse(
+ ParseStart.COMPILATION_UNIT,
+ provider(src)
+ );
+
+
+ System.out.println("parseResult = " + parseResult);
+ parseResult.getProblems().forEach(problem -> System.out.println("problem.getVerboseMessage() = " + problem.getVerboseMessage()));
+
+ assertTrue(parseResult.isSuccessful());
+ assertEquals(0, parseResult.getProblems().size(), "Expected zero errors when attempting to parse the input code.");
+ assertTrue(parseResult.getResult().isPresent(), "Must have a parse result to run this test.");
+
+ this.cu = parseResult.getResult().get();
+
+ JavaParserFacade javaParserFacade = JavaParserFacade.get(this.typeSolver);
+
+ for(TypeDeclaration t : this.cu.getTypes() ) {
+ JavaParserClassDeclaration classDecl = new JavaParserClassDeclaration((ClassOrInterfaceDeclaration)t,this.typeSolver);
+
+ this.typeSolver.addDeclaration((String)t.getFullyQualifiedName().get(),classDecl);
+ }
+ }
+
+
+ @Test
+ public void doTest_checkForRecursionWhen_java_lang_Object_IsA_JavaParserClassDeclaration() {
+
+ ResolvedReferenceTypeDeclaration thisDeclaration = typeSolver.solveType("java.lang.A");
+ ResolvedReferenceTypeDeclaration secondDeclaration = typeSolver.solveType("java.lang.B");
+
+ assertFalse(thisDeclaration.canBeAssignedTo(secondDeclaration),"Both types should not be assignable");
+ }
+
+
+}
\ No newline at end of file