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 2017/03/21 12:15:26 UTC

[1/2] groovy git commit: tweak build to report snapshot dependencies found during non-snapshot release

Repository: groovy
Updated Branches:
  refs/heads/GROOVY_2_5_X 6f3827c36 -> b9a6f4159


tweak build to report snapshot dependencies found during non-snapshot release


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/81ed19f9
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/81ed19f9
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/81ed19f9

Branch: refs/heads/GROOVY_2_5_X
Commit: 81ed19f9a7c71d4fad3b2359294e7c3fd7ac780c
Parents: 6f3827c
Author: paulk <pa...@asert.com.au>
Authored: Tue Mar 21 21:06:51 2017 +1000
Committer: paulk <pa...@asert.com.au>
Committed: Tue Mar 21 22:15:01 2017 +1000

----------------------------------------------------------------------
 gradle/assemble.gradle | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/81ed19f9/gradle/assemble.gradle
----------------------------------------------------------------------
diff --git a/gradle/assemble.gradle b/gradle/assemble.gradle
index f83e2e6..57a0bbb 100644
--- a/gradle/assemble.gradle
+++ b/gradle/assemble.gradle
@@ -586,6 +586,22 @@ task installGroovy(type: Sync, dependsOn: [checkCompatibility, distBin]) {
     into installDir
 }
 
