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