Skip to content

Commit

Permalink
Merge pull request #2494 from PeterCsubak/issue_2387_canBeAssignedTo_…
Browse files Browse the repository at this point in the history
…bad_result

fix for canBeAssignedTo bad result bug
  • Loading branch information
matozoid committed Jan 22, 2020
2 parents 5406b75 + 568edb6 commit 1e152bd
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 8 deletions.
Expand Up @@ -242,10 +242,6 @@ public boolean canBeAssignedTo(ResolvedReferenceTypeDeclaration other) {
}
ResolvedClassDeclaration superclass = (ResolvedClassDeclaration) getSuperClass().getTypeDeclaration();
if (superclass != null) {
// We want to avoid infinite recursion in case of Object having Object as ancestor
if (Object.class.getCanonicalName().equals(superclass.getQualifiedName())) {
return true;
}
if (superclass.canBeAssignedTo(other)) {
return true;
}
Expand Down
Expand Up @@ -25,10 +25,7 @@
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.declarations.ResolvedMethodLikeDeclaration;
import com.github.javaparser.resolution.declarations.*;
import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
import com.github.javaparser.resolution.types.ResolvedReferenceType;
import com.github.javaparser.symbolsolver.AbstractSymbolResolutionTest;
Expand Down Expand Up @@ -905,4 +902,37 @@ void testHasAnnotation() throws IOException {
// Set<TypeDeclaration> internalTypes()

// Optional<TypeDeclaration> containerType()


@Test
void testCanBeAssignedTo() {
JavaParserClassDeclaration compilationUnit = (JavaParserClassDeclaration) typeSolver.solveType("com.github.javaparser.ast.CompilationUnit");
ResolvedReferenceTypeDeclaration stringTypeDeclaration = typeSolver.solveType("java.lang.String");
ResolvedReferenceTypeDeclaration objectTypeDeclaration = typeSolver.solveType("java.lang.Object");
ResolvedReferenceTypeDeclaration cloneableTypeDeclaration = typeSolver.solveType("java.lang.Cloneable");
ResolvedReferenceTypeDeclaration serializableTypeDeclaration = typeSolver.solveType("java.io.Serializable");

// Assign "UP" (implicit) -- Assign to implicitly state ancestor (java.lang.Object) -- should be permitted
assertTrue(compilationUnit.canBeAssignedTo(objectTypeDeclaration),"CompilationUnit should be reported as assignable to Object");

// Assign "UP" (explicit) -- Assign to explicitly stated ancestors (extends/implements) -- should be permitted
assertTrue(compilationUnit.canBeAssignedTo(cloneableTypeDeclaration),"CompilationUnit should be reported as assignable to Cloneable, because it extends Node which implements Cloneable");

// Assign "SELF" -- Assign to self -- should be permitted
assertTrue(compilationUnit.canBeAssignedTo(compilationUnit),"CompilationUnit should not be reported as assignable to CompilationUnit");
assertTrue(stringTypeDeclaration.canBeAssignedTo(stringTypeDeclaration),"String should not be reported as assignable to String");
assertTrue(objectTypeDeclaration.canBeAssignedTo(objectTypeDeclaration),"Object should be reported as assignable to Object");


// Assign "DOWN" -- Assign ancestor to descendent -- should be rejected
assertFalse(cloneableTypeDeclaration.canBeAssignedTo(compilationUnit),"CloneableTypeDeclaration should not be reported as assignable to CompilationUnit");
assertFalse(objectTypeDeclaration.canBeAssignedTo(compilationUnit),"Object should not be reported as assignable to CompilationUnit");

// Assign "independent" -- Assign to a class with a completely separate/independent hierarchy tree (up to Object, down to other) -- should be rejected
assertFalse(compilationUnit.canBeAssignedTo(stringTypeDeclaration),"CompilationUnit should not be reported as assignable to String");

// Assign "independent" -- Assign to a interface with a completely separate/independent hierarchy tree (up to Object, down to other) -- should be rejected
assertFalse(compilationUnit.canBeAssignedTo(serializableTypeDeclaration), "CompilationUnit should not be reported as assignable to Serializable");
}

}

0 comments on commit 1e152bd

Please sign in to comment.