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 2018/04/13 07:25:00 UTC
groovy git commit: Make Parrot test util classes compileStatic
Repository: groovy
Updated Branches:
refs/heads/master 936295d8b -> adf7e9219
Make Parrot test util classes compileStatic
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/adf7e921
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/adf7e921
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/adf7e921
Branch: refs/heads/master
Commit: adf7e9219f92827996d17a0624db11d9406e4b11
Parents: 936295d
Author: sunlan <su...@apache.org>
Authored: Fri Apr 13 15:24:28 2018 +0800
Committer: sunlan <su...@apache.org>
Committed: Fri Apr 13 15:24:55 2018 +0800
----------------------------------------------------------------------
.../groovy/parser/antlr4/TestUtils.groovy | 48 +++-
.../antlr4/util/ASTComparatorCategory.groovy | 251 ++++++++++++-------
.../groovy/parser/antlr4/util/AstDumper.groovy | 203 +++++++++++----
.../test/resources/bugs/BUG-GROOVY-8426.groovy | 6 +-
4 files changed, 359 insertions(+), 149 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/adf7e921/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/TestUtils.groovy
----------------------------------------------------------------------
diff --git a/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/TestUtils.groovy b/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/TestUtils.groovy
index 791655f..af2cb16 100644
--- a/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/TestUtils.groovy
+++ b/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/TestUtils.groovy
@@ -18,6 +18,8 @@
*/
package org.apache.groovy.parser.antlr4
+import groovy.transform.CompileDynamic
+import groovy.transform.CompileStatic
import groovy.util.logging.Log
import org.apache.groovy.parser.AbstractParser
import org.apache.groovy.parser.Antlr2Parser
@@ -25,8 +27,23 @@ import org.apache.groovy.parser.Antlr4Parser
import org.apache.groovy.parser.antlr4.util.ASTComparatorCategory
import org.apache.groovy.parser.antlr4.util.AstDumper
import org.codehaus.groovy.antlr.AntlrParserPluginFactory
-import org.codehaus.groovy.ast.*
-import org.codehaus.groovy.ast.stmt.*
+import org.codehaus.groovy.ast.ConstructorNode
+import org.codehaus.groovy.ast.FieldNode
+import org.codehaus.groovy.ast.GenericsType
+import org.codehaus.groovy.ast.MethodNode
+import org.codehaus.groovy.ast.ModuleNode
+import org.codehaus.groovy.ast.PackageNode
+import org.codehaus.groovy.ast.Parameter
+import org.codehaus.groovy.ast.PropertyNode
+import org.codehaus.groovy.ast.stmt.AssertStatement
+import org.codehaus.groovy.ast.stmt.BreakStatement
+import org.codehaus.groovy.ast.stmt.ContinueStatement
+import org.codehaus.groovy.ast.stmt.ExpressionStatement
+import org.codehaus.groovy.ast.stmt.ForStatement
+import org.codehaus.groovy.ast.stmt.IfStatement
+import org.codehaus.groovy.ast.stmt.ReturnStatement
+import org.codehaus.groovy.ast.stmt.ThrowStatement
+import org.codehaus.groovy.ast.stmt.WhileStatement
import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.syntax.Token
@@ -36,6 +53,8 @@ import java.util.zip.ZipFile
/**
* Utilities for test
*/
+
+@CompileStatic
@Log
class TestUtils {
public static final String DEFAULT_RESOURCES_PATH = 'subprojects/parser-antlr4/src/test/resources';
@@ -49,6 +68,7 @@ class TestUtils {
return doTest(path, addIgnore(ignoreClazzList, ASTComparatorCategory.LOCATION_IGNORE_LIST))
}
+ @CompileDynamic
static doTest(String path, conf) {
AbstractParser antlr4Parser = new Antlr4Parser()
AbstractParser antlr2Parser = new Antlr2Parser()
@@ -81,6 +101,7 @@ class TestUtils {
}
*/
+ @CompileDynamic
static unzipAndTest(String path, String entryName, conf, Map<String, String> replacementsMap=[:]) {
AbstractParser antlr4Parser = new Antlr4Parser()
AbstractParser antlr2Parser = new Antlr2Parser()
@@ -114,6 +135,7 @@ class TestUtils {
shouldFail(path, addIgnore(ignoreClazzList, ASTComparatorCategory.LOCATION_IGNORE_LIST), toCheckNewParserOnly)
}
+ @CompileDynamic
static shouldFail(String path, conf, boolean toCheckNewParserOnly = false) {
AbstractParser antlr4Parser = new Antlr4Parser()
AbstractParser antlr2Parser = new Antlr2Parser()
@@ -136,6 +158,7 @@ class TestUtils {
}
}
+ @CompileDynamic
static unzipAndFail(String path, String entryName, conf, Map<String, String> replacementsMap=[:], boolean toCheckNewParserOnly = false) {
AbstractParser antlr4Parser = new Antlr4Parser()
AbstractParser antlr2Parser = new Antlr2Parser()
@@ -164,8 +187,7 @@ class TestUtils {
}
}
-
- static assertAST(ast1, ast2, conf) {
+ static assertAST(ModuleNode ast1, ModuleNode ast2, conf) {
assert null != ast1 && null != ast2
ASTComparatorCategory.apply(conf) {
@@ -187,14 +209,14 @@ class TestUtils {
return [result, end - begin];
}
- static addIgnore(Class aClass, ArrayList<String> ignore, Map<Class, List<String>> c = null) {
- c = c ?: ASTComparatorCategory.DEFAULT_CONFIGURATION.clone() as Map<Class, List<String>>;
+ static addIgnore(Class aClass, List<String> ignore, Map<Class, List<String>> c = null) {
+ c = c ?: new HashMap<>(ASTComparatorCategory.DEFAULT_CONFIGURATION) as Map<Class, List<String>>;
c[aClass].addAll(ignore)
return c
}
- static addIgnore(Collection<Class> aClass, ArrayList<String> ignore, Map<Class, List<String>> c = null) {
- c = c ?: ASTComparatorCategory.DEFAULT_CONFIGURATION.clone() as Map<Class, List<String>>;
+ static addIgnore(Collection<Class> aClass, List<String> ignore, Map<Class, List<String>> c = null) {
+ c = c ?: new HashMap<>(ASTComparatorCategory.DEFAULT_CONFIGURATION) as Map<Class, List<String>>;
aClass.each { c[it].addAll(ignore) }
return c
}
@@ -229,7 +251,7 @@ class TestUtils {
}
static doRunAndTestAntlr4(String path) {
- assert executeScript(path)
+ assert executeScript(path);
}
static doRunAndTestAntlr2(String path) {
@@ -240,7 +262,7 @@ class TestUtils {
executeScript(createAntlr4Shell(), "$RESOURCES_PATH/$path")
}
- static executeScript(gsh, String path) {
+ static executeScript(GroovyShell gsh, String path) {
def file = new File(path);
def content = file.text;
@@ -254,19 +276,19 @@ class TestUtils {
}
}
- static createAntlr4Shell() {
+ static GroovyShell createAntlr4Shell() {
CompilerConfiguration configuration = new CompilerConfiguration(CompilerConfiguration.DEFAULT)
configuration.pluginFactory = new Antlr4PluginFactory()
return new GroovyShell(configuration);
}
- static createAntlr2Shell() {
+ static GroovyShell createAntlr2Shell() {
CompilerConfiguration configuration = new CompilerConfiguration(CompilerConfiguration.DEFAULT)
configuration.pluginFactory = new AntlrParserPluginFactory()
return new GroovyShell(configuration);
}
- public static final List COMMON_IGNORE_CLASS_LIST = Collections.unmodifiableList([AssertStatement, BreakStatement, ConstructorNode, ContinueStatement, ExpressionStatement, FieldNode, ForStatement, GenericsType, IfStatement, MethodNode, PackageNode, Parameter, PropertyNode, ReturnStatement, ThrowStatement, Token, WhileStatement]);
+ public static final List COMMON_IGNORE_CLASS_LIST = Collections.unmodifiableList([AssertStatement, BreakStatement, ConstructorNode, ContinueStatement, ExpressionStatement, FieldNode, ForStatement, GenericsType, IfStatement, MethodNode, PackageNode, Parameter, PropertyNode, ReturnStatement, ThrowStatement, Token, WhileStatement] as List);
}
http://git-wip-us.apache.org/repos/asf/groovy/blob/adf7e921/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/util/ASTComparatorCategory.groovy
----------------------------------------------------------------------
diff --git a/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/util/ASTComparatorCategory.groovy b/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/util/ASTComparatorCategory.groovy
index 19123f9..0480004 100644
--- a/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/util/ASTComparatorCategory.groovy
+++ b/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/util/ASTComparatorCategory.groovy
@@ -18,14 +18,90 @@
*/
package org.apache.groovy.parser.antlr4.util
+import groovy.transform.CompileDynamic
+import groovy.transform.CompileStatic
import groovy.util.logging.Log
-import org.codehaus.groovy.ast.*
-import org.codehaus.groovy.ast.expr.*
-import org.codehaus.groovy.ast.stmt.*
+import org.codehaus.groovy.ast.AnnotationNode
+import org.codehaus.groovy.ast.ClassNode
+import org.codehaus.groovy.ast.CompileUnit
+import org.codehaus.groovy.ast.ConstructorNode
+import org.codehaus.groovy.ast.DynamicVariable
+import org.codehaus.groovy.ast.EnumConstantClassNode
+import org.codehaus.groovy.ast.FieldNode
+import org.codehaus.groovy.ast.GenericsType
+import org.codehaus.groovy.ast.ImportNode
+import org.codehaus.groovy.ast.InnerClassNode
+import org.codehaus.groovy.ast.InterfaceHelperClassNode
+import org.codehaus.groovy.ast.MethodNode
+import org.codehaus.groovy.ast.MixinNode
+import org.codehaus.groovy.ast.ModuleNode
+import org.codehaus.groovy.ast.PackageNode
+import org.codehaus.groovy.ast.Parameter
+import org.codehaus.groovy.ast.PropertyNode
+import org.codehaus.groovy.ast.Variable
+import org.codehaus.groovy.ast.VariableScope
+import org.codehaus.groovy.ast.expr.AnnotationConstantExpression
+import org.codehaus.groovy.ast.expr.ArgumentListExpression
+import org.codehaus.groovy.ast.expr.ArrayExpression
+import org.codehaus.groovy.ast.expr.AttributeExpression
+import org.codehaus.groovy.ast.expr.BinaryExpression
+import org.codehaus.groovy.ast.expr.BitwiseNegationExpression
+import org.codehaus.groovy.ast.expr.BooleanExpression
+import org.codehaus.groovy.ast.expr.CastExpression
+import org.codehaus.groovy.ast.expr.ClassExpression
+import org.codehaus.groovy.ast.expr.ClosureExpression
+import org.codehaus.groovy.ast.expr.ClosureListExpression
+import org.codehaus.groovy.ast.expr.ConstantExpression
+import org.codehaus.groovy.ast.expr.ConstructorCallExpression
+import org.codehaus.groovy.ast.expr.DeclarationExpression
+import org.codehaus.groovy.ast.expr.ElvisOperatorExpression
+import org.codehaus.groovy.ast.expr.EmptyExpression
+import org.codehaus.groovy.ast.expr.ExpressionTransformer
+import org.codehaus.groovy.ast.expr.FieldExpression
+import org.codehaus.groovy.ast.expr.GStringExpression
+import org.codehaus.groovy.ast.expr.ListExpression
+import org.codehaus.groovy.ast.expr.MapEntryExpression
+import org.codehaus.groovy.ast.expr.MapExpression
+import org.codehaus.groovy.ast.expr.MethodCall
+import org.codehaus.groovy.ast.expr.MethodCallExpression
+import org.codehaus.groovy.ast.expr.MethodPointerExpression
+import org.codehaus.groovy.ast.expr.NamedArgumentListExpression
+import org.codehaus.groovy.ast.expr.NotExpression
+import org.codehaus.groovy.ast.expr.PostfixExpression
+import org.codehaus.groovy.ast.expr.PrefixExpression
+import org.codehaus.groovy.ast.expr.PropertyExpression
+import org.codehaus.groovy.ast.expr.RangeExpression
+import org.codehaus.groovy.ast.expr.SpreadExpression
+import org.codehaus.groovy.ast.expr.SpreadMapExpression
+import org.codehaus.groovy.ast.expr.StaticMethodCallExpression
+import org.codehaus.groovy.ast.expr.TernaryExpression
+import org.codehaus.groovy.ast.expr.TupleExpression
+import org.codehaus.groovy.ast.expr.UnaryMinusExpression
+import org.codehaus.groovy.ast.expr.UnaryPlusExpression
+import org.codehaus.groovy.ast.expr.VariableExpression
+import org.codehaus.groovy.ast.stmt.AssertStatement
+import org.codehaus.groovy.ast.stmt.BlockStatement
+import org.codehaus.groovy.ast.stmt.BreakStatement
+import org.codehaus.groovy.ast.stmt.CaseStatement
+import org.codehaus.groovy.ast.stmt.CatchStatement
+import org.codehaus.groovy.ast.stmt.ContinueStatement
+import org.codehaus.groovy.ast.stmt.DoWhileStatement
+import org.codehaus.groovy.ast.stmt.EmptyStatement
+import org.codehaus.groovy.ast.stmt.ExpressionStatement
+import org.codehaus.groovy.ast.stmt.ForStatement
+import org.codehaus.groovy.ast.stmt.IfStatement
+import org.codehaus.groovy.ast.stmt.LoopingStatement
+import org.codehaus.groovy.ast.stmt.ReturnStatement
+import org.codehaus.groovy.ast.stmt.SwitchStatement
+import org.codehaus.groovy.ast.stmt.SynchronizedStatement
+import org.codehaus.groovy.ast.stmt.ThrowStatement
+import org.codehaus.groovy.ast.stmt.TryCatchStatement
+import org.codehaus.groovy.ast.stmt.WhileStatement
import org.codehaus.groovy.syntax.Token
import java.util.logging.Level
+@CompileStatic
@Log @SuppressWarnings("GroovyUnusedDeclaration")
class ASTComparatorCategory {
static { log.level = Level.WARNING }
@@ -36,94 +112,95 @@ class ASTComparatorCategory {
* Keeps all checked object pairs and their comparison result.
* Will be cleared at {@link #apply(groovy.lang.Closure)} method }
*/
- static objects = [:] as Map<List<Object>, Boolean>
+ static Map<List<Object>, Boolean> objects = [:] as Map<List<Object>, Boolean>
static String lastName
static Map<Class, List<String>> DEFAULT_CONFIGURATION = [
- (ClassNode): (['module', "declaredMethodsMap", "plainNodeReference", "typeClass", "allInterfaces", "orAddStaticConstructorNode", "allDeclaredMethods", "unresolvedSuperClass", "innerClasses" ] + LOCATION_IGNORE_LIST) as List<String>,
- (ConstructorNode): ['declaringClass'],
- (DynamicVariable): [],
- (EnumConstantClassNode): ["typeClass"],
- (FieldNode): ["owner", "declaringClass", "initialValueExpression", "assignToken"],
- (GenericsType): [],
- (ImportNode): LOCATION_IGNORE_LIST,
- (InnerClassNode): (['module', "declaredMethodsMap", "plainNodeReference", "typeClass", "allInterfaces", "orAddStaticConstructorNode", "allDeclaredMethods", "unresolvedSuperClass", "innerClasses" ] + LOCATION_IGNORE_LIST) as List<String>,
- (InterfaceHelperClassNode): [],
- (MethodNode): ["text", "declaringClass"],
- (MixinNode): [],
- (ModuleNode): ["context"],
- (PackageNode): [],
- (Parameter): [],
- (PropertyNode): ['declaringClass', 'initialValueExpression', "assignToken"],
- (Variable): [],
- (VariableScope): ["clazzScope", "parent", "declaredVariablesIterator"],
- (Token): ["root", "startColumn"],
- (AnnotationNode): (["text"] + LOCATION_IGNORE_LIST) as List<String>,
- (AssertStatement): ["text"],
- (BlockStatement): ["columnNumber", "lineNumber", "lastColumnNumber", "lastLineNumber", "text"],
- (BreakStatement): ["text"],
- (CaseStatement): ["text"],
- (CatchStatement): (["text"] + LOCATION_IGNORE_LIST) as List<String>,
- (ContinueStatement): ["text"],
- (DoWhileStatement): ["text"],
- (EmptyStatement): ["text"],
- (ExpressionStatement): ["text"],
- (ForStatement): ["text"],
- (IfStatement): ["text"],
- (LoopingStatement): ["text"],
- (ReturnStatement): ["text"],
- (SwitchStatement): ["columnNumber", "lineNumber", "lastColumnNumber", "lastLineNumber", "text"],
- (SynchronizedStatement): ["text"],
- (ThrowStatement): ["text"],
- (TryCatchStatement): (["text"] + LOCATION_IGNORE_LIST) as List<String>,
- (WhileStatement): ["text"],
+ (ClassNode) : (['module', "declaredMethodsMap", "plainNodeReference", "typeClass", "allInterfaces", "orAddStaticConstructorNode", "allDeclaredMethods", "unresolvedSuperClass", "innerClasses" ] + LOCATION_IGNORE_LIST) as List<String>,
+ (ConstructorNode) : ['declaringClass'],
+ (DynamicVariable) : [],
+ (EnumConstantClassNode) : ["typeClass"],
+ (FieldNode) : ["owner", "declaringClass", "initialValueExpression", "assignToken"],
+ (GenericsType) : [],
+ (ImportNode) : LOCATION_IGNORE_LIST,
+ (InnerClassNode) : (['module', "declaredMethodsMap", "plainNodeReference", "typeClass", "allInterfaces", "orAddStaticConstructorNode", "allDeclaredMethods", "unresolvedSuperClass", "innerClasses" ] + LOCATION_IGNORE_LIST) as List<String>,
+ (InterfaceHelperClassNode) : [],
+ (MethodNode) : ["text", "declaringClass"],
+ (MixinNode) : [],
+ (ModuleNode) : ["context"],
+ (PackageNode) : [],
+ (Parameter) : [],
+ (PropertyNode) : ['declaringClass', 'initialValueExpression', "assignToken"],
+ (Variable) : [],
+ (VariableScope) : ["clazzScope", "parent", "declaredVariablesIterator"],
+ (Token) : ["root", "startColumn"],
+ (AnnotationNode) : (["text"] + LOCATION_IGNORE_LIST) as List<String>,
+ (AssertStatement) : ["text"],
+ (BlockStatement) : ["columnNumber", "lineNumber", "lastColumnNumber", "lastLineNumber", "text"],
+ (BreakStatement) : ["text"],
+ (CaseStatement) : ["text"],
+ (CatchStatement) : (["text"] + LOCATION_IGNORE_LIST) as List<String>,
+ (ContinueStatement) : ["text"],
+ (DoWhileStatement) : ["text"],
+ (EmptyStatement) : ["text"],
+ (ExpressionStatement) : ["text"],
+ (ForStatement) : ["text"],
+ (IfStatement) : ["text"],
+ (LoopingStatement) : ["text"],
+ (ReturnStatement) : ["text"],
+ (SwitchStatement) : ["columnNumber", "lineNumber", "lastColumnNumber", "lastLineNumber", "text"],
+ (SynchronizedStatement) : ["text"],
+ (ThrowStatement) : ["text"],
+ (TryCatchStatement) : (["text"] + LOCATION_IGNORE_LIST) as List<String>,
+ (WhileStatement) : ["text"],
(AnnotationConstantExpression): EXPRESSION_IGNORE_LIST,
- (ArgumentListExpression): EXPRESSION_IGNORE_LIST,
- (ArrayExpression): EXPRESSION_IGNORE_LIST,
- (AttributeExpression): EXPRESSION_IGNORE_LIST,
- (BinaryExpression): EXPRESSION_IGNORE_LIST,
- (BitwiseNegationExpression): EXPRESSION_IGNORE_LIST,
- (BooleanExpression): EXPRESSION_IGNORE_LIST,
- (CastExpression): EXPRESSION_IGNORE_LIST,
- (ClassExpression): EXPRESSION_IGNORE_LIST,
- (ClosureExpression): EXPRESSION_IGNORE_LIST,
- (ClosureListExpression): EXPRESSION_IGNORE_LIST,
- (ConstantExpression): EXPRESSION_IGNORE_LIST,
- (ConstructorCallExpression): EXPRESSION_IGNORE_LIST,
- (DeclarationExpression): ["text", "columnNumber", "lineNumber", "lastColumnNumber", "lastLineNumber"],
- (ElvisOperatorExpression): EXPRESSION_IGNORE_LIST,
- (EmptyExpression): EXPRESSION_IGNORE_LIST,
- (ExpressionTransformer): EXPRESSION_IGNORE_LIST,
- (FieldExpression): EXPRESSION_IGNORE_LIST,
- (GStringExpression): EXPRESSION_IGNORE_LIST,
- (ListExpression): EXPRESSION_IGNORE_LIST,
- (MapEntryExpression): EXPRESSION_IGNORE_LIST,
- (MapExpression): EXPRESSION_IGNORE_LIST,
- (MethodCall): EXPRESSION_IGNORE_LIST,
- (MethodCallExpression): EXPRESSION_IGNORE_LIST,
- (MethodPointerExpression): EXPRESSION_IGNORE_LIST,
- (NamedArgumentListExpression): EXPRESSION_IGNORE_LIST,
- (NotExpression): EXPRESSION_IGNORE_LIST,
- (PostfixExpression): EXPRESSION_IGNORE_LIST,
- (PrefixExpression): EXPRESSION_IGNORE_LIST,
- (PropertyExpression): EXPRESSION_IGNORE_LIST,
- (RangeExpression): EXPRESSION_IGNORE_LIST,
- (SpreadExpression): EXPRESSION_IGNORE_LIST,
- (SpreadMapExpression): EXPRESSION_IGNORE_LIST,
- (StaticMethodCallExpression): EXPRESSION_IGNORE_LIST,
- (TernaryExpression): EXPRESSION_IGNORE_LIST,
- (TupleExpression): EXPRESSION_IGNORE_LIST,
- (UnaryMinusExpression): EXPRESSION_IGNORE_LIST,
- (UnaryPlusExpression): EXPRESSION_IGNORE_LIST,
- (VariableExpression): EXPRESSION_IGNORE_LIST,
- ];
+ (ArgumentListExpression) : EXPRESSION_IGNORE_LIST,
+ (ArrayExpression) : EXPRESSION_IGNORE_LIST,
+ (AttributeExpression) : EXPRESSION_IGNORE_LIST,
+ (BinaryExpression) : EXPRESSION_IGNORE_LIST,
+ (BitwiseNegationExpression) : EXPRESSION_IGNORE_LIST,
+ (BooleanExpression) : EXPRESSION_IGNORE_LIST,
+ (CastExpression) : EXPRESSION_IGNORE_LIST,
+ (ClassExpression) : EXPRESSION_IGNORE_LIST,
+ (ClosureExpression) : EXPRESSION_IGNORE_LIST,
+ (ClosureListExpression) : EXPRESSION_IGNORE_LIST,
+ (ConstantExpression) : EXPRESSION_IGNORE_LIST,
+ (ConstructorCallExpression) : EXPRESSION_IGNORE_LIST,
+ (DeclarationExpression) : ["text", "columnNumber", "lineNumber", "lastColumnNumber", "lastLineNumber"],
+ (ElvisOperatorExpression) : EXPRESSION_IGNORE_LIST,
+ (EmptyExpression) : EXPRESSION_IGNORE_LIST,
+ (ExpressionTransformer) : EXPRESSION_IGNORE_LIST,
+ (FieldExpression) : EXPRESSION_IGNORE_LIST,
+ (GStringExpression) : EXPRESSION_IGNORE_LIST,
+ (ListExpression) : EXPRESSION_IGNORE_LIST,
+ (MapEntryExpression) : EXPRESSION_IGNORE_LIST,
+ (MapExpression) : EXPRESSION_IGNORE_LIST,
+ (MethodCall) : EXPRESSION_IGNORE_LIST,
+ (MethodCallExpression) : EXPRESSION_IGNORE_LIST,
+ (MethodPointerExpression) : EXPRESSION_IGNORE_LIST,
+ (NamedArgumentListExpression) : EXPRESSION_IGNORE_LIST,
+ (NotExpression) : EXPRESSION_IGNORE_LIST,
+ (PostfixExpression) : EXPRESSION_IGNORE_LIST,
+ (PrefixExpression) : EXPRESSION_IGNORE_LIST,
+ (PropertyExpression) : EXPRESSION_IGNORE_LIST,
+ (RangeExpression) : EXPRESSION_IGNORE_LIST,
+ (SpreadExpression) : EXPRESSION_IGNORE_LIST,
+ (SpreadMapExpression) : EXPRESSION_IGNORE_LIST,
+ (StaticMethodCallExpression) : EXPRESSION_IGNORE_LIST,
+ (TernaryExpression) : EXPRESSION_IGNORE_LIST,
+ (TupleExpression) : EXPRESSION_IGNORE_LIST,
+ (UnaryMinusExpression) : EXPRESSION_IGNORE_LIST,
+ (UnaryPlusExpression) : EXPRESSION_IGNORE_LIST,
+ (VariableExpression) : EXPRESSION_IGNORE_LIST,
+ ] as Map<Class, List<String>>
static Map<Class, List<String>> COLLECTION_PROPERTY_CONFIGURATION = [
(ModuleNode): ["classes", "name"]
- ]
+ ] as Map<Class, List<String>>
static Map<Class, List<String>> configuration = DEFAULT_CONFIGURATION;
+ @CompileDynamic
static void apply(config = DEFAULT_CONFIGURATION, Closure cl) {
configuration = config
objects.clear()
@@ -138,8 +215,8 @@ class ASTComparatorCategory {
* @param b
* @return
*/
+ @CompileDynamic
static reflexiveEquals(a, b, ignore = []) {
-
if (a.getClass() != b.getClass()) {
log.warning(" !!!! DIFFERENCE WAS FOUND! ${a.getClass()} != ${b.getClass()}")
return false;
@@ -161,7 +238,8 @@ class ASTComparatorCategory {
if (a.is(b))
return true
- def difference = a.metaClass.properties.find { MetaBeanProperty p ->
+ def difference = a.metaClass.properties.find { MetaProperty mp ->
+ MetaBeanProperty p = (MetaBeanProperty) mp
if (!p.getter)
return false
@@ -194,7 +272,7 @@ class ASTComparatorCategory {
}
if (difference)
- log.warning(" !!!! DIFFERENCE WAS FOUND! [${a.metaClass.hasProperty(a, 'text') ? a.text : '<NO TEXT>'}][${a.class}][${difference.name}]:: ${ a."$difference.name" } != ${ b."$difference.name" }")
+ log.warning(" !!!! DIFFERENCE WAS FOUND! [${extractText(a)}][${a.class}][${difference.name}]:: ${ a."$difference.name" } != ${ b."$difference.name" }")
else
log.info(" ==== Exit ${ a.getClass() } ${ a.hashCode() } ====== ")
@@ -204,6 +282,11 @@ class ASTComparatorCategory {
res
}
+ @CompileDynamic
+ static String extractText(obj) {
+ return obj.metaClass.hasProperty(obj, 'text') ? obj.text : '<NO TEXT>'
+ }
+
////////////////////////////////////////////////////////////////////////////////////////////////////
// Just a bunch of copypasted methods. Maybe will wrote AST transformation for them.
////////////////////////////////////////////////////////////////////////////////////////////////////
http://git-wip-us.apache.org/repos/asf/groovy/blob/adf7e921/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/util/AstDumper.groovy
----------------------------------------------------------------------
diff --git a/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/util/AstDumper.groovy b/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/util/AstDumper.groovy
index 72a64e5..0fa5ca9 100644
--- a/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/util/AstDumper.groovy
+++ b/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/util/AstDumper.groovy
@@ -18,9 +18,77 @@
*/
package org.apache.groovy.parser.antlr4.util
-import org.codehaus.groovy.ast.*
-import org.codehaus.groovy.ast.expr.*
-import org.codehaus.groovy.ast.stmt.*
+import groovy.transform.CompileStatic
+import org.codehaus.groovy.ast.ASTNode
+import org.codehaus.groovy.ast.AnnotationNode
+import org.codehaus.groovy.ast.ClassHelper
+import org.codehaus.groovy.ast.ClassNode
+import org.codehaus.groovy.ast.ConstructorNode
+import org.codehaus.groovy.ast.FieldNode
+import org.codehaus.groovy.ast.GenericsType
+import org.codehaus.groovy.ast.GroovyClassVisitor
+import org.codehaus.groovy.ast.GroovyCodeVisitor
+import org.codehaus.groovy.ast.ImportNode
+import org.codehaus.groovy.ast.MethodNode
+import org.codehaus.groovy.ast.ModuleNode
+import org.codehaus.groovy.ast.PackageNode
+import org.codehaus.groovy.ast.Parameter
+import org.codehaus.groovy.ast.PropertyNode
+import org.codehaus.groovy.ast.expr.ArgumentListExpression
+import org.codehaus.groovy.ast.expr.ArrayExpression
+import org.codehaus.groovy.ast.expr.AttributeExpression
+import org.codehaus.groovy.ast.expr.BinaryExpression
+import org.codehaus.groovy.ast.expr.BitwiseNegationExpression
+import org.codehaus.groovy.ast.expr.BooleanExpression
+import org.codehaus.groovy.ast.expr.CastExpression
+import org.codehaus.groovy.ast.expr.ClassExpression
+import org.codehaus.groovy.ast.expr.ClosureExpression
+import org.codehaus.groovy.ast.expr.ClosureListExpression
+import org.codehaus.groovy.ast.expr.ConstantExpression
+import org.codehaus.groovy.ast.expr.ConstructorCallExpression
+import org.codehaus.groovy.ast.expr.DeclarationExpression
+import org.codehaus.groovy.ast.expr.ElvisOperatorExpression
+import org.codehaus.groovy.ast.expr.EmptyExpression
+import org.codehaus.groovy.ast.expr.Expression
+import org.codehaus.groovy.ast.expr.FieldExpression
+import org.codehaus.groovy.ast.expr.GStringExpression
+import org.codehaus.groovy.ast.expr.LambdaExpression
+import org.codehaus.groovy.ast.expr.ListExpression
+import org.codehaus.groovy.ast.expr.MapEntryExpression
+import org.codehaus.groovy.ast.expr.MapExpression
+import org.codehaus.groovy.ast.expr.MethodCallExpression
+import org.codehaus.groovy.ast.expr.MethodPointerExpression
+import org.codehaus.groovy.ast.expr.NotExpression
+import org.codehaus.groovy.ast.expr.PostfixExpression
+import org.codehaus.groovy.ast.expr.PrefixExpression
+import org.codehaus.groovy.ast.expr.PropertyExpression
+import org.codehaus.groovy.ast.expr.RangeExpression
+import org.codehaus.groovy.ast.expr.SpreadExpression
+import org.codehaus.groovy.ast.expr.SpreadMapExpression
+import org.codehaus.groovy.ast.expr.StaticMethodCallExpression
+import org.codehaus.groovy.ast.expr.TernaryExpression
+import org.codehaus.groovy.ast.expr.TupleExpression
+import org.codehaus.groovy.ast.expr.UnaryMinusExpression
+import org.codehaus.groovy.ast.expr.UnaryPlusExpression
+import org.codehaus.groovy.ast.expr.VariableExpression
+import org.codehaus.groovy.ast.stmt.AssertStatement
+import org.codehaus.groovy.ast.stmt.BlockStatement
+import org.codehaus.groovy.ast.stmt.BreakStatement
+import org.codehaus.groovy.ast.stmt.CaseStatement
+import org.codehaus.groovy.ast.stmt.CatchStatement
+import org.codehaus.groovy.ast.stmt.ContinueStatement
+import org.codehaus.groovy.ast.stmt.DoWhileStatement
+import org.codehaus.groovy.ast.stmt.EmptyStatement
+import org.codehaus.groovy.ast.stmt.ExpressionStatement
+import org.codehaus.groovy.ast.stmt.ForStatement
+import org.codehaus.groovy.ast.stmt.IfStatement
+import org.codehaus.groovy.ast.stmt.ReturnStatement
+import org.codehaus.groovy.ast.stmt.Statement
+import org.codehaus.groovy.ast.stmt.SwitchStatement
+import org.codehaus.groovy.ast.stmt.SynchronizedStatement
+import org.codehaus.groovy.ast.stmt.ThrowStatement
+import org.codehaus.groovy.ast.stmt.TryCatchStatement
+import org.codehaus.groovy.ast.stmt.WhileStatement
import org.codehaus.groovy.classgen.BytecodeExpression
import org.codehaus.groovy.classgen.GeneratorContext
import org.codehaus.groovy.classgen.Verifier
@@ -37,6 +105,7 @@ import java.lang.reflect.Modifier
* @author <a href="mailto:realbluesun@hotmail.com">Daniel.Sun</a>
* Created on 2016/08/16
*/
+@CompileStatic
class AstDumper {
private ModuleNode ast;
@@ -55,7 +124,7 @@ class AstDumper {
try {
AstNodeToScriptVisitor visitor = new AstNodeToScriptVisitor(out, true, true);
- new LinkedList<ClassNode>(this.ast?.classes ?: []).sort { c1, c2 -> c1.name <=> c2.name }?.each {
+ new LinkedList<ClassNode>((List) this.ast?.classes ?: []).sort { c1, c2 -> c1.name <=> c2.name }?.each {
visitor.call(new SourceUnit((String) null, (ReaderSource) null, null, null, null) {
@Override
public ModuleNode getAST() {
@@ -82,6 +151,7 @@ class AstDumper {
*
* @author Hamlet D'Arcy
*/
+@CompileStatic
class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation implements GroovyCodeVisitor, GroovyClassVisitor {
private final Writer _out
@@ -233,7 +303,8 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
}
visitModifiers(node.modifiers)
- print "class $node.name"
+ if (node.isInterface()) print node.name
+ else print "class $node.name"
visitGenerics node?.genericsTypes
boolean first = true
node.unresolvedInterfaces?.each {
@@ -257,6 +328,8 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
printDoubleBreak()
node?.declaredConstructors?.each { visitConstructor(it) }
printLineBreak()
+ visitObjectInitializerBlocks(node)
+ printLineBreak()
node?.methods?.each { visitMethod(it) }
}
print '}'
@@ -264,6 +337,19 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
classNameStack.pop()
}
+ private void visitObjectInitializerBlocks(ClassNode node) {
+ for (Statement stmt : node.getObjectInitializerStatements()) {
+ print '{'
+ printLineBreak()
+ indented {
+ stmt.visit(this)
+ }
+ printLineBreak()
+ print '}'
+ printDoubleBreak()
+ }
+ }
+
private void visitGenerics(GenericsType[] generics) {
if (generics) {
@@ -368,40 +454,10 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
printDoubleBreak()
}
- private def visitModifiers(int modifiers) {
- if (Modifier.isAbstract(modifiers)) {
- print 'abstract '
- }
- if (Modifier.isFinal(modifiers)) {
- print 'final '
- }
- if (Modifier.isInterface(modifiers)) {
- print 'interface '
- }
- if (Modifier.isNative(modifiers)) {
- print 'native '
- }
- if (Modifier.isPrivate(modifiers)) {
- print 'private '
- }
- if (Modifier.isProtected(modifiers)) {
- print 'protected '
- }
- if (Modifier.isPublic(modifiers)) {
- print 'public '
- }
- if (Modifier.isStatic(modifiers)) {
- print 'static '
- }
- if (Modifier.isSynchronized(modifiers)) {
- print 'synchronized '
- }
- if (Modifier.isTransient(modifiers)) {
- print 'transient '
- }
- if (Modifier.isVolatile(modifiers)) {
- print 'volatile '
- }
+ private void visitModifiers(int modifiers) {
+ String mods = Modifier.toString(modifiers)
+ mods = mods ? mods + ' ' : mods
+ print mods
}
@Override
@@ -424,7 +480,7 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
// GROOVY-5150: final constants may be initialized directly
print ' = '
if (ClassHelper.STRING_TYPE == type) {
- print "'"+node.initialValueExpression.text.replaceAll("'", "\\\\'")+"'"
+ print "'" + node.initialValueExpression.text.replaceAll("'", "\\\\'") + "'"
} else if (ClassHelper.char_TYPE == type) {
print "'${node.initialValueExpression.text}'"
} else {
@@ -460,9 +516,22 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
@Override
void visitBlockStatement(BlockStatement block) {
- block?.statements?.each {
- it.visit(this)
+ if (printStatementLabels(block)) {
+ print '{'
+ printLineBreak()
+ indented {
+ block?.statements?.each {
+ it.visit(this)
+ printLineBreak()
+ }
+ }
+ print '}'
printLineBreak()
+ } else {
+ block?.statements?.each {
+ it.visit(this)
+ printLineBreak()
+ }
}
if (!_out.toString().endsWith('\n')) {
printLineBreak()
@@ -471,7 +540,7 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
@Override
void visitForLoop(ForStatement statement) {
-
+ printStatementLabels(statement)
print 'for ('
if (statement?.variable != ForStatement.FOR_LOOP_DUMMY) {
visitParameters([statement.variable])
@@ -494,6 +563,7 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
@Override
void visitIfElse(IfStatement ifElse) {
+ printStatementLabels(ifElse)
print 'if ('
ifElse?.booleanExpression?.visit this
print ') {'
@@ -529,6 +599,7 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
@Override
void visitSwitch(SwitchStatement statement) {
+ printStatementLabels(statement)
print 'switch ('
statement?.expression?.visit this
print ') {'
@@ -561,12 +632,18 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
@Override
void visitBreakStatement(BreakStatement statement) {
print 'break'
+ if (statement?.label) {
+ print ' ' + statement.label
+ }
printLineBreak()
}
@Override
void visitContinueStatement(ContinueStatement statement) {
print 'continue'
+ if (statement?.label) {
+ print ' ' + statement.label
+ }
printLineBreak()
}
@@ -662,6 +739,11 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
print '}'
}
+ //@Override
+ void visitLambdaExpression(LambdaExpression expression) {
+ visitClosureExpression(expression)
+ }
+
@Override
void visitTupleExpression(TupleExpression expression) {
print '('
@@ -688,7 +770,7 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
}
print '.'
if (expression?.property instanceof ConstantExpression) {
- visitConstantExpression(expression?.property, true)
+ visitConstantExpression((ConstantExpression) expression?.property, true)
} else {
expression?.property?.visit this
}
@@ -733,7 +815,7 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
// handle multiple assignment expressions
if (expression?.leftExpression instanceof ArgumentListExpression) {
print 'def '
- visitArgumentlistExpression expression?.leftExpression, true
+ visitArgumentlistExpression((ArgumentListExpression) expression?.leftExpression, true)
print " $expression.operation.text "
expression.rightExpression.visit this
@@ -791,7 +873,6 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
/**
* Prints out the type, safely handling arrays.
* @param classNode
- * classnode
*/
void visitType(ClassNode classNode) {
def name = classNode.name
@@ -832,14 +913,13 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
}
-
@Override
void visitMapExpression(MapExpression expression) {
print '['
if (expression?.mapEntryExpressions?.size() == 0) {
print ':'
} else {
- visitExpressionsAndCommaSeparate(expression?.mapEntryExpressions)
+ visitExpressionsAndCommaSeparate((List) expression?.mapEntryExpressions)
}
print ']'
}
@@ -864,6 +944,7 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
@Override
void visitTryCatchFinally(TryCatchStatement statement) {
+ printStatementLabels(statement)
print 'try {'
printLineBreak()
indented {
@@ -893,6 +974,7 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
@Override
void visitSynchronizedStatement(SynchronizedStatement statement) {
+ printStatementLabels(statement)
print 'synchronized ('
statement?.expression?.visit this
print ') {'
@@ -924,6 +1006,7 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
@Override
void visitWhileLoop(WhileStatement statement) {
+ printStatementLabels(statement)
print 'while ('
statement?.booleanExpression?.visit this
print ') {'
@@ -938,6 +1021,7 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
@Override
void visitDoWhileLoop(DoWhileStatement statement) {
+ printStatementLabels(statement)
print 'do {'
printLineBreak()
indented {
@@ -1012,7 +1096,7 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
print ', '
}
first = false
- it.visit this
+ ((ASTNode) it).visit this
}
}
@@ -1021,5 +1105,24 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
print '*:'
expression?.expression?.visit this
}
-}
+ /**
+ * Prints all labels for the given statement. The labels will be printed on a single
+ * line and line break will be added.
+ *
+ * @param statement for which to print labels
+ * @return {@code true} if the statement had labels to print, else {@code false}
+ */
+ private boolean printStatementLabels(Statement statement) {
+ List<String> labels = statement?.statementLabels
+ if (labels == null || labels.isEmpty()) {
+ return false
+ }
+ for (String label : labels) {
+ print label + ':'
+ printLineBreak()
+ }
+ return true
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/groovy/blob/adf7e921/subprojects/parser-antlr4/src/test/resources/bugs/BUG-GROOVY-8426.groovy
----------------------------------------------------------------------
diff --git a/subprojects/parser-antlr4/src/test/resources/bugs/BUG-GROOVY-8426.groovy b/subprojects/parser-antlr4/src/test/resources/bugs/BUG-GROOVY-8426.groovy
index aa0e4d4..917e8cb 100644
--- a/subprojects/parser-antlr4/src/test/resources/bugs/BUG-GROOVY-8426.groovy
+++ b/subprojects/parser-antlr4/src/test/resources/bugs/BUG-GROOVY-8426.groovy
@@ -17,14 +17,16 @@
* under the License.
*/
+
+import groovy.transform.CompileDynamic
import org.codehaus.groovy.ast.ClassNode
import org.codehaus.groovy.ast.MethodNode
import org.codehaus.groovy.ast.builder.AstBuilder
import org.codehaus.groovy.ast.stmt.BlockStatement
import static org.codehaus.groovy.control.CompilePhase.CONVERSION
-
- class Groovy8426Test {
+@CompileDynamic
+class Groovy8426Test {
void testMethodBlockStatement() {
def result = new AstBuilder().buildFromString CONVERSION, false, '''
def method() {