You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2019/09/26 10:38:11 UTC

[groovy] branch GROOVY_3_0_X updated (ccabf27 -> 07699ec)

This is an automated email from the ASF dual-hosted git repository.

paulk pushed a change to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git.


    from ccabf27  Improve code style (closes #995)
     new 2604ef4  Minor refactoring: implement `makeType` for antlr4 parser plugin
     new fc72172  makeType refactor (closes #1009)
     new 99ad034  Avoid ambiguities when parsing
     new e733ba1  Trivial refactoring: replace AIC with constructor reference
     new 07699ec  avoid deprecated method call

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/codehaus/groovy/ast/tools/Antlr2Utils.java | 41 ++++++++++++
 .../org/codehaus/groovy/ast/tools/Antlr4Utils.java | 18 ++++++
 .../codehaus/groovy/ast/tools/GenericsUtils.java   | 29 ++-------
 src/test/groovy/util/GroovyScriptEngineTest.groovy |  4 +-
 .../MarkupTemplateTypeCheckingExtension.groovy     | 73 ++++++++--------------
 .../groovy/parser/antlr4/Antlr4ParserPlugin.java   | 62 ++++++++++++++++++
 6 files changed, 156 insertions(+), 71 deletions(-)
 create mode 100644 src/main/java/org/codehaus/groovy/ast/tools/Antlr2Utils.java
 create mode 100644 src/main/java/org/codehaus/groovy/ast/tools/Antlr4Utils.java


[groovy] 05/05: avoid deprecated method call

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

paulk pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 07699eceed35599599db98bb9561903d44e5b266
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Sep 26 18:45:11 2019 +1000

    avoid deprecated method call
---
 src/test/groovy/util/GroovyScriptEngineTest.groovy | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/test/groovy/util/GroovyScriptEngineTest.groovy b/src/test/groovy/util/GroovyScriptEngineTest.groovy
index 39dbc36..804a9dd 100644
--- a/src/test/groovy/util/GroovyScriptEngineTest.groovy
+++ b/src/test/groovy/util/GroovyScriptEngineTest.groovy
@@ -50,7 +50,7 @@ class GroovyScriptEngineTest extends GroovyTestCase {
         try {
             System.setProperty('groovy.ast', 'xml')
 
-            def clazz = new GroovyScriptEngine([temporaryFolder.root.toURL()] as URL[]).loadScriptByName('Script1.groovy')
+            def clazz = new GroovyScriptEngine([temporaryFolder.root.toURI().toURL()] as URL[]).loadScriptByName('Script1.groovy')
 
             assert new File(temporaryFolder.root, scriptFile.name + '.xml').exists()
             assert clazz != null
@@ -69,7 +69,7 @@ class GroovyScriptEngineTest extends GroovyTestCase {
 
         System.clearProperty('groovy.ast')
 
-        def clazz = new GroovyScriptEngine([temporaryFolder.root.toURL()] as URL[]).loadScriptByName('Script1.groovy')
+        def clazz = new GroovyScriptEngine([temporaryFolder.root.toURI().toURL()] as URL[]).loadScriptByName('Script1.groovy')
         assert clazz != null
 
         assert !new File(temporaryFolder.root, scriptFile.name + '.xml').exists()


[groovy] 02/05: makeType refactor (closes #1009)

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

paulk pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit fc721725690495c34056205de796fdf863a7c8a2
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Sep 26 18:15:13 2019 +1000

    makeType refactor (closes #1009)
---
 .../org/codehaus/groovy/ast/tools/Antlr2Utils.java | 41 +++++++++++++++++++
 .../org/codehaus/groovy/ast/tools/Antlr4Utils.java | 18 +++++++++
 .../codehaus/groovy/ast/tools/GenericsUtils.java   | 10 ++---
 .../MarkupTemplateTypeCheckingExtension.groovy     | 46 ++++++++++------------
 4 files changed, 83 insertions(+), 32 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/tools/Antlr2Utils.java b/src/main/java/org/codehaus/groovy/ast/tools/Antlr2Utils.java
new file mode 100644
index 0000000..922d4ee
--- /dev/null
+++ b/src/main/java/org/codehaus/groovy/ast/tools/Antlr2Utils.java
@@ -0,0 +1,41 @@
+package org.codehaus.groovy.ast.tools;
+
+import antlr.RecognitionException;
+import antlr.TokenStreamException;
+import groovy.lang.GroovyRuntimeException;
+import org.codehaus.groovy.antlr.AntlrParserPlugin;
+import org.codehaus.groovy.antlr.parser.GroovyLexer;
+import org.codehaus.groovy.antlr.parser.GroovyRecognizer;
+import org.codehaus.groovy.ast.ClassNode;
+import org.codehaus.groovy.ast.ModuleNode;
+import org.codehaus.groovy.control.SourceUnit;
+import org.codehaus.groovy.syntax.ParserException;
+import org.codehaus.groovy.syntax.Reduction;
+
+import java.io.StringReader;
+import java.util.concurrent.atomic.AtomicReference;
+
+public class Antlr2Utils {
+    private Antlr2Utils() {
+    }
+
+    public static ClassNode parse(String option) {
+        GroovyLexer lexer = new GroovyLexer(new StringReader("DummyNode<" + option + ">"));
+        try {
+            final GroovyRecognizer rn = GroovyRecognizer.make(lexer);
+            rn.classOrInterfaceType(true);
+            final AtomicReference<ClassNode> ref = new AtomicReference<ClassNode>();
+            AntlrParserPlugin plugin = new AntlrParserPlugin() {
+                @Override
+                public ModuleNode buildAST(final SourceUnit sourceUnit, final ClassLoader classLoader, final Reduction cst) throws ParserException {
+                    ref.set(makeTypeWithArguments(rn.getAST()));
+                    return null;
+                }
+            };
+            plugin.buildAST(null, null, null);
+            return ref.get();
+        } catch (RecognitionException | TokenStreamException | ParserException e) {
+            throw new GroovyRuntimeException("Unable to parse '" + option + "'", e);
+        }
+    }
+}
diff --git a/src/main/java/org/codehaus/groovy/ast/tools/Antlr4Utils.java b/src/main/java/org/codehaus/groovy/ast/tools/Antlr4Utils.java
new file mode 100644
index 0000000..18e8aae
--- /dev/null
+++ b/src/main/java/org/codehaus/groovy/ast/tools/Antlr4Utils.java
@@ -0,0 +1,18 @@
+package org.codehaus.groovy.ast.tools;
+
+import org.apache.groovy.parser.antlr4.Antlr4ParserPlugin;
+import org.apache.groovy.parser.antlr4.Antlr4PluginFactory;
+import org.codehaus.groovy.ast.ClassNode;
+import org.codehaus.groovy.control.CompilerConfiguration;
+import org.codehaus.groovy.control.ParserPluginFactory;
+
+public class Antlr4Utils {
+    private Antlr4Utils() {
+    }
+
+    public static ClassNode parse(String option, CompilerConfiguration configuration) {
+        Antlr4PluginFactory antlr4PluginFactory = (Antlr4PluginFactory) ParserPluginFactory.antlr4(configuration);
+        Antlr4ParserPlugin antlr4ParserPlugin = (Antlr4ParserPlugin) antlr4PluginFactory.createParserPlugin();
+        return antlr4ParserPlugin.makeType(option);
+    }
+}
diff --git a/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java b/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
index 69beb13..f3c6f92 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
@@ -18,10 +18,9 @@
  */
 package org.codehaus.groovy.ast.tools;
 
+import groovy.lang.GroovyRuntimeException;
 import groovy.lang.Tuple2;
 import groovy.transform.stc.IncorrectTypeHintException;
-import org.apache.groovy.parser.antlr4.Antlr4ParserPlugin;
-import org.apache.groovy.parser.antlr4.Antlr4PluginFactory;
 import org.codehaus.groovy.GroovyBugError;
 import org.codehaus.groovy.ast.ASTNode;
 import org.codehaus.groovy.ast.ClassHelper;
@@ -33,7 +32,6 @@ import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.ast.stmt.EmptyStatement;
 import org.codehaus.groovy.control.CompilationFailedException;
 import org.codehaus.groovy.control.CompilationUnit;
-import org.codehaus.groovy.control.ParserPluginFactory;
 import org.codehaus.groovy.control.ResolveVisitor;
 import org.codehaus.groovy.control.SourceUnit;
 import org.codehaus.groovy.runtime.memoize.ConcurrentSoftCache;
@@ -584,9 +582,7 @@ public class GenericsUtils {
             final ASTNode usage) {
 
         try {
-            Antlr4PluginFactory antlr4PluginFactory = (Antlr4PluginFactory) ParserPluginFactory.antlr4(compilationUnit.getConfiguration());
-            Antlr4ParserPlugin antlr4ParserPlugin = (Antlr4ParserPlugin) antlr4PluginFactory.createParserPlugin();
-            ClassNode parsedNode = antlr4ParserPlugin.makeType("DummyNode<" + option + ">");
+            ClassNode parsedNode = Antlr4Utils.parse("DummyNode<" + option + ">", compilationUnit.getConfiguration());
 
             // the returned node is DummyNode<Param1, Param2, Param3, ...)
             GenericsType[] parsedNodeGenericsTypes = parsedNode.getGenericsTypes();
@@ -599,7 +595,7 @@ public class GenericsUtils {
                 signature[i] = resolveClassNode(sourceUnit, compilationUnit, mn, usage, genericsType.getType());
             }
             return signature;
-        } catch (CompilationFailedException e) {
+        } catch (GroovyRuntimeException e) {
             sourceUnit.addError(new IncorrectTypeHintException(mn, e, usage.getLineNumber(), usage.getColumnNumber()));
         }
         return null;
diff --git a/subprojects/groovy-templates/src/main/groovy/groovy/text/markup/MarkupTemplateTypeCheckingExtension.groovy b/subprojects/groovy-templates/src/main/groovy/groovy/text/markup/MarkupTemplateTypeCheckingExtension.groovy
index 7db4dc7..865068b 100644
--- a/subprojects/groovy-templates/src/main/groovy/groovy/text/markup/MarkupTemplateTypeCheckingExtension.groovy
+++ b/subprojects/groovy-templates/src/main/groovy/groovy/text/markup/MarkupTemplateTypeCheckingExtension.groovy
@@ -19,8 +19,6 @@
 package groovy.text.markup
 
 import groovy.transform.CompileStatic
-import org.apache.groovy.parser.antlr4.Antlr4ParserPlugin
-import org.apache.groovy.parser.antlr4.Antlr4PluginFactory
 import org.codehaus.groovy.ast.ASTNode
 import org.codehaus.groovy.ast.ClassCodeExpressionTransformer
 import org.codehaus.groovy.ast.ClassHelper
@@ -38,8 +36,8 @@ import org.codehaus.groovy.ast.expr.MethodCallExpression
 import org.codehaus.groovy.ast.expr.TupleExpression
 import org.codehaus.groovy.ast.expr.VariableExpression
 import org.codehaus.groovy.ast.stmt.EmptyStatement
+import org.codehaus.groovy.ast.tools.Antlr4Utils
 import org.codehaus.groovy.control.CompilerConfiguration
-import org.codehaus.groovy.control.ParserPluginFactory
 import org.codehaus.groovy.control.ResolveVisitor
 import org.codehaus.groovy.control.SourceUnit
 import org.codehaus.groovy.control.messages.SyntaxErrorMessage
@@ -65,7 +63,7 @@ class MarkupTemplateTypeCheckingExtension extends GroovyTypeCheckingExtensionSup
 
         beforeVisitClass { classNode ->
             def modelTypes = MarkupTemplateEngine.TemplateGroovyClassLoader.modelTypes.get()
-            if (modelTypes!=null) {
+            if (modelTypes != null) {
                 modelTypesClassNodes = [:]
                 modelTypes.each { k, v ->
                     modelTypesClassNodes[k] = buildNodeFromString(v, context)
@@ -73,13 +71,13 @@ class MarkupTemplateTypeCheckingExtension extends GroovyTypeCheckingExtensionSup
             }
             def modelTypesFromTemplate = classNode.getNodeMetaData(MarkupTemplateEngine.MODELTYPES_ASTKEY)
             if (modelTypesFromTemplate) {
-                if (modelTypesClassNodes==null) {
+                if (modelTypesClassNodes == null) {
                     modelTypesClassNodes = modelTypesFromTemplate
                 } else {
                     modelTypesClassNodes.putAll(modelTypesFromTemplate)
                 }
             }
-            if (modelTypesClassNodes==null) {
+            if (modelTypesClassNodes == null) {
                 // push a new error collector, we want type checking errors to be silent
                 context.pushErrorCollector()
             }
@@ -92,16 +90,16 @@ class MarkupTemplateTypeCheckingExtension extends GroovyTypeCheckingExtensionSup
             }
         }
         methodNotFound { receiver, name, argList, argTypes, call ->
-            if ("getAt"==name && OBJECT_TYPE==receiver) {
+            if ("getAt" == name && OBJECT_TYPE == receiver) {
                 // GROOVY-6940
                 def enclosingBinaryExpression = context.enclosingBinaryExpression
                 if (enclosingBinaryExpression.leftExpression.is(call.objectExpression)) {
                     def stack = context.enclosingBinaryExpressionStack
-                    if (stack.size()>1) {
+                    if (stack.size() > 1) {
                         def superEnclosing = stack.get(1)
                         def opType = superEnclosing.operation.type
                         if (superEnclosing.leftExpression.is(enclosingBinaryExpression) && isAssignment(opType)) {
-                            if (opType== Types.ASSIGN) {
+                            if (opType == Types.ASSIGN) {
                                 // type checker looks for getAt() but we need to replace the super binary expression with a putAt
                                 // foo[x] = y --> foo.putAt(x,y)
                                 def mce = new MethodCallExpression(
@@ -125,7 +123,7 @@ class MarkupTemplateTypeCheckingExtension extends GroovyTypeCheckingExtensionSup
                     currentScope.builderCalls << call
                     return makeDynamic(call, OBJECT_TYPE)
                 }
-                if (modelTypesClassNodes==null) {
+                if (modelTypesClassNodes == null) {
                     // unchecked mode
                     return makeDynamic(call, OBJECT_TYPE)
                 }
@@ -133,15 +131,15 @@ class MarkupTemplateTypeCheckingExtension extends GroovyTypeCheckingExtensionSup
         }
 
         onMethodSelection { call, node ->
-            if (isMethodCallExpression(call) && modelTypesClassNodes!=null) {
+            if (isMethodCallExpression(call) && modelTypesClassNodes != null) {
                 def args = getArguments(call).expressions
-                if (args.size()==1) {
-                    String varName = isConstantExpression(args[0])?args[0].text:call.getNodeMetaData(MarkupBuilderCodeTransformer.TARGET_VARIABLE)
+                if (args.size() == 1) {
+                    String varName = isConstantExpression(args[0]) ? args[0].text : call.getNodeMetaData(MarkupBuilderCodeTransformer.TARGET_VARIABLE)
                     def type = modelTypesClassNodes[varName]
                     if (type) {
-                        if (call.objectExpression.text=='this.getModel()') {
+                        if (call.objectExpression.text == 'this.getModel()') {
                             storeType(call, type)
-                        } else if (call.methodAsString=='tryEscape') {
+                        } else if (call.methodAsString == 'tryEscape') {
                             storeType(call, type)
                         }
                     }
@@ -150,8 +148,8 @@ class MarkupTemplateTypeCheckingExtension extends GroovyTypeCheckingExtensionSup
         }
 
         unresolvedProperty { pexp ->
-            if (pexp.objectExpression.text=='this.getModel()') {
-                if (modelTypesClassNodes!=null) {
+            if (pexp.objectExpression.text == 'this.getModel()') {
+                if (modelTypesClassNodes != null) {
                     // type checked mode detected!
                     def type = modelTypesClassNodes[pexp.propertyAsString]
                     if (type) {
@@ -160,7 +158,7 @@ class MarkupTemplateTypeCheckingExtension extends GroovyTypeCheckingExtensionSup
                 } else {
                     makeDynamic(pexp)
                 }
-            } else if (modelTypesClassNodes==null) {
+            } else if (modelTypesClassNodes == null) {
                 // dynamic mode
                 makeDynamic(pexp)
             }
@@ -175,10 +173,8 @@ class MarkupTemplateTypeCheckingExtension extends GroovyTypeCheckingExtensionSup
 
     @CompileStatic
     private static ClassNode buildNodeFromString(String option, TypeCheckingContext ctx) {
-        Antlr4PluginFactory antlr4PluginFactory = (Antlr4PluginFactory) ParserPluginFactory.antlr4(CompilerConfiguration.DEFAULT)
-        Antlr4ParserPlugin antlr4ParserPlugin = (Antlr4ParserPlugin) antlr4PluginFactory.createParserPlugin()
-        ClassNode parsedNode = antlr4ParserPlugin.makeType(option)
-        ClassNode dummyClass = new ClassNode("dummy", 0, ClassHelper.OBJECT_TYPE)
+        ClassNode parsedNode = Antlr4Utils.parse(option, CompilerConfiguration.DEFAULT)
+        ClassNode dummyClass = new ClassNode("dummy", 0, OBJECT_TYPE)
         dummyClass.setModule(new ModuleNode(ctx.source))
         MethodNode dummyMN = new MethodNode(
                 "dummy",
@@ -193,13 +189,13 @@ class MarkupTemplateTypeCheckingExtension extends GroovyTypeCheckingExtensionSup
             @Override
             void addError(final String msg, final ASTNode expr) {
                 ctx.errorCollector.addErrorAndContinue(new SyntaxErrorMessage(
-                        new SyntaxException(msg + '\n', expr.getLineNumber(), expr.getColumnNumber(), expr.getLastLineNumber(), expr.getLastColumnNumber()),
+                        new SyntaxException(msg + '\n', expr.lineNumber, expr.columnNumber, expr.lastLineNumber, expr.lastColumnNumber),
                         ctx.source)
                 )
             }
         }
         visitor.startResolving(dummyClass, ctx.source)
-        return dummyMN.getReturnType()
+        return dummyMN.returnType
     }
 
     private static class BuilderMethodReplacer extends ClassCodeExpressionTransformer {
@@ -242,7 +238,7 @@ class MarkupTemplateTypeCheckingExtension extends GroovyTypeCheckingExtensionSup
                                 new ConstantExpression(exp.getMethodAsString()),
                                 new ArrayExpression(
                                         OBJECT_TYPE,
-                                        [* args]
+                                        [*args]
                                 )
                         )
                 )


[groovy] 04/05: Trivial refactoring: replace AIC with constructor reference

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

paulk pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit e733ba19eee680f3cf08e8b5c543e664218d6b64
Author: Daniel.Sun <re...@hotmail.com>
AuthorDate: Thu Sep 26 09:29:13 2019 +0800

    Trivial refactoring: replace AIC with constructor reference
---
 .../java/org/apache/groovy/parser/antlr4/Antlr4ParserPlugin.java  | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/Antlr4ParserPlugin.java b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/Antlr4ParserPlugin.java
index 15f233b..fa6aa7b 100644
--- a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/Antlr4ParserPlugin.java
+++ b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/Antlr4ParserPlugin.java
@@ -102,13 +102,7 @@ public class Antlr4ParserPlugin implements ParserPlugin {
                         "Script" + System.nanoTime(),
                         "final " + typeStr + " v",
                         compilerConfiguration,
-                        AccessController.doPrivileged(
-                                new PrivilegedAction<GroovyClassLoader>() {
-                                    @Override
-                                    public GroovyClassLoader run() {
-                                        return new GroovyClassLoader();
-                                    }
-                                }),
+                        AccessController.doPrivileged((PrivilegedAction<GroovyClassLoader>) GroovyClassLoader::new),
                         new ErrorCollector(compilerConfiguration)
                 );
         AstBuilder builder = new AstBuilder(sourceUnit, compilerConfiguration);


[groovy] 01/05: Minor refactoring: implement `makeType` for antlr4 parser plugin

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

paulk pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 2604ef484d477b33a2ebe45dddd16e244a8e7a7e
Author: Daniel.Sun <re...@hotmail.com>
AuthorDate: Wed Sep 25 14:36:08 2019 +0800

    Minor refactoring: implement `makeType` for antlr4 parser plugin
    
    As antlr2 parser will be removed in the future, we should not rely on its API
---
 .../codehaus/groovy/ast/tools/GenericsUtils.java   | 33 ++++-------
 .../MarkupTemplateTypeCheckingExtension.groovy     | 41 +++++--------
 .../groovy/parser/antlr4/Antlr4ParserPlugin.java   | 68 ++++++++++++++++++++++
 3 files changed, 91 insertions(+), 51 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java b/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
index 082d4b1..69beb13 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
@@ -18,14 +18,11 @@
  */
 package org.codehaus.groovy.ast.tools;
 
-import antlr.RecognitionException;
-import antlr.TokenStreamException;
 import groovy.lang.Tuple2;
 import groovy.transform.stc.IncorrectTypeHintException;
+import org.apache.groovy.parser.antlr4.Antlr4ParserPlugin;
+import org.apache.groovy.parser.antlr4.Antlr4PluginFactory;
 import org.codehaus.groovy.GroovyBugError;
-import org.codehaus.groovy.antlr.AntlrParserPlugin;
-import org.codehaus.groovy.antlr.parser.GroovyLexer;
-import org.codehaus.groovy.antlr.parser.GroovyRecognizer;
 import org.codehaus.groovy.ast.ASTNode;
 import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
@@ -34,15 +31,14 @@ import org.codehaus.groovy.ast.MethodNode;
 import org.codehaus.groovy.ast.ModuleNode;
 import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.ast.stmt.EmptyStatement;
+import org.codehaus.groovy.control.CompilationFailedException;
 import org.codehaus.groovy.control.CompilationUnit;
+import org.codehaus.groovy.control.ParserPluginFactory;
 import org.codehaus.groovy.control.ResolveVisitor;
 import org.codehaus.groovy.control.SourceUnit;
 import org.codehaus.groovy.runtime.memoize.ConcurrentSoftCache;
 import org.codehaus.groovy.runtime.memoize.EvictableCache;
-import org.codehaus.groovy.syntax.ParserException;
-import org.codehaus.groovy.syntax.Reduction;
 
-import java.io.StringReader;
 import java.lang.ref.SoftReference;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -53,7 +49,6 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Predicate;
 
 import static groovy.lang.Tuple.tuple;
@@ -587,20 +582,12 @@ public class GenericsUtils {
             final CompilationUnit compilationUnit,
             final MethodNode mn,
             final ASTNode usage) {
-        GroovyLexer lexer = new GroovyLexer(new StringReader("DummyNode<" + option + ">"));
-        final GroovyRecognizer rn = GroovyRecognizer.make(lexer);
+
         try {
-            rn.classOrInterfaceType(true);
-            final AtomicReference<ClassNode> ref = new AtomicReference<ClassNode>();
-            AntlrParserPlugin plugin = new AntlrParserPlugin() {
-                @Override
-                public ModuleNode buildAST(final SourceUnit sourceUnit, final ClassLoader classLoader, final Reduction cst) throws ParserException {
-                    ref.set(makeTypeWithArguments(rn.getAST()));
-                    return null;
-                }
-            };
-            plugin.buildAST(null, null, null);
-            ClassNode parsedNode = ref.get();
+            Antlr4PluginFactory antlr4PluginFactory = (Antlr4PluginFactory) ParserPluginFactory.antlr4(compilationUnit.getConfiguration());
+            Antlr4ParserPlugin antlr4ParserPlugin = (Antlr4ParserPlugin) antlr4PluginFactory.createParserPlugin();
+            ClassNode parsedNode = antlr4ParserPlugin.makeType("DummyNode<" + option + ">");
+
             // the returned node is DummyNode<Param1, Param2, Param3, ...)
             GenericsType[] parsedNodeGenericsTypes = parsedNode.getGenericsTypes();
             if (parsedNodeGenericsTypes == null) {
@@ -612,7 +599,7 @@ public class GenericsUtils {
                 signature[i] = resolveClassNode(sourceUnit, compilationUnit, mn, usage, genericsType.getType());
             }
             return signature;
-        } catch (RecognitionException | ParserException | TokenStreamException e) {
+        } catch (CompilationFailedException e) {
             sourceUnit.addError(new IncorrectTypeHintException(mn, e, usage.getLineNumber(), usage.getColumnNumber()));
         }
         return null;
diff --git a/subprojects/groovy-templates/src/main/groovy/groovy/text/markup/MarkupTemplateTypeCheckingExtension.groovy b/subprojects/groovy-templates/src/main/groovy/groovy/text/markup/MarkupTemplateTypeCheckingExtension.groovy
index 9d91fcf..7db4dc7 100644
--- a/subprojects/groovy-templates/src/main/groovy/groovy/text/markup/MarkupTemplateTypeCheckingExtension.groovy
+++ b/subprojects/groovy-templates/src/main/groovy/groovy/text/markup/MarkupTemplateTypeCheckingExtension.groovy
@@ -19,9 +19,8 @@
 package groovy.text.markup
 
 import groovy.transform.CompileStatic
-import org.codehaus.groovy.antlr.AntlrParserPlugin
-import org.codehaus.groovy.antlr.parser.GroovyLexer
-import org.codehaus.groovy.antlr.parser.GroovyRecognizer
+import org.apache.groovy.parser.antlr4.Antlr4ParserPlugin
+import org.apache.groovy.parser.antlr4.Antlr4PluginFactory
 import org.codehaus.groovy.ast.ASTNode
 import org.codehaus.groovy.ast.ClassCodeExpressionTransformer
 import org.codehaus.groovy.ast.ClassHelper
@@ -39,18 +38,16 @@ import org.codehaus.groovy.ast.expr.MethodCallExpression
 import org.codehaus.groovy.ast.expr.TupleExpression
 import org.codehaus.groovy.ast.expr.VariableExpression
 import org.codehaus.groovy.ast.stmt.EmptyStatement
+import org.codehaus.groovy.control.CompilerConfiguration
+import org.codehaus.groovy.control.ParserPluginFactory
 import org.codehaus.groovy.control.ResolveVisitor
 import org.codehaus.groovy.control.SourceUnit
 import org.codehaus.groovy.control.messages.SyntaxErrorMessage
-import org.codehaus.groovy.syntax.ParserException
-import org.codehaus.groovy.syntax.Reduction
 import org.codehaus.groovy.syntax.SyntaxException
 import org.codehaus.groovy.syntax.Types
 import org.codehaus.groovy.transform.stc.GroovyTypeCheckingExtensionSupport
 import org.codehaus.groovy.transform.stc.TypeCheckingContext
 
-import java.util.concurrent.atomic.AtomicReference
-
 import static org.codehaus.groovy.ast.ClassHelper.OBJECT_TYPE
 import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isAssignment
 
@@ -178,23 +175,11 @@ class MarkupTemplateTypeCheckingExtension extends GroovyTypeCheckingExtensionSup
 
     @CompileStatic
     private static ClassNode buildNodeFromString(String option, TypeCheckingContext ctx) {
-        GroovyLexer lexer = new GroovyLexer(new StringReader(option))
-        final GroovyRecognizer rn = GroovyRecognizer.make(lexer)
-        rn.classOrInterfaceType(true);
-        final AtomicReference<ClassNode> ref = new AtomicReference<ClassNode>();
-        AntlrParserPlugin plugin = new AntlrParserPlugin() {
-            @Override
-            public ModuleNode buildAST(
-                    final SourceUnit sourceUnit,
-                    final ClassLoader classLoader, final Reduction cst) throws ParserException {
-                ref.set(makeTypeWithArguments(rn.getAST()));
-                return null;
-            }
-        };
-        plugin.buildAST(null, null, null);
-        ClassNode parsedNode = ref.get();
-        ClassNode dummyClass = new ClassNode("dummy", 0, ClassHelper.OBJECT_TYPE);
-        dummyClass.setModule(new ModuleNode(ctx.source));
+        Antlr4PluginFactory antlr4PluginFactory = (Antlr4PluginFactory) ParserPluginFactory.antlr4(CompilerConfiguration.DEFAULT)
+        Antlr4ParserPlugin antlr4ParserPlugin = (Antlr4ParserPlugin) antlr4PluginFactory.createParserPlugin()
+        ClassNode parsedNode = antlr4ParserPlugin.makeType(option)
+        ClassNode dummyClass = new ClassNode("dummy", 0, ClassHelper.OBJECT_TYPE)
+        dummyClass.setModule(new ModuleNode(ctx.source))
         MethodNode dummyMN = new MethodNode(
                 "dummy",
                 0,
@@ -203,16 +188,16 @@ class MarkupTemplateTypeCheckingExtension extends GroovyTypeCheckingExtensionSup
                 ClassNode.EMPTY_ARRAY,
                 EmptyStatement.INSTANCE
         )
-        dummyClass.addMethod(dummyMN);
+        dummyClass.addMethod(dummyMN)
         ResolveVisitor visitor = new ResolveVisitor(ctx.compilationUnit) {
             @Override
-            public void addError(final String msg, final ASTNode expr) {
+            void addError(final String msg, final ASTNode expr) {
                 ctx.errorCollector.addErrorAndContinue(new SyntaxErrorMessage(
                         new SyntaxException(msg + '\n', expr.getLineNumber(), expr.getColumnNumber(), expr.getLastLineNumber(), expr.getLastColumnNumber()),
                         ctx.source)
-                );
+                )
             }
-        };
+        }
         visitor.startResolving(dummyClass, ctx.source)
         return dummyMN.getReturnType()
     }
diff --git a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/Antlr4ParserPlugin.java b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/Antlr4ParserPlugin.java
index fa6b381..44e76e5 100644
--- a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/Antlr4ParserPlugin.java
+++ b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/Antlr4ParserPlugin.java
@@ -18,10 +18,18 @@
  */
 package org.apache.groovy.parser.antlr4;
 
+import groovy.lang.GroovyClassLoader;
 import org.codehaus.groovy.GroovyBugError;
+import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.ModuleNode;
+import org.codehaus.groovy.ast.expr.DeclarationExpression;
+import org.codehaus.groovy.ast.expr.Expression;
+import org.codehaus.groovy.ast.expr.VariableExpression;
+import org.codehaus.groovy.ast.stmt.ExpressionStatement;
+import org.codehaus.groovy.ast.stmt.Statement;
 import org.codehaus.groovy.control.CompilationFailedException;
 import org.codehaus.groovy.control.CompilerConfiguration;
+import org.codehaus.groovy.control.ErrorCollector;
 import org.codehaus.groovy.control.ParserPlugin;
 import org.codehaus.groovy.control.SourceUnit;
 import org.codehaus.groovy.control.io.ReaderSource;
@@ -32,6 +40,9 @@ import org.codehaus.groovy.syntax.Reduction;
 
 import java.io.IOException;
 import java.io.Reader;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.List;
 
 /**
  * A parser plugin for the new parser
@@ -77,4 +88,61 @@ public class Antlr4ParserPlugin implements ParserPlugin {
 
         return builder.buildAST();
     }
+
+    /**
+     * Create ClassNode instance for type string
+     *
+     * @param typeStr type string, e.g. List
+     * @return a {@link ClassNode} instance
+     * @since 3.0.0
+     */
+    public ClassNode makeType(String typeStr) {
+        SourceUnit sourceUnit =
+                new SourceUnit(
+                        "Script" + System.nanoTime(),
+                        typeStr + " v",
+                        compilerConfiguration,
+                        AccessController.doPrivileged(
+                                new PrivilegedAction<GroovyClassLoader>() {
+                                    @Override
+                                    public GroovyClassLoader run() {
+                                        return new GroovyClassLoader();
+                                    }
+                                }),
+                        new ErrorCollector(compilerConfiguration)
+                );
+        AstBuilder builder = new AstBuilder(sourceUnit, compilerConfiguration);
+        ModuleNode moduleNode = builder.buildAST();
+
+        List<Statement> statementList = moduleNode.getStatementBlock().getStatements();
+
+        Statement statement;
+        try {
+            statement = statementList.get(0);
+        } catch (IndexOutOfBoundsException e) {
+            throw new GroovyBugError(statementList + " is empty");
+        }
+
+        if (!(statement instanceof ExpressionStatement)) {
+            throw new GroovyBugError(statement + " is not an instance of ExpressionStatement");
+        }
+
+        ExpressionStatement expressionStatement = (ExpressionStatement) statement;
+        Expression expression = expressionStatement.getExpression();
+
+        if (!(expression instanceof DeclarationExpression)) {
+            throw new GroovyBugError(expression + " is not an instance of DeclarationExpression");
+        }
+
+        DeclarationExpression declarationExpression = (DeclarationExpression) expression;
+        Expression leftExpression = declarationExpression.getLeftExpression();
+
+        if (!(leftExpression instanceof VariableExpression)) {
+            throw new GroovyBugError(leftExpression + " is not an instance of VariableExpression");
+        }
+
+        VariableExpression variableExpression = (VariableExpression) leftExpression;
+
+        return variableExpression.getType();
+    }
 }


[groovy] 03/05: Avoid ambiguities when parsing

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

paulk pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 99ad034434b311e18df2af1217084617e0c5607b
Author: Daniel.Sun <re...@hotmail.com>
AuthorDate: Thu Sep 26 08:42:02 2019 +0800

    Avoid ambiguities when parsing
---
 .../main/java/org/apache/groovy/parser/antlr4/Antlr4ParserPlugin.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/Antlr4ParserPlugin.java b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/Antlr4ParserPlugin.java
index 44e76e5..15f233b 100644
--- a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/Antlr4ParserPlugin.java
+++ b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/Antlr4ParserPlugin.java
@@ -100,7 +100,7 @@ public class Antlr4ParserPlugin implements ParserPlugin {
         SourceUnit sourceUnit =
                 new SourceUnit(
                         "Script" + System.nanoTime(),
-                        typeStr + " v",
+                        "final " + typeStr + " v",
                         compilerConfiguration,
                         AccessController.doPrivileged(
                                 new PrivilegedAction<GroovyClassLoader>() {