Repository: groovy Updated Branches: refs/heads/master 89b5b072a -> aeb4184ba
Make EmptyExpression and EmptyStatement singleton and immutatble Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/aeb4184b Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/aeb4184b Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/aeb4184b Branch: refs/heads/master Commit: aeb4184ba6d7104e21cd067fe585ded356588216 Parents: 89b5b07 Author: sunlan <[email protected]> Authored: Sat Jun 24 20:45:46 2017 +0800 Committer: sunlan <[email protected]> Committed: Sat Jun 24 20:45:46 2017 +0800 ---------------------------------------------------------------------- .../groovy/ast/expr/EmptyExpression.java | 94 ++++++++++++++++++++ .../groovy/ast/stmt/EmptyStatement.java | 70 +++++++++++++++ .../groovy/control/StaticImportVisitor.java | 2 +- .../AutoImplementASTTransformation.java | 2 +- .../MapConstructorASTTransformation.java | 4 +- .../TupleConstructorASTTransformation.java | 4 +- .../stc/StaticTypeCheckingVisitor.java | 2 +- .../markup/MarkupBuilderCodeTransformer.java | 3 +- 8 files changed, 172 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/aeb4184b/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 ae957a6..401f906 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. @@ -33,6 +40,8 @@ import org.codehaus.groovy.ast.GroovyCodeVisitor; public class EmptyExpression extends Expression { public static final EmptyExpression INSTANCE = new EmptyExpression(); + private EmptyExpression() {} + public Expression transformExpression(ExpressionTransformer transformer) { return this; } @@ -40,4 +49,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"); + } } http://git-wip-us.apache.org/repos/asf/groovy/blob/aeb4184b/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 6f44b1f..fa23659 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 @@ -28,6 +32,8 @@ import org.codehaus.groovy.ast.GroovyCodeVisitor; public class EmptyStatement extends Statement { public static final EmptyStatement INSTANCE = new EmptyStatement(); + + private EmptyStatement() {} public void visit(GroovyCodeVisitor visitor) { } @@ -35,4 +41,68 @@ 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/aeb4184b/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/aeb4184b/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/aeb4184b/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/aeb4184b/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/aeb4184b/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/aeb4184b/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; }
