diff options
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.java | 101 |
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); + } +} |