@Override public SymbolReference<? extends ResolvedValueDeclaration> solveSymbol(String name) { for (Parameter parameter : wrappedNode.getParameters()) { SymbolDeclarator sb = JavaParserFactory.getSymbolDeclarator(parameter, typeSolver); SymbolReference<ResolvedValueDeclaration> symbolReference = solveWith(sb, name); if (symbolReference.isSolved()) { return symbolReference; } } // if nothing is found we should ask the parent context return getParent().solveSymbol(name); }
MethodCallExpr methodCallExpr = (MethodCallExpr) getParentNode(wrappedNode); MethodUsage methodUsage = JavaParserFacade.get(typeSolver).solveMethodAsUsage(methodCallExpr); int i = pos(methodCallExpr, wrappedNode); ResolvedType lambdaType = methodUsage.getParamTypes().get(i); return getParent().solveSymbolAsValue(name, typeSolver);
return new ForStatementContext((ForStmt) node, typeSolver); } else if (node instanceof LambdaExpr) { return new LambdaExprContext((LambdaExpr) node, typeSolver); } else if (node instanceof MethodDeclaration) { return new MethodContext((MethodDeclaration) node, typeSolver);
@Override public SymbolReference<ResolvedMethodDeclaration> solveMethod( String name, List<ResolvedType> argumentsTypes, boolean staticOnly, TypeSolver typeSolver) { return getParent().solveMethod(name, argumentsTypes, false, typeSolver); }
MethodCallExpr methodCallExpr = (MethodCallExpr) getParentNode(wrappedNode); MethodUsage methodUsage = JavaParserFacade.get(typeSolver).solveMethodAsUsage(methodCallExpr); int i = pos(methodCallExpr, wrappedNode); ResolvedType lambdaType = methodUsage.getParamTypes().get(i); return getParent().solveSymbolAsValue(name, typeSolver);
return new ForStatementContext((ForStmt) node, typeSolver); } else if (node instanceof LambdaExpr) { return new LambdaExprContext((LambdaExpr) node, typeSolver); } else if (node instanceof MethodDeclaration) { return new MethodContext((MethodDeclaration) node, typeSolver);
@Override public SymbolReference<ResolvedMethodDeclaration> solveMethod( String name, List<ResolvedType> argumentsTypes, boolean staticOnly) { return getParent().solveMethod(name, argumentsTypes, false); }
@Override public SymbolReference<? extends ResolvedValueDeclaration> solveSymbol(String name, TypeSolver typeSolver) { for (Parameter parameter : wrappedNode.getParameters()) { SymbolDeclarator sb = JavaParserFactory.getSymbolDeclarator(parameter, typeSolver); SymbolReference<ResolvedValueDeclaration> symbolReference = solveWith(sb, name); if (symbolReference.isSolved()) { return symbolReference; } } // if nothing is found we should ask the parent context return getParent().solveSymbol(name, typeSolver); }
MethodCallExpr methodCallExpr = (MethodCallExpr) requireParentNode(wrappedNode); MethodUsage methodUsage = JavaParserFacade.get(typeSolver).solveMethodAsUsage(methodCallExpr); int i = pos(methodCallExpr, wrappedNode); ResolvedType lambdaType = methodUsage.getParamTypes().get(i); return getParent().solveSymbolAsValue(name);
return new ForStatementContext((ForStmt) node, typeSolver); } else if (node instanceof LambdaExpr) { return new LambdaExprContext((LambdaExpr) node, typeSolver); } else if (node instanceof MethodDeclaration) { return new MethodContext((MethodDeclaration) node, typeSolver);
@Override public SymbolReference<ResolvedTypeDeclaration> solveType(String name, TypeSolver typeSolver) { return getParent().solveType(name, typeSolver); }
@Override public SymbolReference<? extends ResolvedValueDeclaration> solveSymbol(String name, TypeSolver typeSolver) { for (Parameter parameter : wrappedNode.getParameters()) { SymbolDeclarator sb = JavaParserFactory.getSymbolDeclarator(parameter, typeSolver); SymbolReference<ResolvedValueDeclaration> symbolReference = solveWith(sb, name); if (symbolReference.isSolved()) { return symbolReference; } } // if nothing is found we should ask the parent context return getParent().solveSymbol(name, typeSolver); }
@Test public void solveParameterOfLambdaInMethodCallExpr() throws ParseException { CompilationUnit cu = parseSample("Lambda"); com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Agenda"); MethodDeclaration method = Navigator.demandMethod(clazz, "lambdaMap"); ReturnStmt returnStmt = Navigator.findReturnStmt(method); MethodCallExpr methodCallExpr = (MethodCallExpr) returnStmt.getExpression().get(); LambdaExpr lambdaExpr = (LambdaExpr) methodCallExpr.getArguments().get(0); Context context = new LambdaExprContext(lambdaExpr, typeSolver); Optional<Value> ref = context.solveSymbolAsValue("p", typeSolver); assertTrue(ref.isPresent()); assertEquals("? super java.lang.String", ref.get().getType().describe()); }
@Override public SymbolReference<ResolvedTypeDeclaration> solveType(String name) { return getParent().solveType(name); }
@Test public void solveParameterOfLambdaInFieldDecl() throws ParseException { CompilationUnit cu = parseSample("Lambda"); com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Agenda"); VariableDeclarator field = Navigator.demandField(clazz, "functional"); LambdaExpr lambdaExpr = (LambdaExpr) field.getInitializer().get(); File src = new File("src/test/resources"); CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver(); combinedTypeSolver.add(new ReflectionTypeSolver()); combinedTypeSolver.add(new JavaParserTypeSolver(adaptPath(src))); Context context = new LambdaExprContext(lambdaExpr, combinedTypeSolver); Optional<Value> ref = context.solveSymbolAsValue("p", typeSolver); assertTrue(ref.isPresent()); assertEquals("java.lang.String", ref.get().getType().describe()); }
@Override public SymbolReference<ResolvedMethodDeclaration> solveMethod( String name, List<ResolvedType> argumentsTypes, boolean staticOnly, TypeSolver typeSolver) { return getParent().solveMethod(name, argumentsTypes, false, typeSolver); }
@Test public void solveParameterOfLambdaInVarDecl() throws ParseException { CompilationUnit cu = parseSample("Lambda"); com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Agenda"); MethodDeclaration method = Navigator.demandMethod(clazz, "testFunctionalVar"); VariableDeclarator varDecl = Navigator.demandVariableDeclaration(method, "a"); LambdaExpr lambdaExpr = (LambdaExpr) varDecl.getInitializer().get(); File src = adaptPath(new File("src/test/resources")); CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver(); combinedTypeSolver.add(new ReflectionTypeSolver()); combinedTypeSolver.add(new JavaParserTypeSolver(src)); Context context = new LambdaExprContext(lambdaExpr, combinedTypeSolver); Optional<Value> ref = context.solveSymbolAsValue("p", typeSolver); assertTrue(ref.isPresent()); assertEquals("java.lang.String", ref.get().getType().describe()); } }
@Override public SymbolReference<ResolvedTypeDeclaration> solveType(String name, TypeSolver typeSolver) { return getParent().solveType(name, typeSolver); }