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 08:45:26 UTC

[groovy] branch master updated (7f4fbef -> ac64c64)

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

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


    from 7f4fbef  Merge branch 'master' of https://gitbox.apache.org/repos/asf/groovy
     new e59b552  Minor refactoring: implement `makeType` for antlr4 parser plugin
     new 80441d1  makeType refactor (closes #1009)
     new 1f0dd52  Avoid ambiguities when parsing
     new 288767e  Trivial refactoring: replace AIC with constructor reference
     new ac64c64  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 master
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit ac64c64518a4d8fb2d017eb982564d7d3410a09b
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] 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 master
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 1f0dd524371bda188ae25a36d389b98577912079
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>() {


[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 master
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 288767e01eeafc4c501173e2d7882bb9eeb7dc5f
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] 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 master
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 80441d191ae88018ec81a8afd396d7342664b9a9
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] 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 master
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit e59b5529e34291443f4965dcd78b6eb0a9f37e1b
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();
+    }
 }