aboutsummaryrefslogtreecommitdiff
path: root/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/AbstractMethodLikeDeclarationContext.java
diff options
context:
space:
mode:
Diffstat (limited to 'javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/AbstractMethodLikeDeclarationContext.java')
-rw-r--r--javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/AbstractMethodLikeDeclarationContext.java101
1 files changed, 101 insertions, 0 deletions
diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/AbstractMethodLikeDeclarationContext.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/AbstractMethodLikeDeclarationContext.java
new file mode 100644
index 000000000..d611d71a5
--- /dev/null
+++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/AbstractMethodLikeDeclarationContext.java
@@ -0,0 +1,101 @@
+package com.github.javaparser.symbolsolver.javaparsermodel.contexts;
+
+import com.github.javaparser.ast.Node;
+import com.github.javaparser.ast.body.Parameter;
+import com.github.javaparser.ast.nodeTypes.NodeWithParameters;
+import com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters;
+import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration;
+import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
+import com.github.javaparser.resolution.types.ResolvedType;
+import com.github.javaparser.resolution.types.ResolvedTypeVariable;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
+import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory;
+import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter;
+import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
+import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
+import com.github.javaparser.symbolsolver.model.resolution.Value;
+import com.github.javaparser.symbolsolver.resolution.SymbolDeclarator;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author Federico Tomassetti
+ */
+public abstract class AbstractMethodLikeDeclarationContext
+ <T extends Node & NodeWithParameters<T> & NodeWithTypeParameters<T>> extends AbstractJavaParserContext<T> {
+
+ public AbstractMethodLikeDeclarationContext(T wrappedNode, TypeSolver typeSolver) {
+ super(wrappedNode, typeSolver);
+ }
+
+ public final SymbolReference<? extends ResolvedValueDeclaration> solveSymbol(String name, TypeSolver typeSolver) {
+ for (Parameter parameter : wrappedNode.getParameters()) {
+ SymbolDeclarator sb = JavaParserFactory.getSymbolDeclarator(parameter, typeSolver);
+ SymbolReference<? extends ResolvedValueDeclaration> symbolReference = AbstractJavaParserContext.solveWith(sb, name);
+ if (symbolReference.isSolved()) {
+ return symbolReference;
+ }
+ }
+
+ // if nothing is found we should ask the parent context
+ return getParent().solveSymbol(name, typeSolver);
+ }
+
+ @Override
+ public final Optional<ResolvedType> solveGenericType(String name, TypeSolver typeSolver) {
+ for (com.github.javaparser.ast.type.TypeParameter tp : wrappedNode.getTypeParameters()) {
+ if (tp.getName().getId().equals(name)) {
+ return Optional.of(new ResolvedTypeVariable(new JavaParserTypeParameter(tp, typeSolver)));
+ }
+ }
+ return super.solveGenericType(name, typeSolver);
+ }
+
+ @Override
+ public final Optional<Value> solveSymbolAsValue(String name, TypeSolver typeSolver) {
+ for (Parameter parameter : wrappedNode.getParameters()) {
+ SymbolDeclarator sb = JavaParserFactory.getSymbolDeclarator(parameter, typeSolver);
+ Optional<Value> symbolReference = solveWithAsValue(sb, name, typeSolver);
+ if (symbolReference.isPresent()) {
+ // Perform parameter type substitution as needed
+ return symbolReference;
+ }
+ }
+
+ // if nothing is found we should ask the parent context
+ return getParent().solveSymbolAsValue(name, typeSolver);
+ }
+
+ @Override
+ public final SymbolReference<ResolvedTypeDeclaration> solveType(String name, TypeSolver typeSolver) {
+ if (wrappedNode.getTypeParameters() != null) {
+ for (com.github.javaparser.ast.type.TypeParameter tp : wrappedNode.getTypeParameters()) {
+ if (tp.getName().getId().equals(name)) {
+ return SymbolReference.solved(new JavaParserTypeParameter(tp, typeSolver));
+ }
+ }
+ }
+
+ // Local types
+ List<com.github.javaparser.ast.body.TypeDeclaration> localTypes = wrappedNode.findAll(
+ com.github.javaparser.ast.body.TypeDeclaration.class);
+ for (com.github.javaparser.ast.body.TypeDeclaration<?> localType : localTypes) {
+ if (localType.getName().getId().equals(name)) {
+ return SymbolReference.solved(JavaParserFacade.get(typeSolver).getTypeDeclaration(localType));
+ } else if (name.startsWith(String.format("%s.", localType.getName()))) {
+ return JavaParserFactory.getContext(localType, typeSolver).solveType(
+ name.substring(localType.getName().getId().length() + 1), typeSolver);
+ }
+ }
+
+ return getParent().solveType(name, typeSolver);
+ }
+
+ @Override
+ public final SymbolReference<ResolvedMethodDeclaration> solveMethod(
+ String name, List<ResolvedType> argumentsTypes, boolean staticOnly, TypeSolver typeSolver) {
+ return getParent().solveMethod(name, argumentsTypes, false, typeSolver);
+ }
+}