+task checkNoSnapshotVersions {
+    doLast {
+        if (project.isReleaseVersion) {
+            // TODO use modules() and exclusions as per distSpec
+            allprojects {
+                project.configurations.runtime.resolvedConfiguration.resolvedArtifacts.each {
+                    if (it.moduleVersion.id.version.endsWith("-SNAPSHOT")) {
+                        throw new GradleException("Found snapshot dependency for non-snapshot Groovy: " + it.moduleVersion)
+                    }
+                }
+            }
+        }
+    }
+}
+distBin.dependsOn checkNoSnapshotVersions
+
 import org.gradle.api.file.DuplicatesStrategy
 
 task dist(type: Zip, dependsOn: [checkCompatibility, distBin, distSrc, distDoc, syncDoc]) {


[2/2] groovy git commit: Simplify MacroGroovy substitutions' implementation (closes #443)

Posted by pa...@apache.org.
Simplify MacroGroovy substitutions' implementation (closes #443)

Assume the order of substitutions, so we can use a list instead of a map to pass the context. Fixes some related issues to Antlr4 migration.


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/b9a6f415
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/b9a6f415
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/b9a6f415

Branch: refs/heads/GROOVY_2_5_X
Commit: b9a6f4159d32d92a7b6cc710bfa4d70697752ad4
Parents: 81ed19f
Author: Sergei Egorov <se...@zeroturnaround.com>
Authored: Sat Oct 8 20:19:12 2016 +0300
Committer: paulk <pa...@asert.com.au>
Committed: Tue Mar 21 22:15:10 2017 +1000

----------------------------------------------------------------------
 .../groovy/macro/runtime/MacroBuilder.java      | 23 ++---
 .../macro/runtime/MacroSubstitutionKey.java     | 99 --------------------
 .../macro/transform/MacroInvocationTrap.java    | 23 ++---
 .../org/codehaus/groovy/macro/MacroTest.groovy  | 23 +++++
 4 files changed, 39 insertions(+), 129 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/b9a6f415/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroBuilder.java
----------------------------------------------------------------------
diff --git a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroBuilder.java b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroBuilder.java
index ab4c4f3..d7cc5ce 100644
--- a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroBuilder.java
+++ b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroBuilder.java
@@ -33,8 +33,8 @@ import org.codehaus.groovy.control.SourceUnit;
 import org.codehaus.groovy.macro.transform.MacroInvocationTrap;
 import org.codehaus.groovy.macro.transform.MacroTransformation;
 
+import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
@@ -44,27 +44,25 @@ import java.util.concurrent.atomic.AtomicInteger;
 public enum MacroBuilder {
     INSTANCE;
 
-    public <T> T macro(String source, final Map<MacroSubstitutionKey, Closure<Expression>> context, Class<T> resultClass) {
+    public <T> T macro(String source, final List<Closure<Expression>> context, Class<T> resultClass) {
         return macro(false, source, context, resultClass);
     }
 
-    public <T> T macro(boolean asIs, String source, final Map<MacroSubstitutionKey, Closure<Expression>> context, Class<T> resultClass) {
+    public <T> T macro(boolean asIs, String source, final List<Closure<Expression>> context, Class<T> resultClass) {
         return macro(CompilePhase.CONVERSION, asIs, source, context, resultClass);
     }
 
-    public <T> T macro(CompilePhase compilePhase, String source, final Map<MacroSubstitutionKey, Closure<Expression>> context, Class<T> resultClass) {
+    public <T> T macro(CompilePhase compilePhase, String source, final List<Closure<Expression>> context, Class<T> resultClass) {
         return macro(compilePhase, false, source, context, resultClass);
     }
 
     private final static AtomicInteger COUNTER = new AtomicInteger();
 
     @SuppressWarnings("unchecked")
-    public <T> T macro(CompilePhase compilePhase, boolean asIs, String source, final Map<MacroSubstitutionKey, Closure<Expression>> context, Class<T> resultClass) {
+    public <T> T macro(CompilePhase compilePhase, boolean asIs, String source, final List<Closure<Expression>> context, Class<T> resultClass) {
         boolean isClosure = source.startsWith("{");
         final String label = isClosure ?"__synthesized__label__" + COUNTER.incrementAndGet() + "__:":"";
         final String labelledSource = label + source;
-        final int linesOffset = 1;
-        final int columnsOffset = label.length() + (isClosure?1:0); // +1 because of {
 
         List<ASTNode> nodes = (new AstBuilder()).buildFromString(compilePhase, true, labelledSource);
 
@@ -75,21 +73,22 @@ public enum MacroBuilder {
                 if (!statements.isEmpty()) {
                     BlockStatement closureBlock = (BlockStatement) statements.get(0);
 
-                    performSubstitutions(linesOffset, columnsOffset, context, closureBlock);
+                    performSubstitutions(context, closureBlock);
 
 
                     return (T) getMacroValue(closureBlock, asIs);
                 }
             }
             if (node instanceof ClassNode) {
-                performSubstitutions(linesOffset, columnsOffset, context, node);
+                performSubstitutions(context, node);
                 return (T) node;
             }
         }
         return null;
     }
 
-    private static void performSubstitutions(final int linesOffset, final int columnsOffset, final Map<MacroSubstitutionKey, Closure<Expression>> context, final ASTNode astNode) {
+    private static void performSubstitutions(final List<Closure<Expression>> context, final ASTNode astNode) {
+        final Iterator<Closure<Expression>> iterator = context.iterator();
         ClassCodeExpressionTransformer trn = new ClassCodeExpressionTransformer() {
             public Expression transform(Expression expression) {
                 if (!(expression instanceof MethodCallExpression)) {
@@ -102,9 +101,7 @@ public enum MacroBuilder {
                     return super.transform(expression);
                 }
 
-                MacroSubstitutionKey key = new MacroSubstitutionKey(call, linesOffset, columnsOffset);
-
-                return context.get(key).call();
+                return iterator.next().call();
             }
 
             @Override

http://git-wip-us.apache.org/repos/asf/groovy/blob/b9a6f415/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroSubstitutionKey.java
----------------------------------------------------------------------
diff --git a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroSubstitutionKey.java b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroSubstitutionKey.java
deleted file mode 100644
index 5b382e5..0000000
--- a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroSubstitutionKey.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *  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.
- */
-package org.codehaus.groovy.macro.runtime;
-
-import org.codehaus.groovy.ast.ClassHelper;
-import org.codehaus.groovy.ast.expr.ArgumentListExpression;
-import org.codehaus.groovy.ast.expr.ConstantExpression;
-import org.codehaus.groovy.ast.expr.ConstructorCallExpression;
-import org.codehaus.groovy.ast.expr.Expression;
-
-/**
- *
- * @author Sergei Egorov <bs...@gmail.com>
- */
-public class MacroSubstitutionKey {
-
-    private final int startLine;
-    private final int startColumn;
-    private final int endLine;
-    private final int endColumn;
-
-    public MacroSubstitutionKey(int startLine, int startColumn, int endLine, int endColumn) {
-        this.startLine = startLine;
-        this.startColumn = startColumn;
-        this.endLine = endLine;
-        this.endColumn = endColumn;
-    }
-
-    public MacroSubstitutionKey(Expression expression, int linesOffset, int columnsOffset) {
-        this(
-                expression.getLineNumber() - linesOffset,
-                expression.getColumnNumber() - (expression.getLineNumber() == linesOffset ? columnsOffset : 0),
-                expression.getLastLineNumber() - linesOffset,
-                expression.getLastColumnNumber() - (expression.getLastLineNumber() == linesOffset ? columnsOffset : 0)
-        );
-    }
-
-    public ConstructorCallExpression toConstructorCallExpression() {
-        return new ConstructorCallExpression(
-                ClassHelper.make(this.getClass()),
-                new ArgumentListExpression(new Expression[] {
-                        new ConstantExpression(startLine),
-                        new ConstantExpression(startColumn),
-                        new ConstantExpression(endLine),
-                        new ConstantExpression(endColumn)
-                })
-        );
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        MacroSubstitutionKey that = (MacroSubstitutionKey) o;
-
-        if (endColumn != that.endColumn) return false;
-        if (endLine != that.endLine) return false;
-        if (startColumn != that.startColumn) return false;
-        if (startLine != that.startLine) return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = startLine;
-        result = 31 * result + startColumn;
-        result = 31 * result + endLine;
-        result = 31 * result + endColumn;
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return "SubstitutionKey{" +
-                "startLine=" + startLine +
-                ", startColumn=" + startColumn +
-                ", endLine=" + endLine +
-                ", endColumn=" + endColumn +
-                '}';
-    }
-}

http://git-wip-us.apache.org/repos/asf/groovy/blob/b9a6f415/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroInvocationTrap.java
----------------------------------------------------------------------
diff --git a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroInvocationTrap.java b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroInvocationTrap.java
index a8cac37..73c14db 100644
--- a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroInvocationTrap.java
+++ b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroInvocationTrap.java
@@ -30,7 +30,7 @@ import org.codehaus.groovy.ast.expr.ClosureExpression;
 import org.codehaus.groovy.ast.expr.ConstantExpression;
 import org.codehaus.groovy.ast.expr.ConstructorCallExpression;
 import org.codehaus.groovy.ast.expr.Expression;
-import org.codehaus.groovy.ast.expr.MapExpression;
+import org.codehaus.groovy.ast.expr.ListExpression;
 import org.codehaus.groovy.ast.expr.MethodCallExpression;
 import org.codehaus.groovy.ast.expr.PropertyExpression;
 import org.codehaus.groovy.ast.expr.TupleExpression;
@@ -40,13 +40,10 @@ import org.codehaus.groovy.ast.tools.GeneralUtils;
 import org.codehaus.groovy.control.SourceUnit;
 import org.codehaus.groovy.control.io.ReaderSource;
 import org.codehaus.groovy.macro.runtime.MacroBuilder;
-import org.codehaus.groovy.macro.runtime.MacroSubstitutionKey;
 
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
 
 import static org.codehaus.groovy.ast.expr.VariableExpression.THIS_EXPRESSION;
 
@@ -126,8 +123,6 @@ public class MacroInvocationTrap extends MethodInvocationTrap {
             return true;
         }
 
-        final MapExpression mapExpression = buildSubstitutionMap(closureExpression);
-
         String source = convertClosureToSource(closureExpression);
 
         BlockStatement closureBlock = (BlockStatement) closureExpression.getCode();
@@ -159,7 +154,7 @@ public class MacroInvocationTrap extends MethodInvocationTrap {
         macroArgumentsExpressions.remove(macroArgumentsExpressions.size() - 1);
 
         macroArgumentsExpressions.add(new ConstantExpression(source));
-        macroArgumentsExpressions.add(mapExpression);
+        macroArgumentsExpressions.add(buildSubstitutionMap(closureExpression));
         macroArgumentsExpressions.add(new ClassExpression(ClassHelper.makeWithoutCaching(MacroBuilder.getMacroValue(closureBlock, asIs).getClass(), false)));
 
         macroCall.setObjectExpression(new PropertyExpression(new ClassExpression(ClassHelper.makeWithoutCaching(MacroBuilder.class, false)), "INSTANCE"));
@@ -170,9 +165,8 @@ public class MacroInvocationTrap extends MethodInvocationTrap {
         return true;
     }
 
-    private MapExpression buildSubstitutionMap(final ASTNode expr) {
-        final Map<MacroSubstitutionKey, ClosureExpression> map = new HashMap<MacroSubstitutionKey, ClosureExpression>();
-        final MapExpression mapExpression = new MapExpression();
+    private ListExpression buildSubstitutionMap(final ASTNode expr) {
+        final ListExpression listExpression = new ListExpression();
 
         ClassCodeVisitorSupport visitor = new ClassCodeVisitorSupport() {
             @Override
@@ -206,9 +200,7 @@ public class MacroInvocationTrap extends MethodInvocationTrap {
                         ((BlockStatement) code).setVariableScope(null);
                     }
 
-                    MacroSubstitutionKey key = new MacroSubstitutionKey(call, expr.getLineNumber(), expr.getColumnNumber());
-
-                    map.put(key, substitutionClosureExpression);
+                    listExpression.addExpression(substitutionClosureExpression);
                 }
             }
         };
@@ -217,10 +209,7 @@ public class MacroInvocationTrap extends MethodInvocationTrap {
         } else {
             expr.visit(visitor);
         }
-        for (Map.Entry<MacroSubstitutionKey, ClosureExpression> entry : map.entrySet()) {
-            mapExpression.addMapEntryExpression(entry.getKey().toConstructorCallExpression(), entry.getValue());
-        }
-        return mapExpression;
+        return listExpression;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/groovy/blob/b9a6f415/subprojects/groovy-macro/src/test/groovy/org/codehaus/groovy/macro/MacroTest.groovy
----------------------------------------------------------------------
diff --git a/subprojects/groovy-macro/src/test/groovy/org/codehaus/groovy/macro/MacroTest.groovy b/subprojects/groovy-macro/src/test/groovy/org/codehaus/groovy/macro/MacroTest.groovy
index 3b740c9..1febbfa 100644
--- a/subprojects/groovy-macro/src/test/groovy/org/codehaus/groovy/macro/MacroTest.groovy
+++ b/subprojects/groovy-macro/src/test/groovy/org/codehaus/groovy/macro/MacroTest.groovy
@@ -186,4 +186,27 @@ class MacroTest extends GroovyTestCase {
         AstAssert.assertSyntaxTree([expected], [getReturnStatement()]);
 '''
     }
+
+    void testMultipleSubstitutions() {
+        assertScript '''
+        import org.codehaus.groovy.ast.expr.*;
+        import org.codehaus.groovy.ast.stmt.*;
+        import org.codehaus.groovy.ast.ClassHelper;
+        import org.codehaus.groovy.ast.builder.AstAssert;
+
+        import static org.codehaus.groovy.ast.tools.GeneralUtils.*;
+
+        def var1 = new VariableExpression("a")
+        def var2 = new VariableExpression("b")
+        def var3 = new VariableExpression("c")
+
+        ReturnStatement result = macro {
+            return new NonExistingClass($v{var1}, $v{var2}) + $v{var3}
+        }
+
+        def expected = returnS(plusX(ctorX(ClassHelper.make("NonExistingClass"), args(var1, var2)), var3))
+
+        AstAssert.assertSyntaxTree([expected], [result])
+'''
+    }
 }