diff options
Diffstat (limited to 'javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/JavaParserFactory.java')
-rw-r--r-- | javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/JavaParserFactory.java | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/JavaParserFactory.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/JavaParserFactory.java new file mode 100644 index 000000000..8bd3496fd --- /dev/null +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/JavaParserFactory.java @@ -0,0 +1,139 @@ +/* + * Copyright 2016 Federico Tomassetti + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.github.javaparser.symbolsolver.javaparsermodel; + +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.Node; +import com.github.javaparser.ast.body.*; +import com.github.javaparser.ast.expr.*; +import com.github.javaparser.ast.stmt.*; +import com.github.javaparser.ast.type.TypeParameter; +import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration; +import com.github.javaparser.symbolsolver.core.resolution.Context; +import com.github.javaparser.symbolsolver.javaparsermodel.contexts.*; +import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserAnnotationDeclaration; +import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserClassDeclaration; +import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserEnumDeclaration; +import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserInterfaceDeclaration; +import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter; +import com.github.javaparser.symbolsolver.javaparsermodel.declarators.FieldSymbolDeclarator; +import com.github.javaparser.symbolsolver.javaparsermodel.declarators.NoSymbolDeclarator; +import com.github.javaparser.symbolsolver.javaparsermodel.declarators.ParameterSymbolDeclarator; +import com.github.javaparser.symbolsolver.javaparsermodel.declarators.VariableSymbolDeclarator; +import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; +import com.github.javaparser.symbolsolver.resolution.SymbolDeclarator; + +import static com.github.javaparser.symbolsolver.javaparser.Navigator.getParentNode; +import static com.github.javaparser.symbolsolver.javaparser.Navigator.requireParentNode; + +/** + * @author Federico Tomassetti + */ +public class JavaParserFactory { + + public static Context getContext(Node node, TypeSolver typeSolver) { + if (node == null) { + throw new NullPointerException("Node should not be null"); + } else if (node instanceof CompilationUnit) { + return new CompilationUnitContext((CompilationUnit) node, typeSolver); + } else if (node instanceof ForeachStmt) { + return new ForechStatementContext((ForeachStmt) node, typeSolver); + } else if (node instanceof ForStmt) { + return new ForStatementContext((ForStmt) node, typeSolver); + } else if (node instanceof LambdaExpr) { + return new LambdaExprContext((LambdaExpr) node, typeSolver); + } else if (node instanceof MethodDeclaration) { + return new MethodContext((MethodDeclaration) node, typeSolver); + } else if (node instanceof ConstructorDeclaration) { + return new ConstructorContext((ConstructorDeclaration) node, typeSolver); + } else if (node instanceof ClassOrInterfaceDeclaration) { + return new ClassOrInterfaceDeclarationContext((ClassOrInterfaceDeclaration) node, typeSolver); + } else if (node instanceof MethodCallExpr) { + return new MethodCallExprContext((MethodCallExpr) node, typeSolver); + } else if (node instanceof EnumDeclaration) { + return new EnumDeclarationContext((EnumDeclaration) node, typeSolver); + } else if (node instanceof FieldAccessExpr) { + return new FieldAccessContext((FieldAccessExpr) node, typeSolver); + } else if (node instanceof SwitchEntryStmt) { + return new SwitchEntryContext((SwitchEntryStmt) node, typeSolver); + } else if (node instanceof TryStmt) { + return new TryWithResourceContext((TryStmt) node, typeSolver); + } else if (node instanceof Statement) { + return new StatementContext<>((Statement) node, typeSolver); + } else if (node instanceof CatchClause) { + return new CatchClauseContext((CatchClause) node, typeSolver); + } else if (node instanceof ObjectCreationExpr && + ((ObjectCreationExpr) node).getAnonymousClassBody().isPresent()) { + return new AnonymousClassDeclarationContext((ObjectCreationExpr) node, typeSolver); + } else { + if (node instanceof NameExpr) { + // to resolve a name when in a fieldAccess context, we can get to the grand parent to prevent a infinite loop if the name is the same as the field (ie x.x) + if (node.getParentNode().isPresent() && node.getParentNode().get() instanceof FieldAccessExpr && node.getParentNode().get().getParentNode().isPresent()) { + return getContext(node.getParentNode().get().getParentNode().get(), typeSolver); + } + } + final Node parentNode = requireParentNode(node); + if (parentNode instanceof ObjectCreationExpr && node == ((ObjectCreationExpr) parentNode).getType()) { + return getContext(requireParentNode(parentNode), typeSolver); + } + if (parentNode == null) { + throw new IllegalStateException("The AST node does not appear to be inserted in a propert AST, therefore we cannot resolve symbols correctly"); + } + return getContext(parentNode, typeSolver); + } + } + + public static SymbolDeclarator getSymbolDeclarator(Node node, TypeSolver typeSolver) { + if (node instanceof FieldDeclaration) { + return new FieldSymbolDeclarator((FieldDeclaration) node, typeSolver); + } else if (node instanceof Parameter) { + return new ParameterSymbolDeclarator((Parameter) node, typeSolver); + } else if (node instanceof ExpressionStmt) { + ExpressionStmt expressionStmt = (ExpressionStmt) node; + if (expressionStmt.getExpression() instanceof VariableDeclarationExpr) { + return new VariableSymbolDeclarator((VariableDeclarationExpr) (expressionStmt.getExpression()), typeSolver); + } else { + return new NoSymbolDeclarator<>(expressionStmt, typeSolver); + } + } else if (node instanceof IfStmt) { + return new NoSymbolDeclarator<>((IfStmt) node, typeSolver); + } else if (node instanceof ForeachStmt) { + ForeachStmt foreachStmt = (ForeachStmt) node; + return new VariableSymbolDeclarator(foreachStmt.getVariable(), typeSolver); + } else { + return new NoSymbolDeclarator<>(node, typeSolver); + } + } + + public static ResolvedReferenceTypeDeclaration toTypeDeclaration(Node node, TypeSolver typeSolver) { + if (node instanceof ClassOrInterfaceDeclaration) { + if (((ClassOrInterfaceDeclaration) node).isInterface()) { + return new JavaParserInterfaceDeclaration((ClassOrInterfaceDeclaration) node, typeSolver); + } else { + return new JavaParserClassDeclaration((ClassOrInterfaceDeclaration) node, typeSolver); + } + } else if (node instanceof TypeParameter) { + return new JavaParserTypeParameter((TypeParameter) node, typeSolver); + } else if (node instanceof EnumDeclaration) { + return new JavaParserEnumDeclaration((EnumDeclaration) node, typeSolver); + } else if (node instanceof AnnotationDeclaration) { + return new JavaParserAnnotationDeclaration((AnnotationDeclaration) node, typeSolver); + } else { + throw new IllegalArgumentException(node.getClass().getCanonicalName()); + } + } +} |