/* * 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.contexts; import com.github.javaparser.ast.stmt.Statement; import com.github.javaparser.ast.stmt.SwitchEntryStmt; import com.github.javaparser.ast.stmt.SwitchStmt; import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration; import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration; import com.github.javaparser.resolution.types.ResolvedType; import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade; import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory; import com.github.javaparser.symbolsolver.model.resolution.SymbolReference; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl; import com.github.javaparser.symbolsolver.resolution.SymbolDeclarator; import java.util.List; import static com.github.javaparser.symbolsolver.javaparser.Navigator.requireParentNode; /** * @author Federico Tomassetti */ public class SwitchEntryContext extends AbstractJavaParserContext { public SwitchEntryContext(SwitchEntryStmt wrappedNode, TypeSolver typeSolver) { super(wrappedNode, typeSolver); } @Override public SymbolReference solveSymbol(String name, TypeSolver typeSolver) { SwitchStmt switchStmt = (SwitchStmt) requireParentNode(wrappedNode); ResolvedType type = JavaParserFacade.get(typeSolver).getType(switchStmt.getSelector()); if (type.isReferenceType() && type.asReferenceType().getTypeDeclaration().isEnum()) { if (type instanceof ReferenceTypeImpl) { ReferenceTypeImpl typeUsageOfTypeDeclaration = (ReferenceTypeImpl) type; if (typeUsageOfTypeDeclaration.getTypeDeclaration().hasField(name)) { return SymbolReference.solved(typeUsageOfTypeDeclaration.getTypeDeclaration().getField(name)); } } else { throw new UnsupportedOperationException(); } } // look for declaration in other switch statements for (SwitchEntryStmt seStmt : switchStmt.getEntries()) { if (!seStmt.equals(wrappedNode)) { for (Statement stmt : seStmt.getStatements()) { SymbolDeclarator symbolDeclarator = JavaParserFactory.getSymbolDeclarator(stmt, typeSolver); SymbolReference symbolReference = solveWith(symbolDeclarator, name); if (symbolReference.isSolved()) { return symbolReference; } } } } return getParent().solveSymbol(name, typeSolver); } @Override public SymbolReference solveMethod(String name, List argumentsTypes, boolean staticOnly, TypeSolver typeSolver) { return getParent().solveMethod(name, argumentsTypes, false, typeSolver); } }