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/01/26 05:30:56 UTC

[22/50] groovy git commit: GROOVY-7966: Change in source order changes output in Java+Groovy joint compilation (closes #471)

GROOVY-7966: Change in source order changes output in Java+Groovy joint compilation (closes #471)


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

Branch: refs/heads/GROOVY_2_4_X
Commit: 6c410852b10aca71460ceff321e9839138a53cdc
Parents: 5690446
Author: paulk <pa...@asert.com.au>
Authored: Thu Dec 8 16:59:42 2016 +1000
Committer: paulk <pa...@asert.com.au>
Committed: Fri Dec 9 20:04:13 2016 +1000

----------------------------------------------------------------------
 .../groovy/control/OptimizerVisitor.java        | 41 ++++++++++++--
 .../tools/stubgenerator/Groovy7966Bug.groovy    | 58 ++++++++++++++++++++
 2 files changed, 94 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/6c410852/src/main/org/codehaus/groovy/control/OptimizerVisitor.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/control/OptimizerVisitor.java b/src/main/org/codehaus/groovy/control/OptimizerVisitor.java
index e508d35..6aa0b28 100644
--- a/src/main/org/codehaus/groovy/control/OptimizerVisitor.java
+++ b/src/main/org/codehaus/groovy/control/OptimizerVisitor.java
@@ -19,6 +19,7 @@
 package org.codehaus.groovy.control;
 
 import org.codehaus.groovy.ast.ClassCodeExpressionTransformer;
+import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.FieldNode;
 import org.codehaus.groovy.ast.expr.ClosureExpression;
@@ -26,13 +27,18 @@ import org.codehaus.groovy.ast.expr.ConstantExpression;
 import org.codehaus.groovy.ast.expr.Expression;
 import org.objectweb.asm.Opcodes;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 
 /**
- * Visitor to produce several optimizations
- *  - to replace numbered constants with references to static fields
- *
- * @author Alex Tkachman
+ * Visitor to produce several optimizations:
+ * <ul>
+ *     <li>to replace numbered constants with references to static fields</li>
+ *     <li>remove superfluous references to GroovyObject interface</li>
+ * </ul>
  */
 public class OptimizerVisitor extends ClassCodeExpressionTransformer {
     private ClassNode currentClass;
@@ -51,6 +57,31 @@ public class OptimizerVisitor extends ClassCodeExpressionTransformer {
         missingFields.clear();
         super.visitClass(node);
         addMissingFields();
+        pruneUnneededGroovyObjectInterface(node);
+    }
+
+    private void pruneUnneededGroovyObjectInterface(ClassNode node) {
+        ClassNode superClass = node.getSuperClass();
+        boolean isSuperGroovy = superClass.isDerivedFromGroovyObject();
+        if (isSuperGroovy) {
+            ClassNode[] interfaces = node.getInterfaces();
+            boolean needsFix = false;
+            for (ClassNode classNode : interfaces) {
+                if (classNode.equals(ClassHelper.GROOVY_OBJECT_TYPE)) {
+                    needsFix = true;
+                    break;
+                }
+            }
+            if (needsFix) {
+                List<ClassNode> newInterfaces = new ArrayList<ClassNode>(interfaces.length);
+                for (ClassNode classNode : interfaces) {
+                    if (!classNode.equals(ClassHelper.GROOVY_OBJECT_TYPE)) {
+                        newInterfaces.add(classNode);
+                    }
+                }
+                node.setInterfaces(newInterfaces.toArray(new ClassNode[newInterfaces.size()]));
+            }
+        }
     }
 
     private void addMissingFields() {

http://git-wip-us.apache.org/repos/asf/groovy/blob/6c410852/src/test/org/codehaus/groovy/tools/stubgenerator/Groovy7966Bug.groovy
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/tools/stubgenerator/Groovy7966Bug.groovy b/src/test/org/codehaus/groovy/tools/stubgenerator/Groovy7966Bug.groovy
new file mode 100644
index 0000000..acdca6b
--- /dev/null
+++ b/src/test/org/codehaus/groovy/tools/stubgenerator/Groovy7966Bug.groovy
@@ -0,0 +1,58 @@
+/*
+ *  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.tools.stubgenerator
+
+/**
+ * Test that fileorder doesn't impact whether GroovyObject appears in implements list.
+ */
+class Groovy7966Bug extends StringSourcesStubTestCase {
+
+    @Override
+    Map<String, String> provideSources() {
+        [
+                'Before.groovy' : '''
+                  class Before extends AbstractThing {}
+                ''',
+                'AbstractThing.groovy' : '''
+                  abstract class AbstractThing {}
+                ''',
+                'JavaThing.java' : '''
+                  public class JavaThing {
+                  }
+                ''',
+                'After.groovy' : '''
+                  class After extends AbstractThing {}
+                ''',
+        ]
+    }
+
+    @Override
+    protected List<File> collectSources(File path) {
+        // parent method uses order returned by the file system - we want to maintain supplied order
+        return provideSources().collect{ name, _ -> new File(path, name) }
+    }
+
+    @Override
+    void verifyStubs() {
+        // actually, we don't care about the stubs but let's verify the resulting class files
+        def classLoader = new URLClassLoader([targetDir.toURI().toURL()] as URL[], loader)
+        assert classLoader.loadClass('Before').interfaces.length == 0
+        assert classLoader.loadClass('After').interfaces.length == 0
+    }
+}