JavaParserFactory.java revision 2eb011fa9f43f30e3cb8bcad8c40520bb80437c7
1683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti/* 2683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * Copyright 2016 Federico Tomassetti 3683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * 4683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * Licensed under the Apache License, Version 2.0 (the "License"); 5683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * you may not use this file except in compliance with the License. 6683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * You may obtain a copy of the License at 7683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * 8683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * http://www.apache.org/licenses/LICENSE-2.0 9683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * 10683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * Unless required by applicable law or agreed to in writing, software 11683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * distributed under the License is distributed on an "AS IS" BASIS, 12683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * See the License for the specific language governing permissions and 14683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti * limitations under the License. 15683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti */ 16683012de2a3a28358e848f8b145d462eb8b322baFederico Tomassetti 179c53c2cbc607ea694438ade8630be0c155a33162Federico Tomassettipackage com.github.javaparser.symbolsolver.javaparsermodel; 18d787c16867577551b1711d01f382a26af1d7a322Federico Tomassetti 1949719b4acbe10e3714ceb4f7040acac34709f558Federico Tomassettiimport com.github.javaparser.ast.CompilationUnit; 2049719b4acbe10e3714ceb4f7040acac34709f558Federico Tomassettiimport com.github.javaparser.ast.Node; 21d787c16867577551b1711d01f382a26af1d7a322Federico Tomassettiimport com.github.javaparser.ast.body.*; 22cb5ffb7fdd56f1b768d25da330fa3b29ecb74eafFederico Tomassettiimport com.github.javaparser.ast.expr.*; 23d787c16867577551b1711d01f382a26af1d7a322Federico Tomassettiimport com.github.javaparser.ast.stmt.*; 241e7780e554428a10c73de88ca64e5933b2291593Federico Tomassettiimport com.github.javaparser.symbolsolver.core.resolution.Context; 259c53c2cbc607ea694438ade8630be0c155a33162Federico Tomassettiimport com.github.javaparser.symbolsolver.javaparsermodel.contexts.*; 269c53c2cbc607ea694438ade8630be0c155a33162Federico Tomassettiimport com.github.javaparser.symbolsolver.javaparsermodel.declarators.FieldSymbolDeclarator; 279c53c2cbc607ea694438ade8630be0c155a33162Federico Tomassettiimport com.github.javaparser.symbolsolver.javaparsermodel.declarators.NoSymbolDeclarator; 289c53c2cbc607ea694438ade8630be0c155a33162Federico Tomassettiimport com.github.javaparser.symbolsolver.javaparsermodel.declarators.ParameterSymbolDeclarator; 291e7780e554428a10c73de88ca64e5933b2291593Federico Tomassettiimport com.github.javaparser.symbolsolver.javaparsermodel.declarators.VariableSymbolDeclarator; 301e7780e554428a10c73de88ca64e5933b2291593Federico Tomassettiimport com.github.javaparser.symbolsolver.model.resolution.TypeSolver; 311e7780e554428a10c73de88ca64e5933b2291593Federico Tomassettiimport com.github.javaparser.symbolsolver.resolution.SymbolDeclarator; 32d787c16867577551b1711d01f382a26af1d7a322Federico Tomassetti 3399c0277ff34b0d97af1019ac91f20a19db364410Federico Tomassettiimport static com.github.javaparser.symbolsolver.javaparser.Navigator.getParentNode; 343e4b012ca278ee33e9e02984367028cb1adf4bf5Federico Tomassetti 35c746c4ef7711a05c27827ab749d96155046a4f91Federico Tomassetti/** 36c746c4ef7711a05c27827ab749d96155046a4f91Federico Tomassetti * @author Federico Tomassetti 37c746c4ef7711a05c27827ab749d96155046a4f91Federico Tomassetti */ 38d787c16867577551b1711d01f382a26af1d7a322Federico Tomassettipublic class JavaParserFactory { 39d787c16867577551b1711d01f382a26af1d7a322Federico Tomassetti 4049719b4acbe10e3714ceb4f7040acac34709f558Federico Tomassetti public static Context getContext(Node node, TypeSolver typeSolver) { 41c1e95efcb4b0a373530aa107edb2164bf6c21ac7Federico Tomassetti if (node == null) { 42c1e95efcb4b0a373530aa107edb2164bf6c21ac7Federico Tomassetti return null; 43c1e95efcb4b0a373530aa107edb2164bf6c21ac7Federico Tomassetti } else if (node instanceof CompilationUnit) { 4449719b4acbe10e3714ceb4f7040acac34709f558Federico Tomassetti return new CompilationUnitContext((CompilationUnit) node, typeSolver); 45bac18a129c45335e69d811b3872fcb938e1f0ff8Federico Tomassetti } else if (node instanceof ForeachStmt) { 4649719b4acbe10e3714ceb4f7040acac34709f558Federico Tomassetti return new ForechStatementContext((ForeachStmt) node, typeSolver); 47bac18a129c45335e69d811b3872fcb938e1f0ff8Federico Tomassetti } else if (node instanceof ForStmt) { 4849719b4acbe10e3714ceb4f7040acac34709f558Federico Tomassetti return new ForStatementContext((ForStmt) node, typeSolver); 4949719b4acbe10e3714ceb4f7040acac34709f558Federico Tomassetti } else if (node instanceof LambdaExpr) { 500e81f51c40996b42cb262dc2397126cee8f60965Federico Tomassetti return new LambdaExprContext((LambdaExpr) node, typeSolver); 51d787c16867577551b1711d01f382a26af1d7a322Federico Tomassetti } else if (node instanceof MethodDeclaration) { 5249719b4acbe10e3714ceb4f7040acac34709f558Federico Tomassetti return new MethodContext((MethodDeclaration) node, typeSolver); 53ee35b15a04539af508d29081ac5c7f8f6fadba4aFederico Tomassetti } else if (node instanceof ConstructorDeclaration) { 5449719b4acbe10e3714ceb4f7040acac34709f558Federico Tomassetti return new ConstructorContext((ConstructorDeclaration) node, typeSolver); 55d787c16867577551b1711d01f382a26af1d7a322Federico Tomassetti } else if (node instanceof ClassOrInterfaceDeclaration) { 5649719b4acbe10e3714ceb4f7040acac34709f558Federico Tomassetti return new ClassOrInterfaceDeclarationContext((ClassOrInterfaceDeclaration) node, typeSolver); 572f49331fb22511346eea8800d27907de44409d5bFederico Tomassetti } else if (node instanceof MethodCallExpr) { 5849719b4acbe10e3714ceb4f7040acac34709f558Federico Tomassetti return new MethodCallExprContext((MethodCallExpr) node, typeSolver); 59d787c16867577551b1711d01f382a26af1d7a322Federico Tomassetti } else if (node instanceof EnumDeclaration) { 6049719b4acbe10e3714ceb4f7040acac34709f558Federico Tomassetti return new EnumDeclarationContext((EnumDeclaration) node, typeSolver); 6180f951258992f75441239c79e0f31eda7d47e107Federico Tomassetti } else if (node instanceof FieldAccessExpr) { 620e81f51c40996b42cb262dc2397126cee8f60965Federico Tomassetti return new FieldAccessContext((FieldAccessExpr) node, typeSolver); 63d0348de241a6cf6be9c51500870ee1fb26172101Federico Tomassetti } else if (node instanceof SwitchEntryStmt) { 640e81f51c40996b42cb262dc2397126cee8f60965Federico Tomassetti return new SwitchEntryContext((SwitchEntryStmt) node, typeSolver); 650317a878f854ddf986b70febd30d3c209ae49150Federico Tomassetti } else if (node instanceof TryStmt) { 660317a878f854ddf986b70febd30d3c209ae49150Federico Tomassetti return new TryWithResourceContext((TryStmt) node, typeSolver); 67bac18a129c45335e69d811b3872fcb938e1f0ff8Federico Tomassetti } else if (node instanceof Statement) { 68cb5ffb7fdd56f1b768d25da330fa3b29ecb74eafFederico Tomassetti return new StatementContext<Statement>((Statement) node, typeSolver); 69c990d23490f5c4ac4322119b03d5951b63eef055Fred Lefévère-Laoide } else if (node instanceof CatchClause) { 70cb5ffb7fdd56f1b768d25da330fa3b29ecb74eafFederico Tomassetti return new CatchClauseContext((CatchClause) node, typeSolver); 712eb011fa9f43f30e3cb8bcad8c40520bb80437c7Enno Boland } else if (node instanceof ObjectCreationExpr && 722eb011fa9f43f30e3cb8bcad8c40520bb80437c7Enno Boland ((ObjectCreationExpr) node).getAnonymousClassBody().isPresent()) { 732eb011fa9f43f30e3cb8bcad8c40520bb80437c7Enno Boland return new AnonymousClassDeclarationContext((ObjectCreationExpr) node, typeSolver); 74d787c16867577551b1711d01f382a26af1d7a322Federico Tomassetti } else { 75cb5ffb7fdd56f1b768d25da330fa3b29ecb74eafFederico Tomassetti if (node instanceof NameExpr) { 76cb5ffb7fdd56f1b768d25da330fa3b29ecb74eafFederico Tomassetti // 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) 77cb5ffb7fdd56f1b768d25da330fa3b29ecb74eafFederico Tomassetti if (node.getParentNode().isPresent() && node.getParentNode().get() instanceof FieldAccessExpr && node.getParentNode().get().getParentNode().isPresent()) { 78cb5ffb7fdd56f1b768d25da330fa3b29ecb74eafFederico Tomassetti return getContext(node.getParentNode().get().getParentNode().get(), typeSolver); 79cb5ffb7fdd56f1b768d25da330fa3b29ecb74eafFederico Tomassetti } 80c990d23490f5c4ac4322119b03d5951b63eef055Fred Lefévère-Laoide } 81150cf7cfd77ccfcf18384cacf4c03cd3dc6308d3Enno Boland final Node parentNode = getParentNode(node); 82150cf7cfd77ccfcf18384cacf4c03cd3dc6308d3Enno Boland if(parentNode instanceof ObjectCreationExpr && node == ((ObjectCreationExpr) parentNode).getType()) { 83150cf7cfd77ccfcf18384cacf4c03cd3dc6308d3Enno Boland return getContext(getParentNode(parentNode), typeSolver); 84150cf7cfd77ccfcf18384cacf4c03cd3dc6308d3Enno Boland } 85150cf7cfd77ccfcf18384cacf4c03cd3dc6308d3Enno Boland return getContext(parentNode, typeSolver); 86d787c16867577551b1711d01f382a26af1d7a322Federico Tomassetti } 87d787c16867577551b1711d01f382a26af1d7a322Federico Tomassetti } 88d787c16867577551b1711d01f382a26af1d7a322Federico Tomassetti 8949719b4acbe10e3714ceb4f7040acac34709f558Federico Tomassetti public static SymbolDeclarator getSymbolDeclarator(Node node, TypeSolver typeSolver) { 90c8d91389efa6f0d989d1b7d1e1aebec9d04106e7Federico Tomassetti if (node instanceof FieldDeclaration) { 912f49331fb22511346eea8800d27907de44409d5bFederico Tomassetti return new FieldSymbolDeclarator((FieldDeclaration) node, typeSolver); 92b931fdff234a0313a34e920059c1f5135fdd5204Federico Tomassetti } else if (node instanceof Parameter) { 932f49331fb22511346eea8800d27907de44409d5bFederico Tomassetti return new ParameterSymbolDeclarator((Parameter) node, typeSolver); 9452ce3a035f37392b37e54c9c7d9b003356d77643Federico Tomassetti } else if (node instanceof ExpressionStmt) { 956c297529e31036058837adbaa57cee652d4cc918Federico Tomassetti ExpressionStmt expressionStmt = (ExpressionStmt) node; 9652ce3a035f37392b37e54c9c7d9b003356d77643Federico Tomassetti if (expressionStmt.getExpression() instanceof VariableDeclarationExpr) { 976c297529e31036058837adbaa57cee652d4cc918Federico Tomassetti return new VariableSymbolDeclarator((VariableDeclarationExpr) (expressionStmt.getExpression()), typeSolver); 9852ce3a035f37392b37e54c9c7d9b003356d77643Federico Tomassetti } else { 99c990d23490f5c4ac4322119b03d5951b63eef055Fred Lefévère-Laoide return new NoSymbolDeclarator<ExpressionStmt>(expressionStmt, typeSolver); 10052ce3a035f37392b37e54c9c7d9b003356d77643Federico Tomassetti } 1016c297529e31036058837adbaa57cee652d4cc918Federico Tomassetti } else if (node instanceof IfStmt) { 102c990d23490f5c4ac4322119b03d5951b63eef055Fred Lefévère-Laoide return new NoSymbolDeclarator<IfStmt>((IfStmt) node, typeSolver); 103bac18a129c45335e69d811b3872fcb938e1f0ff8Federico Tomassetti } else if (node instanceof ForeachStmt) { 10449719b4acbe10e3714ceb4f7040acac34709f558Federico Tomassetti ForeachStmt foreachStmt = (ForeachStmt) node; 105bac18a129c45335e69d811b3872fcb938e1f0ff8Federico Tomassetti return new VariableSymbolDeclarator((VariableDeclarationExpr) (foreachStmt.getVariable()), typeSolver); 106c8d91389efa6f0d989d1b7d1e1aebec9d04106e7Federico Tomassetti } else { 107c990d23490f5c4ac4322119b03d5951b63eef055Fred Lefévère-Laoide return new NoSymbolDeclarator<Node>(node, typeSolver); 108c8d91389efa6f0d989d1b7d1e1aebec9d04106e7Federico Tomassetti } 109d787c16867577551b1711d01f382a26af1d7a322Federico Tomassetti } 110d787c16867577551b1711d01f382a26af1d7a322Federico Tomassetti 111d787c16867577551b1711d01f382a26af1d7a322Federico Tomassetti} 112