1 package com.github.javaparser.symbolsolver; 2 3 import com.github.javaparser.*; 4 import com.github.javaparser.ast.CompilationUnit; 5 import com.github.javaparser.ast.Modifier; 6 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; 7 import com.github.javaparser.ast.body.MethodDeclaration; 8 import com.github.javaparser.ast.stmt.BlockStmt; 9 import com.github.javaparser.ast.type.ClassOrInterfaceType; 10 import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration; 11 import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration; 12 import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserClassDeclaration; 13 import com.github.javaparser.symbolsolver.model.resolution.SymbolReference; 14 import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; 15 import com.github.javaparser.symbolsolver.resolution.AbstractResolutionTest; 16 import org.junit.jupiter.api.BeforeEach; 17 import org.junit.jupiter.api.Test; 18 19 import java.util.List; 20 21 import static org.junit.jupiter.api.Assertions.assertEquals; 22 import static org.junit.jupiter.api.Assertions.assertTrue; 23 import java.time.Duration; 24 import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively; 25 26 /** 27 * @author Dominik Hardtke 28 * @since 01/09/2018 29 */ 30 class Issue1814Test extends AbstractResolutionTest { 31 private JavaParser javaParser; 32 33 @BeforeEach setup()34 void setup() { 35 final CompilationUnit compilationUnit = new CompilationUnit(); 36 compilationUnit.setPackageDeclaration("java.lang"); 37 // construct a fake java.lang.Object class with only one method (java.lang.Object#equals(java.lang.Object) 38 final ClassOrInterfaceDeclaration clazz = compilationUnit.addClass("Object", Modifier.Keyword.PUBLIC); 39 final MethodDeclaration equals = clazz.addMethod("equals", Modifier.Keyword.PUBLIC); 40 equals.addParameter("Object", "obj"); 41 final BlockStmt body = new BlockStmt(); 42 body.addStatement("return this == obj;"); 43 equals.setBody(body); 44 45 TypeSolver typeSolver = new TypeSolver() { 46 @Override 47 public TypeSolver getParent() { 48 return null; 49 } 50 51 @Override 52 public void setParent(TypeSolver parent) { 53 } 54 55 @Override 56 public SymbolReference<ResolvedReferenceTypeDeclaration> tryToSolveType(String name) { 57 if ("java.lang.Object".equals(name)) { 58 // custom handling 59 return SymbolReference.solved(new JavaParserClassDeclaration(clazz, this)); 60 } 61 62 return SymbolReference.unsolved(ResolvedReferenceTypeDeclaration.class); 63 } 64 }; 65 66 ParserConfiguration config = new ParserConfiguration(); 67 config.setSymbolResolver(new JavaSymbolSolver(typeSolver)); 68 javaParser = new JavaParser(config); 69 } 70 71 @Test getAllMethodsVisibleToInheritors()72 void getAllMethodsVisibleToInheritors() { 73 assertTimeoutPreemptively(Duration.ofMillis(1000L), () -> { 74 String code = String.join(System.lineSeparator(), "public class AbstractExercise extends java.lang.Object {", "}"); 75 ParseResult<CompilationUnit> parseResult = javaParser.parse(ParseStart.COMPILATION_UNIT, Providers.provider(code)); 76 assertTrue(parseResult.isSuccessful()); 77 assertTrue(parseResult.getResult().isPresent()); 78 List<ClassOrInterfaceType> referenceTypes = parseResult.getResult().get().findAll(ClassOrInterfaceType.class); 79 assertTrue(referenceTypes.size() > 0); 80 final List<ResolvedMethodDeclaration> methods = referenceTypes.get(0).resolve().getAllMethodsVisibleToInheritors(); 81 assertEquals(1, methods.size()); 82 }); 83 84 85 } 86 } 87