Home | History | Annotate | Download | only in resolution
      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