@Override public void visit(BlockStmt n, Void arg) { out.println("BlockStmt: " + (extended ? n : n.getStatements().size() + " statements")); super.visit(n, arg); }
@Override public void visit(BlockStmt n, Object ignore) { Iterator<Statement> it = n.getStatements().iterator(); while (it.hasNext()) { if (it.next() instanceof EmptyStmt) { it.remove(); } } super.visit(n, ignore); }
/** * Unwrap (possibly nested) 1 statement blocks * @param stmt - * @return unwrapped (non- block) statement */ private Statement getStmtFromStmt(Statement stmt) { while (stmt instanceof BlockStmt) { NodeList<Statement> stmts = ((BlockStmt) stmt).getStatements(); if (stmts.size() == 1) { stmt = stmts.get(0); continue; } return null; } return stmt; }
@Override public Boolean visit(BlockStmt n, Void arg) { // An empty block that is not a switch block can complete normally iff it is reachable if (n.isEmpty() && !parentIs(statement, SwitchStmt.class)) { return isReachable(statement); } // A non-empty block that is not a switch block can complete normally iff the last statement in // it can complete normally. if (!n.isEmpty() && !parentIs(statement, SwitchStmt.class)) { return canCompleteNormally(n.getStatement(n.getStatements().size() - 1)); } throw new UnsupportedOperationException(); }
@Override public Boolean visit(BlockStmt n, Void arg) { // An empty block that is not a switch block can complete normally iff it is reachable if (n.isEmpty() && !parentIs(statement, SwitchStmt.class)) { return isReachable(statement); } // A non-empty block that is not a switch block can complete normally iff the last statement in // it can complete normally. if (!n.isEmpty() && !parentIs(statement, SwitchStmt.class)) { return canCompleteNormally(n.getStatement(n.getStatements().size() - 1)); } throw new UnsupportedOperationException(); }
@Override public Boolean visit(BlockStmt n, Void arg) { // An empty block that is not a switch block can complete normally iff it is reachable if (n.isEmpty() && !parentIs(statement, SwitchStmt.class)) { return isReachable(statement); } // A non-empty block that is not a switch block can complete normally iff the last statement in // it can complete normally. if (!n.isEmpty() && !parentIs(statement, SwitchStmt.class)) { return canCompleteNormally(n.getStatement(n.getStatements().size() - 1)); } throw new UnsupportedOperationException(); }
@Test public void accessEnumMethodThroughThis() throws ParseException { CompilationUnit cu = parseSample("AccessEnumMemberThroughThis"); com.github.javaparser.ast.body.EnumDeclaration enumDecl = Navigator.demandEnum(cu, "AccessEnumMemberThroughThis"); MethodDeclaration method = Navigator.demandMethod(enumDecl, "getLabel2"); ReturnStmt returnStmt = (ReturnStmt) method.getBody().get().getStatements().get(0); Expression expression = returnStmt.getExpression().get(); ResolvedType ref = JavaParserFacade.get(new ReflectionTypeSolver()).getType(expression); assertEquals("java.lang.String", ref.describe()); }
@Test public void solveMethodAccessThroughSuper() throws ParseException { CompilationUnit cu = parseSample("AccessThroughSuper"); com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "AccessThroughSuper.SubClass"); MethodDeclaration method = Navigator.demandMethod(clazz, "methodTest"); ReturnStmt returnStmt = (ReturnStmt) method.getBody().get().getStatements().get(0); Expression expression = returnStmt.getExpression().get(); ResolvedType ref = JavaParserFacade.get(new ReflectionTypeSolver()).getType(expression); assertEquals("java.lang.String", ref.describe()); }
@Test public void accessClassFieldThroughThis() throws ParseException { CompilationUnit cu = parseSample("AccessClassMemberThroughThis"); com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "AccessClassMemberThroughThis"); MethodDeclaration method = Navigator.demandMethod(clazz, "getLabel2"); ReturnStmt returnStmt = (ReturnStmt) method.getBody().get().getStatements().get(0); Expression expression = returnStmt.getExpression().get(); ResolvedType ref = JavaParserFacade.get(new ReflectionTypeSolver()).getType(expression); assertEquals("java.lang.String", ref.describe()); }
@Test public void accessFieldThroughSuper() throws ParseException { CompilationUnit cu = parseSample("AccessThroughSuper"); com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "AccessThroughSuper.SubClass"); MethodDeclaration method = Navigator.demandMethod(clazz, "fieldTest"); ReturnStmt returnStmt = (ReturnStmt) method.getBody().get().getStatements().get(0); Expression expression = returnStmt.getExpression().get(); ResolvedType ref = JavaParserFacade.get(new ReflectionTypeSolver()).getType(expression); assertEquals("java.lang.String", ref.describe()); } }
@Test public void issue7() throws ParseException { CompilationUnit cu = parseSample("Generics_issue7"); ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "SomeCollection"); MethodDeclaration method = Navigator.demandMethod(clazz, "foo3"); ReturnStmt stmt = (ReturnStmt) method.getBody().get().getStatements().get(0); Expression expression = stmt.getExpression().get(); JavaParserFacade javaParserFacade = JavaParserFacade.get(new ReflectionTypeSolver()); ResolvedType type = javaParserFacade.getType(expression); assertEquals(true, type.isReferenceType()); assertEquals(List.class.getCanonicalName(), type.asReferenceType().getQualifiedName()); assertEquals("java.util.List<java.lang.Long>", type.describe()); }
@Test public void testSolveStaticallyImportedMemberType() throws ParseException { CompilationUnit cu = parseSample("Issue251"); ClassOrInterfaceDeclaration cls = Navigator.demandClassOrInterface(cu, "Main"); TypeSolver typeSolver = new ReflectionTypeSolver(); JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver); MethodDeclaration m = Navigator.demandMethod(cls, "bar"); ExpressionStmt stmt = (ExpressionStmt) m.getBody().get().getStatements().get(1); MethodCallExpr expression = (MethodCallExpr) stmt.getExpression(); Assert.assertNotNull(javaParserFacade.solve(expression)); } }
@Test public void typeDeclarationSuperClassImplicitlyIncludeObject() throws ParseException { CompilationUnit cu = parseSample("Issue18"); ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Foo"); MethodDeclaration methodDeclaration = Navigator.demandMethod(clazz, "bar"); ExpressionStmt expr = (ExpressionStmt) methodDeclaration.getBody().get().getStatements().get(1); TypeSolver typeSolver = new ReflectionTypeSolver(); JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver); ResolvedType type = javaParserFacade.getType(expr.getExpression()); assertEquals("java.lang.Object", type.describe()); } }
@Test public void issue235() throws ParseException { CompilationUnit cu = parseSample("Issue235"); ClassOrInterfaceDeclaration cls = Navigator.demandClassOrInterface(cu, "Foo"); TypeSolver typeSolver = new ReflectionTypeSolver(); JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver); MethodDeclaration m = Navigator.demandMethod(cls, this.method); ExpressionStmt stmt = (ExpressionStmt) m.getBody().get().getStatements().get(0); ObjectCreationExpr expression = (ObjectCreationExpr) stmt.getExpression(); Assert.assertNotNull(javaParserFacade.convertToUsage(expression.getType())); } }
@Test public void resolveUsageOfGenericFieldSimpleCase() throws ParseException { CompilationUnit cu = parseSample("Generics"); ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "SomeCollection"); MethodDeclaration method = Navigator.demandMethod(clazz, "foo1"); ExpressionStmt stmt = (ExpressionStmt) method.getBody().get().getStatements().get(0); Expression expression = stmt.getExpression(); ResolvedType type = JavaParserFacade.get(new ReflectionTypeSolver()).getType(expression); assertEquals(false, type.isTypeVariable()); assertEquals("java.lang.String", type.describe()); }
@Test public void resolveUsageOfGenericFieldAdvancedCase() throws ParseException { CompilationUnit cu = parseSample("Generics"); ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "SomeCollection"); MethodDeclaration method = Navigator.demandMethod(clazz, "foo2"); ExpressionStmt stmt = (ExpressionStmt) method.getBody().get().getStatements().get(0); Expression expression = stmt.getExpression(); ResolvedType type = JavaParserFacade.get(new ReflectionTypeSolver()).getType(expression); assertEquals(false, type.isTypeVariable()); assertEquals("java.util.List<java.lang.String>", type.describe()); assertEquals(1, type.asReferenceType().typeParametersValues().size()); assertEquals(false, type.asReferenceType().typeParametersValues().get(0).isTypeVariable()); assertEquals("java.lang.String", type.asReferenceType().typeParametersValues().get(0).describe()); }
@Test public void resolveInheritedFieldReference() throws ParseException { CompilationUnit cu = parseSample("ReferencesToField"); com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "ReferencesToFieldExtendingClass"); MethodDeclaration method1 = Navigator.demandMethod(referencesToField, "method2"); ExpressionStmt stmt = (ExpressionStmt) method1.getBody().get().getStatements().get(0); AssignExpr assignExpr = (AssignExpr) stmt.getExpression(); SymbolSolver symbolSolver = new SymbolSolver(typeSolver); SymbolReference symbolReference = symbolSolver.solveSymbol("i", assignExpr.getTarget()); assertEquals(true, symbolReference.isSolved()); assertEquals("i", symbolReference.getCorrespondingDeclaration().getName()); assertEquals(true, symbolReference.getCorrespondingDeclaration().isField()); }
@Test public void resolveDeclaredFieldReference() throws ParseException { CompilationUnit cu = parseSample("ReferencesToField"); com.github.javaparser.ast.body.ClassOrInterfaceDeclaration referencesToField = Navigator.demandClass(cu, "ReferencesToField"); MethodDeclaration method1 = Navigator.demandMethod(referencesToField, "method1"); ExpressionStmt stmt = (ExpressionStmt) method1.getBody().get().getStatements().get(0); AssignExpr assignExpr = (AssignExpr) stmt.getExpression(); SymbolSolver symbolSolver = new SymbolSolver(typeSolver); SymbolReference symbolReference = symbolSolver.solveSymbol("i", assignExpr.getTarget()); assertEquals(true, symbolReference.isSolved()); assertEquals("i", symbolReference.getCorrespondingDeclaration().getName()); assertEquals(true, symbolReference.getCorrespondingDeclaration().isField()); }
@Test public void accessClassFieldThroughThisWithCompetingSymbolInParentContext() throws ParseException { CompilationUnit cu = parseSample("AccessClassMemberThroughThis"); com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "AccessClassMemberThroughThis"); MethodDeclaration method = Navigator.demandMethod(clazz, "setLabel"); ExpressionStmt expressionStmt = (ExpressionStmt) method.getBody().get().getStatements().get(0); AssignExpr assignExpr = (AssignExpr) expressionStmt.getExpression(); FieldAccessExpr fieldAccessExpr = (FieldAccessExpr) assignExpr.getTarget(); File src = adaptPath(new File("src/test/resources")); CombinedTypeSolver typeSolver = new CombinedTypeSolver(new JavaParserTypeSolver(src), new ReflectionTypeSolver()); SymbolSolver symbolSolver = new SymbolSolver(typeSolver); SymbolReference<? extends ResolvedValueDeclaration> ref = symbolSolver.solveSymbol(fieldAccessExpr.getField().getId(), fieldAccessExpr); assertTrue(ref.isSolved()); assertTrue(ref.getCorrespondingDeclaration().isField()); }
@Test public void arrayTypeIsNotPartOfTheTree() throws ParseException { CompilationUnit cu = parseSample("Issue116"); ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "JavaTest"); MethodDeclaration methodDeclaration = Navigator.demandMethod(clazz, "foo"); TypeSolver typeSolver = new ReflectionTypeSolver(); JavaParserFacade javaParserFacade = JavaParserFacade.get(typeSolver); com.github.javaparser.ast.type.Type typeNode = methodDeclaration.getParameters().get(0).getType(); ResolvedType type = javaParserFacade.convert(typeNode, typeNode); assertEquals("java.lang.String[]", type.describe()); ExpressionStmt expressionStmt = (ExpressionStmt) methodDeclaration.getBody().get().getStatements().get(0); Expression argRef = expressionStmt.getExpression(); assertEquals("java.lang.String[]", javaParserFacade.getType(argRef).describe()); } }