You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2017/06/28 13:07:56 UTC

groovy git commit: Make EmptyExpression and EmptyStatement immutatble

Repository: groovy
Updated Branches:
  refs/heads/GROOVY_2_6_X 6c44e35ba -> 97e1d16cb


Make EmptyExpression and EmptyStatement immutatble


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/97e1d16c
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/97e1d16c
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/97e1d16c

Branch: refs/heads/GROOVY_2_6_X
Commit: 97e1d16cb6b2e8b0ae40fabced35e86951dc0e24
Parents: 6c44e35
Author: sunlan <su...@apache.org>
Authored: Wed Jun 28 21:07:39 2017 +0800
Committer: sunlan <su...@apache.org>
Committed: Wed Jun 28 21:07:39 2017 +0800

----------------------------------------------------------------------
 .../groovy/ast/expr/EmptyExpression.java        | 92 ++++++++++++++++++++
 .../groovy/ast/stmt/EmptyStatement.java         | 69 +++++++++++++++
 .../groovy/control/StaticImportVisitor.java     |  2 +-
 .../AutoImplementASTTransformation.java         |  2 +-
 .../MapConstructorASTTransformation.java        |  4 +-
 .../TupleConstructorASTTransformation.java      |  4 +-
 .../stc/StaticTypeCheckingVisitor.java          |  2 +-
 .../transform/tailrec/InWhileLoopWrapper.groovy |  2 +-
 .../SingletonASTTransformationTest.java         |  2 +-
 .../tailrec/StatementReplacerTest.groovy        |  4 +-
 .../VariableExpressionReplacerTest.groovy       |  2 +-
 .../markup/MarkupBuilderCodeTransformer.java    |  3 +-
 12 files changed, 174 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/97e1d16c/src/main/org/codehaus/groovy/ast/expr/EmptyExpression.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/ast/expr/EmptyExpression.java b/src/main/org/codehaus/groovy/ast/expr/EmptyExpression.java
index d469b67..d1a3596 100644
--- a/src/main/org/codehaus/groovy/ast/expr/EmptyExpression.java
+++ b/src/main/org/codehaus/groovy/ast/expr/EmptyExpression.java
@@ -18,7 +18,14 @@
  */
 package org.codehaus.groovy.ast.expr;
 
