You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2020/02/29 06:58:49 UTC
[groovy] branch master updated: GROOVY-9427: Regression in GString
handling
This is an automated email from the ASF dual-hosted git repository.
sunlan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new edfbce3 GROOVY-9427: Regression in GString handling
edfbce3 is described below
commit edfbce3ba41984c56fcae386cd3dacc9b7f2a984
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sat Feb 29 14:30:42 2020 +0800
GROOVY-9427: Regression in GString handling
---
src/antlr/GroovyParser.g4 | 1 -
.../apache/groovy/parser/antlr4/AstBuilder.java | 45 ++++++++++------------
.../groovy/parser/antlr4/GroovyParserTest.groovy | 4 ++
.../src/test/resources/bugs/BUG-GROOVY-9427.groovy | 19 +++++++++
4 files changed, 44 insertions(+), 25 deletions(-)
diff --git a/src/antlr/GroovyParser.g4 b/src/antlr/GroovyParser.g4
index ef6cd79..a4fbf14 100644
--- a/src/antlr/GroovyParser.g4
+++ b/src/antlr/GroovyParser.g4
@@ -446,7 +446,6 @@ gstring
gstringValue
: gstringPath
- | LBRACE statementExpression? RBRACE
| closure
;
diff --git a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
index 82baee7..ba6e1c4 100644
--- a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
+++ b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
@@ -762,7 +762,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> {
}
ctx.catchClause().stream().map(this::visitCatchClause)
- .reduce(new LinkedList<CatchStatement>(), (r, e) -> {
+ .reduce(new LinkedList<>(), (r, e) -> {
r.addAll(e); // merge several LinkedList<CatchStatement> instances into one LinkedList<CatchStatement> instance
return r;
})
@@ -3462,21 +3462,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> {
stringLiteralList.add(configureAST(new ConstantExpression(parseGStringEnd(ctx, beginQuotation)), ctx.GStringEnd()));
List<Expression> values = ctx.gstringValue().stream()
- .map(e -> {
- Expression expression = this.visitGstringValue(e);
-
- if (expression instanceof ClosureExpression && !hasArrow(e)) {
- List<Statement> statementList = ((BlockStatement) ((ClosureExpression) expression).getCode()).getStatements();
-
- if (statementList.stream().noneMatch(DefaultGroovyMethods::asBoolean)) {
- return configureAST(new ConstantExpression(null), e);
- }
-
- return configureAST(this.createCallMethodCallExpression(expression, new ArgumentListExpression(), true), e);
- }
-
- return expression;
- })
+ .map(this::visitGstringValue)
.collect(Collectors.toList());
StringBuilder verbatimText = new StringBuilder(ctx.getText().length());
@@ -3546,16 +3532,27 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> {
return configureAST(this.visitGstringPath(ctx.gstringPath()), ctx);
}
- if (asBoolean(ctx.LBRACE())) {
- if (asBoolean(ctx.statementExpression())) {
- return configureAST(((ExpressionStatement) this.visit(ctx.statementExpression())).getExpression(), ctx.statementExpression());
- } else { // e.g. "${}"
- return configureAST(new ConstantExpression(null), ctx);
+ if (asBoolean(ctx.closure())) {
+ ClosureExpression closureExpression = this.visitClosure(ctx.closure());
+ if (!hasArrow(ctx)) {
+ List<Statement> statementList = ((BlockStatement) closureExpression.getCode()).getStatements();
+ int size = statementList.size();
+ if (1 == size) {
+ Statement statement = statementList.get(0);
+ if (statement instanceof ExpressionStatement) {
+ Expression expression = ((ExpressionStatement) statement).getExpression();
+ if (!(expression instanceof DeclarationExpression)) {
+ return expression;
+ }
+ }
+ } else if (0 == size) {
+ return configureAST(new ConstantExpression(null), ctx);
+ }
+
+ return configureAST(this.createCallMethodCallExpression(closureExpression, new ArgumentListExpression(), true), ctx);
}
- }
- if (asBoolean(ctx.closure())) {
- return configureAST(this.visitClosure(ctx.closure()), ctx);
+ return configureAST(closureExpression, ctx);
}
throw createParsingFailedException("Unsupported gstring value: " + ctx.getText(), ctx);
diff --git a/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy b/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy
index 2c7d435..33a4813 100644
--- a/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy
+++ b/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy
@@ -438,4 +438,8 @@ final class GroovyParserTest extends GroovyTestCase {
doRunAndTestAntlr4('bugs/BUG-GROOVY-8991.groovy')
doTest('bugs/BUG-GROOVY-9399.groovy')
}
+
+ void "test groovy core - GROOVY-9427"() {
+ doTest('bugs/BUG-GROOVY-9427.groovy');
+ }
}
diff --git a/subprojects/parser-antlr4/src/test/resources/bugs/BUG-GROOVY-9427.groovy b/subprojects/parser-antlr4/src/test/resources/bugs/BUG-GROOVY-9427.groovy
new file mode 100644
index 0000000..37f5ae2
--- /dev/null
+++ b/subprojects/parser-antlr4/src/test/resources/bugs/BUG-GROOVY-9427.groovy
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+"${String s}"
\ No newline at end of file