• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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