103055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassettipackage com.github.javaparser.symbolsolver.javaparsermodel.contexts; 203055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti 303055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassettiimport com.github.javaparser.ast.Node; 403055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassettiimport com.github.javaparser.ast.body.Parameter; 503055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassettiimport com.github.javaparser.ast.nodeTypes.NodeWithParameters; 6cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassettiimport com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters; 7223fc7650a7a3b89b43d81160f40326aaeaa98f1Federico Tomassettiimport com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration; 8223fc7650a7a3b89b43d81160f40326aaeaa98f1Federico Tomassettiimport com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration; 9223fc7650a7a3b89b43d81160f40326aaeaa98f1Federico Tomassettiimport com.github.javaparser.resolution.declarations.ResolvedValueDeclaration; 10223fc7650a7a3b89b43d81160f40326aaeaa98f1Federico Tomassettiimport com.github.javaparser.resolution.types.ResolvedType; 11223fc7650a7a3b89b43d81160f40326aaeaa98f1Federico Tomassettiimport com.github.javaparser.resolution.types.ResolvedTypeVariable; 12aca49361c5886c83d70c1b5c774119332531190bmalte_langkabelimport com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade; 1303055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassettiimport com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory; 14cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassettiimport com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter; 1503055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassettiimport com.github.javaparser.symbolsolver.model.resolution.SymbolReference; 1603055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassettiimport com.github.javaparser.symbolsolver.model.resolution.TypeSolver; 17cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassettiimport com.github.javaparser.symbolsolver.model.resolution.Value; 1803055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassettiimport com.github.javaparser.symbolsolver.resolution.SymbolDeclarator; 1903055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti 20cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassettiimport java.util.List; 21cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassettiimport java.util.Optional; 22cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti 2303055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti/** 2403055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti * @author Federico Tomassetti 2503055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti */ 26cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassettipublic abstract class AbstractMethodLikeDeclarationContext 27cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti <T extends Node & NodeWithParameters<T> & NodeWithTypeParameters<T>> extends AbstractJavaParserContext<T> { 2803055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti 2903055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti public AbstractMethodLikeDeclarationContext(T wrappedNode, TypeSolver typeSolver) { 3003055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti super(wrappedNode, typeSolver); 3103055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti } 3203055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti 33223fc7650a7a3b89b43d81160f40326aaeaa98f1Federico Tomassetti public final SymbolReference<? extends ResolvedValueDeclaration> solveSymbol(String name, TypeSolver typeSolver) { 3403055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti for (Parameter parameter : wrappedNode.getParameters()) { 3503055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti SymbolDeclarator sb = JavaParserFactory.getSymbolDeclarator(parameter, typeSolver); 36223fc7650a7a3b89b43d81160f40326aaeaa98f1Federico Tomassetti SymbolReference<? extends ResolvedValueDeclaration> symbolReference = AbstractJavaParserContext.solveWith(sb, name); 3703055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti if (symbolReference.isSolved()) { 3803055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti return symbolReference; 3903055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti } 4003055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti } 4103055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti 4203055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti // if nothing is found we should ask the parent context 4303055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti return getParent().solveSymbol(name, typeSolver); 4403055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti } 45cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti 46cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti @Override 47223fc7650a7a3b89b43d81160f40326aaeaa98f1Federico Tomassetti public final Optional<ResolvedType> solveGenericType(String name, TypeSolver typeSolver) { 48cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti for (com.github.javaparser.ast.type.TypeParameter tp : wrappedNode.getTypeParameters()) { 4920dc81de34eccc02b31237e7090875ff0a46fc4eFederico Tomassetti if (tp.getName().getId().equals(name)) { 50223fc7650a7a3b89b43d81160f40326aaeaa98f1Federico Tomassetti return Optional.of(new ResolvedTypeVariable(new JavaParserTypeParameter(tp, typeSolver))); 51cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti } 52cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti } 53cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti return super.solveGenericType(name, typeSolver); 54cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti } 55cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti 56cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti @Override 57cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti public final Optional<Value> solveSymbolAsValue(String name, TypeSolver typeSolver) { 58cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti for (Parameter parameter : wrappedNode.getParameters()) { 59cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti SymbolDeclarator sb = JavaParserFactory.getSymbolDeclarator(parameter, typeSolver); 60cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti Optional<Value> symbolReference = solveWithAsValue(sb, name, typeSolver); 61cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti if (symbolReference.isPresent()) { 62cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti // Perform parameter type substitution as needed 63cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti return symbolReference; 64cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti } 65cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti } 66cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti 67cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti // if nothing is found we should ask the parent context 68cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti return getParent().solveSymbolAsValue(name, typeSolver); 69cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti } 70cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti 71cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti @Override 72223fc7650a7a3b89b43d81160f40326aaeaa98f1Federico Tomassetti public final SymbolReference<ResolvedTypeDeclaration> solveType(String name, TypeSolver typeSolver) { 73cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti if (wrappedNode.getTypeParameters() != null) { 74cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti for (com.github.javaparser.ast.type.TypeParameter tp : wrappedNode.getTypeParameters()) { 7520dc81de34eccc02b31237e7090875ff0a46fc4eFederico Tomassetti if (tp.getName().getId().equals(name)) { 76cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti return SymbolReference.solved(new JavaParserTypeParameter(tp, typeSolver)); 77cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti } 78cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti } 79cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti } 80aca49361c5886c83d70c1b5c774119332531190bmalte_langkabel 81aca49361c5886c83d70c1b5c774119332531190bmalte_langkabel // Local types 82b54617e765d73b3ce0d187cf12ad8da382bce439Danny van Bruggen List<com.github.javaparser.ast.body.TypeDeclaration> localTypes = wrappedNode.findAll( 83aca49361c5886c83d70c1b5c774119332531190bmalte_langkabel com.github.javaparser.ast.body.TypeDeclaration.class); 84aca49361c5886c83d70c1b5c774119332531190bmalte_langkabel for (com.github.javaparser.ast.body.TypeDeclaration<?> localType : localTypes) { 85aca49361c5886c83d70c1b5c774119332531190bmalte_langkabel if (localType.getName().getId().equals(name)) { 86aca49361c5886c83d70c1b5c774119332531190bmalte_langkabel return SymbolReference.solved(JavaParserFacade.get(typeSolver).getTypeDeclaration(localType)); 87aca49361c5886c83d70c1b5c774119332531190bmalte_langkabel } else if (name.startsWith(String.format("%s.", localType.getName()))) { 88aca49361c5886c83d70c1b5c774119332531190bmalte_langkabel return JavaParserFactory.getContext(localType, typeSolver).solveType( 89aca49361c5886c83d70c1b5c774119332531190bmalte_langkabel name.substring(localType.getName().getId().length() + 1), typeSolver); 90aca49361c5886c83d70c1b5c774119332531190bmalte_langkabel } 91aca49361c5886c83d70c1b5c774119332531190bmalte_langkabel } 92aca49361c5886c83d70c1b5c774119332531190bmalte_langkabel 93cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti return getParent().solveType(name, typeSolver); 94cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti } 95cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti 96cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti @Override 97223fc7650a7a3b89b43d81160f40326aaeaa98f1Federico Tomassetti public final SymbolReference<ResolvedMethodDeclaration> solveMethod( 98223fc7650a7a3b89b43d81160f40326aaeaa98f1Federico Tomassetti String name, List<ResolvedType> argumentsTypes, boolean staticOnly, TypeSolver typeSolver) { 9917ac5ada0476c72aa79a2e0c39311e90bfa0fe60xdrop return getParent().solveMethod(name, argumentsTypes, false, typeSolver); 100cc886c15f8553cb0c4d965b240b4688e58c2cc09Federico Tomassetti } 10103055f925053b3970b9d14cce3a3b9a0d002366dFederico Tomassetti} 102