1 /* 2 * Copyright 2016 Federico Tomassetti 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.github.javaparser.symbolsolver.javaparsermodel.contexts; 18 19 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; 20 import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration; 21 import com.github.javaparser.resolution.declarations.*; 22 import com.github.javaparser.resolution.types.ResolvedType; 23 import com.github.javaparser.resolution.types.ResolvedTypeVariable; 24 import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade; 25 import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter; 26 import com.github.javaparser.symbolsolver.model.resolution.SymbolReference; 27 import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; 28 import com.github.javaparser.symbolsolver.model.resolution.Value; 29 30 import java.util.List; 31 import java.util.Optional; 32 33 /** 34 * @author Federico Tomassetti 35 */ 36 public class ClassOrInterfaceDeclarationContext extends AbstractJavaParserContext<ClassOrInterfaceDeclaration> { 37 38 private JavaParserTypeDeclarationAdapter javaParserTypeDeclarationAdapter; 39 40 /// 41 /// Constructors 42 /// 43 44 public ClassOrInterfaceDeclarationContext(ClassOrInterfaceDeclaration wrappedNode, TypeSolver typeSolver) { 45 super(wrappedNode, typeSolver); 46 this.javaParserTypeDeclarationAdapter = new JavaParserTypeDeclarationAdapter(wrappedNode, typeSolver, 47 getDeclaration(), this); 48 } 49 50 /// 51 /// Public methods 52 /// 53 54 @Override 55 public SymbolReference<? extends ResolvedValueDeclaration> solveSymbol(String name, TypeSolver typeSolver) { 56 if (typeSolver == null) throw new IllegalArgumentException(); 57 58 if (this.getDeclaration().hasVisibleField(name)) { 59 return SymbolReference.solved(this.getDeclaration().getVisibleField(name)); 60 } 61 62 // then to parent 63 return getParent().solveSymbol(name, typeSolver); 64 } 65 66 @Override 67 public Optional<Value> solveSymbolAsValue(String name, TypeSolver typeSolver) { 68 if (typeSolver == null) throw new IllegalArgumentException(); 69 70 if (this.getDeclaration().hasVisibleField(name)) { 71 return Optional.of(Value.from(this.getDeclaration().getVisibleField(name))); 72 } 73 74 // then to parent 75 return getParent().solveSymbolAsValue(name, typeSolver); 76 } 77 78 @Override 79 public Optional<ResolvedType> solveGenericType(String name, TypeSolver typeSolver) { 80 for (com.github.javaparser.ast.type.TypeParameter tp : wrappedNode.getTypeParameters()) { 81 if (tp.getName().getId().equals(name)) { 82 return Optional.of(new ResolvedTypeVariable(new JavaParserTypeParameter(tp, typeSolver))); 83 } 84 } 85 return getParent().solveGenericType(name, typeSolver); 86 } 87 88 @Override 89 public SymbolReference<ResolvedTypeDeclaration> solveType(String name, TypeSolver typeSolver) { 90 return javaParserTypeDeclarationAdapter.solveType(name, typeSolver); 91 } 92 93 @Override 94 public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<ResolvedType> argumentsTypes, boolean staticOnly, TypeSolver typeSolver) { 95 return javaParserTypeDeclarationAdapter.solveMethod(name, argumentsTypes, staticOnly, typeSolver); 96 } 97 98 public SymbolReference<ResolvedConstructorDeclaration> solveConstructor(List<ResolvedType> argumentsTypes, TypeSolver typeSolver) { 99 return javaParserTypeDeclarationAdapter.solveConstructor(argumentsTypes, typeSolver); 100 } 101 102 /// 103 /// Private methods 104 /// 105 106 private ResolvedReferenceTypeDeclaration getDeclaration() { 107 return JavaParserFacade.get(typeSolver).getTypeDeclaration(this.wrappedNode); 108 } 109 } 110