+import org.codehaus.groovy.ast.ASTNode;
+import org.codehaus.groovy.ast.AnnotationNode;
+import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.GroovyCodeVisitor;
+import org.codehaus.groovy.ast.NodeMetaDataHandler;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * This class is a place holder for an empty expression. 
@@ -45,4 +52,89 @@ public class EmptyExpression extends Expression {
     public void visit(GroovyCodeVisitor visitor) {
         return;
     }
+
+
+    @Override
+    public void setType(ClassNode t) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void addAnnotation(AnnotationNode value) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void addAnnotations(List<AnnotationNode> annotations) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setSynthetic(boolean synthetic) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setDeclaringClass(ClassNode declaringClass) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setHasNoRealSourcePosition(boolean value) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setLineNumber(int lineNumber) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setColumnNumber(int columnNumber) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setLastLineNumber(int lastLineNumber) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setLastColumnNumber(int lastColumnNumber) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setSourcePosition(ASTNode node) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void copyNodeMetaData(NodeMetaDataHandler other) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setNodeMetaData(Object key, Object value) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public Object putNodeMetaData(Object key, Object value) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void removeNodeMetaData(Object key) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setMetaDataMap(Map<?, ?> metaDataMap) {
+        throw createUnsupportedOperationException();
+    }
+
+    private UnsupportedOperationException createUnsupportedOperationException() {
+        return new UnsupportedOperationException("EmptyExpression.INSTANCE is immutable");
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/groovy/blob/97e1d16c/src/main/org/codehaus/groovy/ast/stmt/EmptyStatement.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/ast/stmt/EmptyStatement.java b/src/main/org/codehaus/groovy/ast/stmt/EmptyStatement.java
index c69d9e3..2e6b2da 100644
--- a/src/main/org/codehaus/groovy/ast/stmt/EmptyStatement.java
+++ b/src/main/org/codehaus/groovy/ast/stmt/EmptyStatement.java
@@ -18,7 +18,11 @@
  */
 package org.codehaus.groovy.ast.stmt;
 
+import org.codehaus.groovy.ast.ASTNode;
 import org.codehaus.groovy.ast.GroovyCodeVisitor;
+import org.codehaus.groovy.ast.NodeMetaDataHandler;
+
+import java.util.Map;
 
 /**
  * Represents an empty statement
@@ -40,4 +44,69 @@ public class EmptyStatement extends Statement {
     public boolean isEmpty() {
         return true;
     }
+
+
+    @Override
+    public void setStatementLabel(String label) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void addStatementLabel(String label) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setLineNumber(int lineNumber) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setColumnNumber(int columnNumber) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setLastLineNumber(int lastLineNumber) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setLastColumnNumber(int lastColumnNumber) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setSourcePosition(ASTNode node) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void copyNodeMetaData(NodeMetaDataHandler other) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setNodeMetaData(Object key, Object value) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public Object putNodeMetaData(Object key, Object value) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void removeNodeMetaData(Object key) {
+        throw createUnsupportedOperationException();
+    }
+
+    @Override
+    public void setMetaDataMap(Map<?, ?> metaDataMap) {
+        throw createUnsupportedOperationException();
+    }
+
+    private UnsupportedOperationException createUnsupportedOperationException() {
+        return new UnsupportedOperationException("EmptyStatement.INSTANCE is immutable");
+    }
 }

http://git-wip-us.apache.org/repos/asf/groovy/blob/97e1d16c/src/main/org/codehaus/groovy/control/StaticImportVisitor.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/control/StaticImportVisitor.java b/src/main/org/codehaus/groovy/control/StaticImportVisitor.java
index e055ebb..d4a2566 100644
--- a/src/main/org/codehaus/groovy/control/StaticImportVisitor.java
+++ b/src/main/org/codehaus/groovy/control/StaticImportVisitor.java
@@ -564,7 +564,7 @@ public class StaticImportVisitor extends ClassCodeExpressionTransformer {
     private Expression findStaticPropertyAccessorByFullName(ClassNode staticImportType, String accessorMethodName) {
         // anything will do as we only check size == 1
         ArgumentListExpression dummyArgs = new ArgumentListExpression();
-        dummyArgs.addExpression(new EmptyExpression());
+        dummyArgs.addExpression(EmptyExpression.INSTANCE);
         return findStaticMethod(staticImportType, accessorMethodName, (inLeftExpression ? dummyArgs : ArgumentListExpression.EMPTY_ARGUMENTS));
     }
 

http://git-wip-us.apache.org/repos/asf/groovy/blob/97e1d16c/src/main/org/codehaus/groovy/transform/AutoImplementASTTransformation.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/transform/AutoImplementASTTransformation.java b/src/main/org/codehaus/groovy/transform/AutoImplementASTTransformation.java
index 74124fd..592b2f2 100644
--- a/src/main/org/codehaus/groovy/transform/AutoImplementASTTransformation.java
+++ b/src/main/org/codehaus/groovy/transform/AutoImplementASTTransformation.java
@@ -85,7 +85,7 @@ public class AutoImplementASTTransformation extends AbstractASTTransformation {
             }
             createMethods(cNode, exception, message, (ClosureExpression) code);
             if (code != null) {
-                anno.setMember("code", new ClosureExpression(new Parameter[0], new EmptyStatement()));
+                anno.setMember("code", new ClosureExpression(new Parameter[0], EmptyStatement.INSTANCE));
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/groovy/blob/97e1d16c/src/main/org/codehaus/groovy/transform/MapConstructorASTTransformation.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/transform/MapConstructorASTTransformation.java b/src/main/org/codehaus/groovy/transform/MapConstructorASTTransformation.java
index b5c5d1e..d5de8c1 100644
--- a/src/main/org/codehaus/groovy/transform/MapConstructorASTTransformation.java
+++ b/src/main/org/codehaus/groovy/transform/MapConstructorASTTransformation.java
@@ -108,10 +108,10 @@ public class MapConstructorASTTransformation extends AbstractASTTransformation {
 
             createConstructor(cNode, includeFields, includeProperties, includeSuperProperties, useSetters, excludes, includes, (ClosureExpression) pre, (ClosureExpression) post, source, allNames);
             if (pre != null) {
-                anno.setMember("pre", new ClosureExpression(new Parameter[0], new EmptyStatement()));
+                anno.setMember("pre", new ClosureExpression(new Parameter[0], EmptyStatement.INSTANCE));
             }
             if (post != null) {
-                anno.setMember("post", new ClosureExpression(new Parameter[0], new EmptyStatement()));
+                anno.setMember("post", new ClosureExpression(new Parameter[0], EmptyStatement.INSTANCE));
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/groovy/blob/97e1d16c/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 746eaf4..6ab0b96 100644
--- a/src/main/org/codehaus/groovy/transform/TupleConstructorASTTransformation.java
+++ b/src/main/org/codehaus/groovy/transform/TupleConstructorASTTransformation.java
@@ -138,10 +138,10 @@ public class TupleConstructorASTTransformation extends AbstractASTTransformation
                     callSuper, force, excludes, includes, useSetters, defaults, allNames, sourceUnit,
                     (ClosureExpression) pre, (ClosureExpression) post);
             if (pre != null) {
-                anno.setMember("pre", new ClosureExpression(new Parameter[0], new EmptyStatement()));
+                anno.setMember("pre", new ClosureExpression(new Parameter[0], EmptyStatement.INSTANCE));
             }
             if (post != null) {
-                anno.setMember("post", new ClosureExpression(new Parameter[0], new EmptyStatement()));
+                anno.setMember("post", new ClosureExpression(new Parameter[0], EmptyStatement.INSTANCE));
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/groovy/blob/97e1d16c/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index c1548aa..b7f00b6 100644
--- a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -159,7 +159,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
     protected static final ClassNode MAP_ENTRY_TYPE = make(Map.Entry.class);
     protected static final ClassNode ENUMERATION_TYPE = make(Enumeration.class);
 
-    public static final Statement GENERATED_EMPTY_STATEMENT = new EmptyStatement();
+    public static final Statement GENERATED_EMPTY_STATEMENT = EmptyStatement.INSTANCE;
 
     public static final MethodNode CLOSURE_CALL_NO_ARG;
     public static final MethodNode CLOSURE_CALL_ONE_ARG;

http://git-wip-us.apache.org/repos/asf/groovy/blob/97e1d16c/src/main/org/codehaus/groovy/transform/tailrec/InWhileLoopWrapper.groovy
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/transform/tailrec/InWhileLoopWrapper.groovy b/src/main/org/codehaus/groovy/transform/tailrec/InWhileLoopWrapper.groovy
index 0fe2baa..981f146 100644
--- a/src/main/org/codehaus/groovy/transform/tailrec/InWhileLoopWrapper.groovy
+++ b/src/main/org/codehaus/groovy/transform/tailrec/InWhileLoopWrapper.groovy
@@ -53,7 +53,7 @@ class InWhileLoopWrapper {
 		BlockStatement oldBody = method.code as BlockStatement
         TryCatchStatement tryCatchStatement = new TryCatchStatement(
                 oldBody,
-                new EmptyStatement()
+                EmptyStatement.INSTANCE
         )
         tryCatchStatement.addCatch(new CatchStatement(
                 new Parameter(ClassHelper.make(GotoRecurHereException), 'ignore'),

http://git-wip-us.apache.org/repos/asf/groovy/blob/97e1d16c/src/test/org/codehaus/groovy/transform/SingletonASTTransformationTest.java
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/transform/SingletonASTTransformationTest.java b/src/test/org/codehaus/groovy/transform/SingletonASTTransformationTest.java
index 29f43f5..c9c748e 100644
--- a/src/test/org/codehaus/groovy/transform/SingletonASTTransformationTest.java
+++ b/src/test/org/codehaus/groovy/transform/SingletonASTTransformationTest.java
@@ -36,7 +36,7 @@ public class SingletonASTTransformationTest {
         try {
             ASTNode[] badInput = new ASTNode[]{
                     new ConstantExpression("sample"),
-                    new EmptyExpression()
+                    EmptyExpression.INSTANCE
             };
             new SingletonASTTransformation().visit(badInput, null);
             Assert.fail("Contract Failure");

http://git-wip-us.apache.org/repos/asf/groovy/blob/97e1d16c/src/test/org/codehaus/groovy/transform/tailrec/StatementReplacerTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/transform/tailrec/StatementReplacerTest.groovy b/src/test/org/codehaus/groovy/transform/tailrec/StatementReplacerTest.groovy
index 6abbebe..2377ed0 100644
--- a/src/test/org/codehaus/groovy/transform/tailrec/StatementReplacerTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/tailrec/StatementReplacerTest.groovy
@@ -118,7 +118,7 @@ class StatementReplacerTest {
     public void replaceIfBlock() {
         def toReplace = aReturnStatement("old")
         def replacement = aReturnStatement("new")
-        def ifStatement = new IfStatement(aBooleanExpression(true), toReplace, new EmptyStatement())
+        def ifStatement = new IfStatement(aBooleanExpression(true), toReplace, EmptyStatement.INSTANCE)
 
         replacements[toReplace] = replacement
         replacer.replaceIn(ifStatement)
@@ -130,7 +130,7 @@ class StatementReplacerTest {
     public void replaceElseBlock() {
         def toReplace = aReturnStatement("old")
         def replacement = aReturnStatement("new")
-        def ifStatement = new IfStatement(aBooleanExpression(true), new EmptyStatement(), toReplace)
+        def ifStatement = new IfStatement(aBooleanExpression(true), EmptyStatement.INSTANCE, toReplace)
 
         replacements[toReplace] = replacement
         replacer.replaceIn(ifStatement)

http://git-wip-us.apache.org/repos/asf/groovy/blob/97e1d16c/src/test/org/codehaus/groovy/transform/tailrec/VariableExpressionReplacerTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/transform/tailrec/VariableExpressionReplacerTest.groovy b/src/test/org/codehaus/groovy/transform/tailrec/VariableExpressionReplacerTest.groovy
index 06cfdfe..bb7bd0f 100644
--- a/src/test/org/codehaus/groovy/transform/tailrec/VariableExpressionReplacerTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/tailrec/VariableExpressionReplacerTest.groovy
@@ -182,7 +182,7 @@ class VariableExpressionReplacerTest {
 
 
     def anEmptyStatement() {
-        new EmptyStatement()
+        EmptyStatement.INSTANCE
     }
 
     def aConstant(value) {

http://git-wip-us.apache.org/repos/asf/groovy/blob/97e1d16c/subprojects/groovy-templates/src/main/groovy/groovy/text/markup/MarkupBuilderCodeTransformer.java
----------------------------------------------------------------------
diff --git a/subprojects/groovy-templates/src/main/groovy/groovy/text/markup/MarkupBuilderCodeTransformer.java b/subprojects/groovy-templates/src/main/groovy/groovy/text/markup/MarkupBuilderCodeTransformer.java
index b7537b6..69f2bb4 100644
--- a/subprojects/groovy-templates/src/main/groovy/groovy/text/markup/MarkupBuilderCodeTransformer.java
+++ b/subprojects/groovy-templates/src/main/groovy/groovy/text/markup/MarkupBuilderCodeTransformer.java
@@ -166,8 +166,7 @@ class MarkupBuilderCodeTransformer extends ClassCodeExpressionTransformer {
                 //  ...
                 // }
                 Map<String,ClassNode> modelTypes = extractModelTypesFromClosureExpression((ClosureExpression)right);
-                Expression result = new EmptyExpression();
-                result.setSourcePosition(bin);
+                Expression result = EmptyExpression.INSTANCE;
                 classNode.putNodeMetaData(MarkupTemplateEngine.MODELTYPES_ASTKEY, modelTypes);
                 return result;
             }