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