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.resolution; 18 19 import com.github.javaparser.ast.CompilationUnit; 20 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; 21 import com.github.javaparser.ast.body.MethodDeclaration; 22 import com.github.javaparser.ast.expr.Expression; 23 import com.github.javaparser.ast.expr.MethodCallExpr; 24 import com.github.javaparser.ast.expr.ThisExpr; 25 import com.github.javaparser.ast.stmt.ReturnStmt; 26 import com.github.javaparser.resolution.MethodUsage; 27 import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration; 28 import com.github.javaparser.resolution.types.ResolvedType; 29 import com.github.javaparser.symbolsolver.javaparser.Navigator; 30 import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade; 31 import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserAnonymousClassDeclaration; 32 import com.github.javaparser.symbolsolver.model.resolution.SymbolReference; 33 import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; 34 import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver; 35 import org.junit.Test; 36 37 import static org.junit.Assert.assertEquals; 38 39 public class MethodsResolutionTest extends AbstractResolutionTest { 40 41 @Test 42 public void solveMethodAccessThroughSuper() { 43 CompilationUnit cu = parseSample("AccessThroughSuper"); 44 com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "AccessThroughSuper.SubClass"); 45 MethodDeclaration method = Navigator.demandMethod(clazz, "methodTest"); 46 ReturnStmt returnStmt = (ReturnStmt) method.getBody().get().getStatements().get(0); 47 Expression expression = returnStmt.getExpression().get(); 48 49 ResolvedType ref = JavaParserFacade.get(new ReflectionTypeSolver()).getType(expression); 50 assertEquals("java.lang.String", ref.describe()); 51 } 52 53 @Test 54 public void solveMethodWithClassExpressionAsParameter() { 55 CompilationUnit cu = parseSample("ClassExpression"); 56 com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "ClassExpression"); 57 MethodDeclaration method = Navigator.demandMethod(clazz, "foo"); 58 MethodCallExpr expression = Navigator.findMethodCall(method, "noneOf").get(); 59 60 MethodUsage methodUsage = JavaParserFacade.get(new ReflectionTypeSolver()).solveMethodAsUsage(expression); 61 assertEquals("noneOf", methodUsage.getName()); 62 } 63 64 @Test 65 public void solveMethodInInterfaceParent() { 66 CompilationUnit cu = parseSample("MethodCalls"); 67 ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "MethodCalls"); 68 69 MethodDeclaration method = Navigator.demandMethod(clazz, "inheritedInterfaceMethod"); 70 MethodCallExpr expression = Navigator.findMethodCall(method, "toString").get(); 71 72 TypeSolver typeSolver = new ReflectionTypeSolver(); 73 74 JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver); 75 MethodUsage call1 = javaParserFacade.solveMethodAsUsage(expression); 76 assertEquals("java.lang.Object.toString()", call1.getQualifiedSignature()); 77 } 78 79 @Test 80 public void solveMethodWithTypePromotionsToLong() { 81 CompilationUnit cu = parseSample("Issue338"); 82 ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypePromotions"); 83 84 MethodDeclaration method = Navigator.demandMethod(clazz, "callingLong"); 85 86 { 87 MethodCallExpr expression = method.getBody().get().getStatements().get(0).asExpressionStmt().getExpression().asMethodCallExpr(); 88 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 89 assertEquals(true, reference.isSolved()); 90 assertEquals("longParam", reference.getCorrespondingDeclaration().getName()); 91 } 92 { 93 MethodCallExpr expression = method.getBody().get().getStatements().get(1).asExpressionStmt().getExpression().asMethodCallExpr(); 94 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 95 assertEquals(true, reference.isSolved()); 96 assertEquals("longParam", reference.getCorrespondingDeclaration().getName()); 97 } 98 { 99 MethodCallExpr expression = method.getBody().get().getStatements().get(2).asExpressionStmt().getExpression().asMethodCallExpr(); 100 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 101 assertEquals(true, reference.isSolved()); 102 assertEquals("longParam", reference.getCorrespondingDeclaration().getName()); 103 } 104 { 105 MethodCallExpr expression = method.getBody().get().getStatements().get(3).asExpressionStmt().getExpression().asMethodCallExpr(); 106 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 107 assertEquals(true, reference.isSolved()); 108 assertEquals("longParam", reference.getCorrespondingDeclaration().getName()); 109 } 110 111 } 112 113 @Test 114 public void solveMethodWithTypePromotionsToInt() { 115 CompilationUnit cu = parseSample("Issue338"); 116 ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypePromotions"); 117 118 MethodDeclaration method = Navigator.demandMethod(clazz, "callingInt"); 119 120 { 121 MethodCallExpr expression = method.getBody().get().getStatements().get(0).asExpressionStmt().getExpression().asMethodCallExpr(); 122 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 123 assertEquals(true, reference.isSolved()); 124 assertEquals("intParam", reference.getCorrespondingDeclaration().getName()); 125 } 126 { 127 MethodCallExpr expression = method.getBody().get().getStatements().get(1).asExpressionStmt().getExpression().asMethodCallExpr(); 128 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 129 assertEquals(true, reference.isSolved()); 130 assertEquals("intParam", reference.getCorrespondingDeclaration().getName()); 131 } 132 { 133 MethodCallExpr expression = method.getBody().get().getStatements().get(2).asExpressionStmt().getExpression().asMethodCallExpr(); 134 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 135 assertEquals(true, reference.isSolved()); 136 assertEquals("intParam", reference.getCorrespondingDeclaration().getName()); 137 } 138 { 139 MethodCallExpr expression = method.getBody().get().getStatements().get(3).asExpressionStmt().getExpression().asMethodCallExpr(); 140 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 141 assertEquals(false, reference.isSolved()); 142 } 143 144 } 145 146 @Test 147 public void solveMethodWithTypePromotionsToShort() { 148 CompilationUnit cu = parseSample("Issue338"); 149 ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypePromotions"); 150 151 MethodDeclaration method = Navigator.demandMethod(clazz, "callingShort"); 152 153 { 154 MethodCallExpr expression = method.getBody().get().getStatements().get(0).asExpressionStmt().getExpression().asMethodCallExpr(); 155 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 156 assertEquals(true, reference.isSolved()); 157 assertEquals("shortParam", reference.getCorrespondingDeclaration().getName()); 158 } 159 { 160 MethodCallExpr expression = method.getBody().get().getStatements().get(1).asExpressionStmt().getExpression().asMethodCallExpr(); 161 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 162 assertEquals(true, reference.isSolved()); 163 assertEquals("shortParam", reference.getCorrespondingDeclaration().getName()); 164 } 165 { 166 MethodCallExpr expression = method.getBody().get().getStatements().get(2).asExpressionStmt().getExpression().asMethodCallExpr(); 167 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 168 assertEquals(false, reference.isSolved()); 169 } 170 { 171 MethodCallExpr expression = method.getBody().get().getStatements().get(3).asExpressionStmt().getExpression().asMethodCallExpr(); 172 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 173 assertEquals(false, reference.isSolved()); 174 } 175 176 } 177 178 @Test 179 public void solveMethodWithTypePromotionsToByte() { 180 CompilationUnit cu = parseSample("Issue338"); 181 ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypePromotions"); 182 183 MethodDeclaration method = Navigator.demandMethod(clazz, "callingByte"); 184 185 { 186 MethodCallExpr expression = method.getBody().get().getStatements().get(0).asExpressionStmt().getExpression().asMethodCallExpr(); 187 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 188 assertEquals(true, reference.isSolved()); 189 assertEquals("byteParam", reference.getCorrespondingDeclaration().getName()); 190 } 191 { 192 MethodCallExpr expression = method.getBody().get().getStatements().get(1).asExpressionStmt().getExpression().asMethodCallExpr(); 193 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 194 assertEquals(false, reference.isSolved()); 195 } 196 { 197 MethodCallExpr expression = method.getBody().get().getStatements().get(2).asExpressionStmt().getExpression().asMethodCallExpr(); 198 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 199 assertEquals(false, reference.isSolved()); 200 } 201 { 202 MethodCallExpr expression = method.getBody().get().getStatements().get(3).asExpressionStmt().getExpression().asMethodCallExpr(); 203 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 204 assertEquals(false, reference.isSolved()); 205 } 206 207 } 208 209 @Test 210 public void solveMethodWithTypePromotionsToLongWithExtraParam() { 211 CompilationUnit cu = parseSample("Issue338"); 212 ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypePromotionsWithExtraParam"); 213 214 MethodDeclaration method = Navigator.demandMethod(clazz, "callingLong"); 215 216 { 217 MethodCallExpr expression = method.getBody().get().getStatements().get(0).asExpressionStmt().getExpression().asMethodCallExpr(); 218 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 219 assertEquals(true, reference.isSolved()); 220 assertEquals("longParam", reference.getCorrespondingDeclaration().getName()); 221 } 222 { 223 MethodCallExpr expression = method.getBody().get().getStatements().get(1).asExpressionStmt().getExpression().asMethodCallExpr(); 224 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 225 assertEquals(true, reference.isSolved()); 226 assertEquals("longParam", reference.getCorrespondingDeclaration().getName()); 227 } 228 { 229 MethodCallExpr expression = method.getBody().get().getStatements().get(2).asExpressionStmt().getExpression().asMethodCallExpr(); 230 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 231 assertEquals(true, reference.isSolved()); 232 assertEquals("longParam", reference.getCorrespondingDeclaration().getName()); 233 } 234 { 235 MethodCallExpr expression = method.getBody().get().getStatements().get(3).asExpressionStmt().getExpression().asMethodCallExpr(); 236 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 237 assertEquals(true, reference.isSolved()); 238 assertEquals("longParam", reference.getCorrespondingDeclaration().getName()); 239 } 240 241 } 242 243 @Test 244 public void solveMethodWithTypePromotionsToIntWithExtraParam() { 245 CompilationUnit cu = parseSample("Issue338"); 246 ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypePromotionsWithExtraParam"); 247 248 MethodDeclaration method = Navigator.demandMethod(clazz, "callingInt"); 249 250 { 251 MethodCallExpr expression = method.getBody().get().getStatements().get(0).asExpressionStmt().getExpression().asMethodCallExpr(); 252 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 253 assertEquals(true, reference.isSolved()); 254 assertEquals("intParam", reference.getCorrespondingDeclaration().getName()); 255 } 256 { 257 MethodCallExpr expression = method.getBody().get().getStatements().get(1).asExpressionStmt().getExpression().asMethodCallExpr(); 258 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 259 assertEquals(true, reference.isSolved()); 260 assertEquals("intParam", reference.getCorrespondingDeclaration().getName()); 261 } 262 { 263 MethodCallExpr expression = method.getBody().get().getStatements().get(2).asExpressionStmt().getExpression().asMethodCallExpr(); 264 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 265 assertEquals(true, reference.isSolved()); 266 assertEquals("intParam", reference.getCorrespondingDeclaration().getName()); 267 } 268 { 269 MethodCallExpr expression = method.getBody().get().getStatements().get(3).asExpressionStmt().getExpression().asMethodCallExpr(); 270 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 271 assertEquals(false, reference.isSolved()); 272 } 273 274 } 275 276 @Test 277 public void solveMethodWithTypePromotionsToShortWithExtraParam() { 278 CompilationUnit cu = parseSample("Issue338"); 279 ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypePromotionsWithExtraParam"); 280 281 MethodDeclaration method = Navigator.demandMethod(clazz, "callingShort"); 282 283 { 284 MethodCallExpr expression = method.getBody().get().getStatements().get(0).asExpressionStmt().getExpression().asMethodCallExpr(); 285 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 286 assertEquals(true, reference.isSolved()); 287 assertEquals("shortParam", reference.getCorrespondingDeclaration().getName()); 288 } 289 { 290 MethodCallExpr expression = method.getBody().get().getStatements().get(1).asExpressionStmt().getExpression().asMethodCallExpr(); 291 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 292 assertEquals(true, reference.isSolved()); 293 assertEquals("shortParam", reference.getCorrespondingDeclaration().getName()); 294 } 295 { 296 MethodCallExpr expression = method.getBody().get().getStatements().get(2).asExpressionStmt().getExpression().asMethodCallExpr(); 297 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 298 assertEquals(false, reference.isSolved()); 299 } 300 { 301 MethodCallExpr expression = method.getBody().get().getStatements().get(3).asExpressionStmt().getExpression().asMethodCallExpr(); 302 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 303 assertEquals(false, reference.isSolved()); 304 } 305 306 } 307 308 @Test 309 public void solveMethodWithTypePromotionsToByteWithExtraParam() { 310 CompilationUnit cu = parseSample("Issue338"); 311 ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TypePromotionsWithExtraParam"); 312 313 MethodDeclaration method = Navigator.demandMethod(clazz, "callingByte"); 314 315 { 316 MethodCallExpr expression = method.getBody().get().getStatements().get(0).asExpressionStmt().getExpression().asMethodCallExpr(); 317 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 318 assertEquals(true, reference.isSolved()); 319 assertEquals("byteParam", reference.getCorrespondingDeclaration().getName()); 320 } 321 { 322 MethodCallExpr expression = method.getBody().get().getStatements().get(1).asExpressionStmt().getExpression().asMethodCallExpr(); 323 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 324 assertEquals(false, reference.isSolved()); 325 } 326 { 327 MethodCallExpr expression = method.getBody().get().getStatements().get(2).asExpressionStmt().getExpression().asMethodCallExpr(); 328 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 329 assertEquals(false, reference.isSolved()); 330 } 331 { 332 MethodCallExpr expression = method.getBody().get().getStatements().get(3).asExpressionStmt().getExpression().asMethodCallExpr(); 333 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); 334 assertEquals(false, reference.isSolved()); 335 } 336 337 } 338 339 @Test 340 public void callOnThisInAnonymousClass() { 341 CompilationUnit cu = parseSample("ThisInAnonymousClass"); 342 ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Bar"); 343 344 MethodCallExpr fooCall = Navigator.findMethodCall(clazz, "foo").get(); 345 346 SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(fooCall); 347 assertEquals(true, reference.isSolved()); 348 } 349 350 @Test 351 public void thisInAnonymousClass() { 352 CompilationUnit cu = parseSample("ThisInAnonymousClass"); 353 ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Bar"); 354 355 ThisExpr thisExpression = Navigator.findNodeOfGivenClass(clazz, ThisExpr.class); 356 357 ResolvedType type = JavaParserFacade.get(new ReflectionTypeSolver()).getType(thisExpression); 358 assertEquals(true, type.isReferenceType()); 359 assertEquals(true, type.asReferenceType().getTypeDeclaration() instanceof JavaParserAnonymousClassDeclaration); 360 } 361 } 362