/** * Generates something like <code>return field</code> * * @param fieldName * @return */ private static BlockStmt returnField(String fieldName) { BlockStmt body = new BlockStmt(); body.addStatement(new ReturnStmt(fieldName)); return body; }
@Override public void visit(ThrowStmt n, Void arg) { out.println("ThrowStmt: " + (extended ? n : n.getExpression())); super.visit(n, arg); }
@Override public void visit(CatchClause n, Void arg) { out.println("CatchClause: " + (extended ? n : n.getParameter())); super.visit(n, arg); }
/** * Generates something like * <code>P_INDEX_UPDATER.lazySet(this, newValue)</code> * * @param fieldUpdaterFieldName * @param newValueName * @return */ private static BlockStmt fieldUpdaterLazySet(String fieldUpdaterFieldName, String newValueName) { BlockStmt body = new BlockStmt(); body.addStatement(new ExpressionStmt( methodCallExpr(fieldUpdaterFieldName, "lazySet", new ThisExpr(), new NameExpr(newValueName)))); return body; }
@Override public void visit(ExpressionStmt n, Void arg) { out.println("ExpressionStmt: " + (extended ? n : n.getExpression())); super.visit(n, arg); }
@Override public void visit(ReturnStmt n, Void arg) { out.println("ReturnStmt: " + (extended ? n : n.getExpression())); super.visit(n, arg); }
@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(IfStmt n, Void arg) { out.println("IfStmt: " + (extended ? n : n.getCondition())); super.visit(n, arg); }
@Override public ContinueStmt doMerge(ContinueStmt first, ContinueStmt second) { ContinueStmt cs = new ContinueStmt(); cs.setId(first.getId()); return cs; }
@Override public EmptyStmt doMerge(EmptyStmt first, EmptyStmt second) { EmptyStmt es = new EmptyStmt(); return es; }
/** * Generates something like <code>return field</code> * * @param fieldName * @return */ private static BlockStmt returnField(String fieldName) { BlockStmt body = new BlockStmt(); body.addStatement(new ReturnStmt(fieldName)); return body; }
/** * Generates something like * <code>P_INDEX_UPDATER.lazySet(this, newValue)</code> * * @param fieldUpdaterFieldName * @param newValueName * @return */ private static BlockStmt fieldUpdaterLazySet(String fieldUpdaterFieldName, String newValueName) { BlockStmt body = new BlockStmt(); body.addStatement(new ExpressionStmt( methodCallExpr(fieldUpdaterFieldName, "lazySet", new ThisExpr(), new NameExpr(newValueName)))); return body; }
@Override public Boolean visit(ExpressionStmt n, Void arg) { // A local variable declaration statement can complete normally iff it is reachable. if (n.getExpression() instanceof VariableDeclarationExpr) { VariableDeclarationExpr expr = (VariableDeclarationExpr) n.getExpression(); return isReachable(n); } // An expression statement can complete normally iff it is reachable. return isReachable(n); } };
/** * Generates something like * <code>return P_INDEX_UPDATER.getAndSet(this, newValue)</code> * * @param fieldUpdaterFieldName * @param newValueName * @return */ private static BlockStmt fieldUpdaterGetAndSet(String fieldUpdaterFieldName, String newValueName) { BlockStmt body = new BlockStmt(); body.addStatement(new ReturnStmt( methodCallExpr(fieldUpdaterFieldName, "getAndSet", new ThisExpr(), new NameExpr(newValueName)))); return body; }
/** * Generates something like <code>field = newValue</code> * * @param fieldName * @param valueName * @return */ private static BlockStmt fieldAssignment(String fieldName, String valueName) { BlockStmt body = new BlockStmt(); body.addStatement( new ExpressionStmt(new AssignExpr(new NameExpr(fieldName), new NameExpr(valueName), Operator.ASSIGN))); return body; }
/** * Generates something like * <code>return P_INDEX_UPDATER.compareAndSet(this, expectedValue, newValue)</code> * * @param fieldUpdaterFieldName * @param expectedValueName * @param newValueName * @return */ private static BlockStmt fieldUpdaterCompareAndSet(String fieldUpdaterFieldName, String expectedValueName, String newValueName) { BlockStmt body = new BlockStmt(); body.addStatement(new ReturnStmt(methodCallExpr(fieldUpdaterFieldName, "compareAndSet", new ThisExpr(), new NameExpr(expectedValueName), new NameExpr(newValueName)))); return body; }
/** * Generates something like <code>field = newValue</code> * * @param fieldName * @param valueName * @return */ private static BlockStmt fieldAssignment(String fieldName, String valueName) { BlockStmt body = new BlockStmt(); body.addStatement( new ExpressionStmt(new AssignExpr(new NameExpr(fieldName), new NameExpr(valueName), Operator.ASSIGN))); return body; }
/** * Generates something like * <code>return P_INDEX_UPDATER.compareAndSet(this, expectedValue, newValue)</code> * * @param fieldUpdaterFieldName * @param expectedValueName * @param newValueName * @return */ private static BlockStmt fieldUpdaterCompareAndSet(String fieldUpdaterFieldName, String expectedValueName, String newValueName) { BlockStmt body = new BlockStmt(); body.addStatement(new ReturnStmt(methodCallExpr(fieldUpdaterFieldName, "compareAndSet", new ThisExpr(), new NameExpr(expectedValueName), new NameExpr(newValueName)))); return body; }
/** * Given a method declaration node this method will replace it's code and * signature with code to redirect all calls to it to the * <code>newMethodName</code>. Method signatures of both methods must match * exactly. * * @param methodToPatch * @param toMethodName * @param returnType * @param parameters */ private static void patchMethodAsDepreciatedRedirector(MethodDeclaration methodToPatch, String toMethodName, Type returnType, Parameter... parameters) { methodToPatch.setType(returnType); for (Parameter parameter : parameters) { methodToPatch.addParameter(parameter); } methodToPatch.addAnnotation(new MarkerAnnotationExpr("Deprecated")); methodToPatch.setJavadocComment( formatMultilineJavadoc(1, "@deprecated This was renamed to " + toMethodName + " please migrate")); MethodCallExpr methodCall = methodCallExpr("this", toMethodName); for (Parameter parameter : parameters) { methodCall.addArgument(new NameExpr(parameter.getName())); } BlockStmt body = new BlockStmt(); body.addStatement(new ReturnStmt(methodCall)); methodToPatch.setBody(body); }