GROOVY-7737: Provide static methods in GeneralUtils to create ThrowStatement and CatchStatement - some additional throwS cases (side effect: closes #251)
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/fbb2ae85 Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/fbb2ae85 Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/fbb2ae85 Branch: refs/heads/master Commit: fbb2ae8575ba71f0270455d0f4e78c4c9eedfa5b Parents: 5b3e659 Author: paulk <[email protected]> Authored: Wed Feb 3 15:06:04 2016 +1000 Committer: paulk <[email protected]> Committed: Wed Feb 3 15:06:04 2016 +1000 ---------------------------------------------------------------------- .../AbstractInterruptibleASTTransformation.java | 41 ++++++++++++++------ .../transform/ImmutableASTTransformation.java | 3 +- .../transform/SingletonASTTransformation.java | 6 +-- .../TimedInterruptibleASTTransformation.groovy | 4 +- .../TupleConstructorASTTransformation.java | 7 ++-- .../NotYetImplementedASTTransformation.java | 31 ++++++++++----- 6 files changed, 59 insertions(+), 33 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/fbb2ae85/src/main/org/codehaus/groovy/transform/AbstractInterruptibleASTTransformation.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/transform/AbstractInterruptibleASTTransformation.java b/src/main/org/codehaus/groovy/transform/AbstractInterruptibleASTTransformation.java index efb69be..f512975 100644 --- a/src/main/org/codehaus/groovy/transform/AbstractInterruptibleASTTransformation.java +++ b/src/main/org/codehaus/groovy/transform/AbstractInterruptibleASTTransformation.java @@ -19,9 +19,25 @@ package org.codehaus.groovy.transform; import org.codehaus.groovy.GroovyBugError; -import org.codehaus.groovy.ast.*; -import org.codehaus.groovy.ast.expr.*; -import org.codehaus.groovy.ast.stmt.*; +import org.codehaus.groovy.ast.ASTNode; +import org.codehaus.groovy.ast.AnnotatedNode; +import org.codehaus.groovy.ast.AnnotationNode; +import org.codehaus.groovy.ast.ClassCodeVisitorSupport; +import org.codehaus.groovy.ast.ClassHelper; +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.ast.FieldNode; +import org.codehaus.groovy.ast.MethodNode; +import org.codehaus.groovy.ast.ModuleNode; +import org.codehaus.groovy.ast.expr.ClassExpression; +import org.codehaus.groovy.ast.expr.ConstantExpression; +import org.codehaus.groovy.ast.expr.DeclarationExpression; +import org.codehaus.groovy.ast.expr.Expression; +import org.codehaus.groovy.ast.stmt.BlockStatement; +import org.codehaus.groovy.ast.stmt.DoWhileStatement; +import org.codehaus.groovy.ast.stmt.ForStatement; +import org.codehaus.groovy.ast.stmt.LoopingStatement; +import org.codehaus.groovy.ast.stmt.Statement; +import org.codehaus.groovy.ast.stmt.WhileStatement; import org.codehaus.groovy.control.SourceUnit; import org.codehaus.groovy.runtime.DefaultGroovyMethods; import org.objectweb.asm.Opcodes; @@ -29,6 +45,12 @@ import org.objectweb.asm.Opcodes; import java.util.Arrays; import java.util.List; +import static org.codehaus.groovy.ast.tools.GeneralUtils.args; +import static org.codehaus.groovy.ast.tools.GeneralUtils.constX; +import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX; +import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS; +import static org.codehaus.groovy.ast.tools.GeneralUtils.throwS; + /** * Base class for AST Transformations which will automatically throw an {@link InterruptedException} when * some conditions are met. @@ -163,15 +185,10 @@ public abstract class AbstractInterruptibleASTTransformation extends ClassCodeVi * @return Returns the interruption check statement. */ protected Statement createInterruptStatement() { - return new IfStatement( - new BooleanExpression( - createCondition() - ), - new ThrowStatement( - new ConstructorCallExpression(thrownExceptionType, - new ArgumentListExpression(new ConstantExpression(getErrorMessage()))) - ), - EmptyStatement.INSTANCE + return ifS(createCondition(), + throwS( + ctorX(thrownExceptionType, args(constX(getErrorMessage()))) + ) ); } http://git-wip-us.apache.org/repos/asf/groovy/blob/fbb2ae85/src/main/org/codehaus/groovy/transform/ImmutableASTTransformation.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/transform/ImmutableASTTransformation.java b/src/main/org/codehaus/groovy/transform/ImmutableASTTransformation.java index a0f9ccf..93c8e09 100644 --- a/src/main/org/codehaus/groovy/transform/ImmutableASTTransformation.java +++ b/src/main/org/codehaus/groovy/transform/ImmutableASTTransformation.java @@ -43,7 +43,6 @@ import org.codehaus.groovy.ast.expr.VariableExpression; import org.codehaus.groovy.ast.stmt.BlockStatement; import org.codehaus.groovy.ast.stmt.EmptyStatement; import org.codehaus.groovy.ast.stmt.Statement; -import org.codehaus.groovy.ast.stmt.ThrowStatement; import org.codehaus.groovy.control.CompilePhase; import org.codehaus.groovy.control.SourceUnit; import org.codehaus.groovy.runtime.DefaultGroovyMethods; @@ -396,7 +395,7 @@ public class ImmutableASTTransformation extends AbstractASTTransformation { Expression value = findArg(name); return ifS( notX(equalsNullX(value)), - new ThrowStatement(ctorX(READONLYEXCEPTION_TYPE, + throwS(ctorX(READONLYEXCEPTION_TYPE, args(constX(name), constX(cNode.getName())) ))); } http://git-wip-us.apache.org/repos/asf/groovy/blob/fbb2ae85/src/main/org/codehaus/groovy/transform/SingletonASTTransformation.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/transform/SingletonASTTransformation.java b/src/main/org/codehaus/groovy/transform/SingletonASTTransformation.java index e51bc87..ce20ddc 100644 --- a/src/main/org/codehaus/groovy/transform/SingletonASTTransformation.java +++ b/src/main/org/codehaus/groovy/transform/SingletonASTTransformation.java @@ -29,7 +29,6 @@ import org.codehaus.groovy.ast.expr.Expression; import org.codehaus.groovy.ast.stmt.BlockStatement; import org.codehaus.groovy.ast.stmt.Statement; import org.codehaus.groovy.ast.stmt.SynchronizedStatement; -import org.codehaus.groovy.ast.stmt.ThrowStatement; import org.codehaus.groovy.control.CompilePhase; import org.codehaus.groovy.control.SourceUnit; @@ -45,6 +44,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.ifElseS; import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS; import static org.codehaus.groovy.ast.tools.GeneralUtils.notNullX; import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS; +import static org.codehaus.groovy.ast.tools.GeneralUtils.throwS; import static org.codehaus.groovy.ast.tools.GeneralUtils.varX; import static org.codehaus.groovy.ast.tools.GenericsUtils.newClass; @@ -116,7 +116,7 @@ public class SingletonASTTransformation extends AbstractASTTransformation { } } - if (isStrict && !cNodes.isEmpty()) { + if (isStrict && !cNodes.isEmpty()) { for (ConstructorNode cNode : cNodes) { addError("@Singleton didn't expect to find one or more additional constructors: remove constructor(s) or set strict=false", cNode); } @@ -126,7 +126,7 @@ public class SingletonASTTransformation extends AbstractASTTransformation { final BlockStatement body = new BlockStatement(); body.addStatement(ifS( notNullX(varX(field)), - new ThrowStatement( + throwS( ctorX(make(RuntimeException.class), args(constX("Can't instantiate singleton " + classNode.getName() + ". Use " + classNode.getName() + "." + propertyName)))) )); http://git-wip-us.apache.org/repos/asf/groovy/blob/fbb2ae85/src/main/org/codehaus/groovy/transform/TimedInterruptibleASTTransformation.groovy ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/transform/TimedInterruptibleASTTransformation.groovy b/src/main/org/codehaus/groovy/transform/TimedInterruptibleASTTransformation.groovy index 0481685..6ad4898 100644 --- a/src/main/org/codehaus/groovy/transform/TimedInterruptibleASTTransformation.groovy +++ b/src/main/org/codehaus/groovy/transform/TimedInterruptibleASTTransformation.groovy @@ -35,7 +35,6 @@ import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.DoWhileStatement import org.codehaus.groovy.ast.stmt.ForStatement -import org.codehaus.groovy.ast.stmt.ThrowStatement import org.codehaus.groovy.ast.stmt.WhileStatement import org.codehaus.groovy.control.CompilePhase import org.codehaus.groovy.control.SourceUnit @@ -53,6 +52,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS import static org.codehaus.groovy.ast.tools.GeneralUtils.ltX import static org.codehaus.groovy.ast.tools.GeneralUtils.plusX import static org.codehaus.groovy.ast.tools.GeneralUtils.propX +import static org.codehaus.groovy.ast.tools.GeneralUtils.throwS import static org.codehaus.groovy.ast.tools.GeneralUtils.varX /** @@ -183,7 +183,7 @@ public class TimedInterruptibleASTTransformation extends AbstractASTTransformati propX(varX("this"), basename + '$expireTime'), callX(make(System), 'nanoTime') ), - new ThrowStatement( + throwS( ctorX(thrown, args( plusX( http://git-wip-us.apache.org/repos/asf/groovy/blob/fbb2ae85/src/main/org/codehaus/groovy/transform/TupleConstructorASTTransformation.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/transform/TupleConstructorASTTransformation.java b/src/main/org/codehaus/groovy/transform/TupleConstructorASTTransformation.java index c5478ba..3d971f2 100644 --- a/src/main/org/codehaus/groovy/transform/TupleConstructorASTTransformation.java +++ b/src/main/org/codehaus/groovy/transform/TupleConstructorASTTransformation.java @@ -33,7 +33,6 @@ import org.codehaus.groovy.ast.expr.Expression; import org.codehaus.groovy.ast.expr.VariableExpression; import org.codehaus.groovy.ast.stmt.BlockStatement; import org.codehaus.groovy.ast.stmt.Statement; -import org.codehaus.groovy.ast.stmt.ThrowStatement; import org.codehaus.groovy.classgen.Verifier; import org.codehaus.groovy.control.CompilePhase; import org.codehaus.groovy.control.SourceUnit; @@ -63,6 +62,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS; import static org.codehaus.groovy.ast.tools.GeneralUtils.params; import static org.codehaus.groovy.ast.tools.GeneralUtils.propX; import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt; +import static org.codehaus.groovy.ast.tools.GeneralUtils.throwS; import static org.codehaus.groovy.ast.tools.GeneralUtils.varX; /** @@ -181,7 +181,7 @@ public class TupleConstructorASTTransformation extends AbstractASTTransformation cNode.addConstructor(new ConstructorNode(ACC_PUBLIC, params.toArray(new Parameter[params.size()]), ClassNode.EMPTY_ARRAY, body)); // add map constructor if needed, don't do it for LinkedHashMap for now (would lead to duplicate signature) // or if there is only one Map property (for backwards compatibility) - if (!params.isEmpty() && defaults) { + if (!params.isEmpty() && defaults) { ClassNode firstParam = params.get(0).getType(); if (params.size() > 1 || firstParam.equals(ClassHelper.OBJECT_TYPE)) { String message = "The class " + cNode.getName() + " was incorrectly initialized via the map constructor with null."; @@ -247,8 +247,7 @@ public class TupleConstructorASTTransformation extends AbstractASTTransformation } private static BlockStatement illegalArgumentBlock(String message) { - return block( - new ThrowStatement(ctorX(make(IllegalArgumentException.class), args(constX(message))))); + return block(throwS(ctorX(make(IllegalArgumentException.class), args(constX(message))))); } private static BlockStatement processArgsBlock(ClassNode cNode, VariableExpression namedArgs) { http://git-wip-us.apache.org/repos/asf/groovy/blob/fbb2ae85/subprojects/groovy-test/src/main/java/org/codehaus/groovy/transform/NotYetImplementedASTTransformation.java ---------------------------------------------------------------------- diff --git a/subprojects/groovy-test/src/main/java/org/codehaus/groovy/transform/NotYetImplementedASTTransformation.java b/subprojects/groovy-test/src/main/java/org/codehaus/groovy/transform/NotYetImplementedASTTransformation.java index 2a8affe..21461d1 100644 --- a/subprojects/groovy-test/src/main/java/org/codehaus/groovy/transform/NotYetImplementedASTTransformation.java +++ b/subprojects/groovy-test/src/main/java/org/codehaus/groovy/transform/NotYetImplementedASTTransformation.java @@ -18,17 +18,30 @@ */ package org.codehaus.groovy.transform; -import org.codehaus.groovy.ast.*; -import org.codehaus.groovy.ast.expr.ArgumentListExpression; -import org.codehaus.groovy.ast.expr.ConstantExpression; -import org.codehaus.groovy.ast.expr.ConstructorCallExpression; -import org.codehaus.groovy.ast.stmt.*; +import org.codehaus.groovy.ast.ASTNode; +import org.codehaus.groovy.ast.AnnotatedNode; +import org.codehaus.groovy.ast.AnnotationNode; +import org.codehaus.groovy.ast.ClassHelper; +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.ast.MethodNode; +import org.codehaus.groovy.ast.Parameter; +import org.codehaus.groovy.ast.stmt.BlockStatement; +import org.codehaus.groovy.ast.stmt.CatchStatement; +import org.codehaus.groovy.ast.stmt.EmptyStatement; +import org.codehaus.groovy.ast.stmt.ReturnStatement; +import org.codehaus.groovy.ast.stmt.Statement; +import org.codehaus.groovy.ast.stmt.TryCatchStatement; import org.codehaus.groovy.control.CompilePhase; import org.codehaus.groovy.control.SourceUnit; import java.util.ArrayList; import java.util.Arrays; +import static org.codehaus.groovy.ast.tools.GeneralUtils.args; +import static org.codehaus.groovy.ast.tools.GeneralUtils.constX; +import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX; +import static org.codehaus.groovy.ast.tools.GeneralUtils.throwS; + /** * Handles generation of code for the {@code @NotYetImplemented} annotation. * @@ -83,11 +96,9 @@ public class NotYetImplementedASTTransformation extends AbstractASTTransformatio } private Statement throwAssertionFailedError(AnnotationNode annotationNode) { - ThrowStatement throwStatement = new ThrowStatement( - new ConstructorCallExpression(ASSERTION_FAILED_ERROR_TYPE, - new ArgumentListExpression( - new ConstantExpression("Method is marked with @NotYetImplemented but passes unexpectedly")))); - + Statement throwStatement = throwS( + ctorX(ASSERTION_FAILED_ERROR_TYPE, + args(constX("Method is marked with @NotYetImplemented but passes unexpectedly")))); throwStatement.setSourcePosition(annotationNode); return throwStatement;
