groovy-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From pa...@apache.org
Subject [groovy] branch GROOVY_2_4_X updated: GROOVY-8953: Imported enum causes compilation bug preventing tests from compiling (port to 2_4_X)
Date Thu, 28 Feb 2019 11:18:47 GMT
This is an automated email from the ASF dual-hosted git repository.

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


The following commit(s) were added to refs/heads/GROOVY_2_4_X by this push:
     new c01a2f6  GROOVY-8953: Imported enum causes compilation bug preventing tests from
compiling (port to 2_4_X)
c01a2f6 is described below

commit c01a2f68e12701198e69e1e56c0e283969c3be05
Author: Paul King <paulk@asert.com.au>
AuthorDate: Wed Feb 27 17:49:34 2019 +1000

    GROOVY-8953: Imported enum causes compilation bug preventing tests from compiling (port
to 2_4_X)
---
 .../org/codehaus/groovy/vmplugin/v5/Java5.java     | 14 +++---
 src/test/groovy/bugs/Groovy8008Bug.java            | 57 +++++++++++++++++-----
 src/test/groovy/bugs/groovy8953/Enum8953.java      | 28 +++++++++++
 .../SyntheticParameterAnnotationsBug.groovy        | 31 ++++++++++++
 4 files changed, 112 insertions(+), 18 deletions(-)

diff --git a/src/main/org/codehaus/groovy/vmplugin/v5/Java5.java b/src/main/org/codehaus/groovy/vmplugin/v5/Java5.java
index 4512e6f..bf5461a 100644
--- a/src/main/org/codehaus/groovy/vmplugin/v5/Java5.java
+++ b/src/main/org/codehaus/groovy/vmplugin/v5/Java5.java
@@ -431,18 +431,20 @@ public class Java5 implements VMPlugin {
         Annotation[][] annotations = constructor.getParameterAnnotations();
         int diff = parameterCount - annotations.length;
         if (diff > 0) {
-            // May happen on JDK8 and below, but we only expect to have to
-            // add a single element to the front of the array to account
-            // for the synthetic outer reference
-            if (diff > 1) {
+            // May happen on JDK8 and below. We add elements to the front of the array to
account for the synthetic params:
+            // - for an inner class we expect one param to account for the synthetic outer
reference
+            // - for an enum we expect two params to account for the synthetic name and ordinal
+            if ((!constructor.getDeclaringClass().isEnum() && diff > 1) || diff
> 2) {
                 throw new GroovyBugError(
                         "Constructor parameter annotations length [" + annotations.length
+ "] " +
                         "does not match the parameter length: " + constructor
                 );
             }
             Annotation[][] adjusted = new Annotation[parameterCount][];
-            adjusted[0] = new Annotation[0];
-            System.arraycopy(annotations, 0, adjusted, 1, annotations.length);
+            for (int i = 0; i < diff; i++) {
+                adjusted[i] = new Annotation[0];
+            }
+            System.arraycopy(annotations, 0, adjusted, diff, annotations.length);
             return adjusted;
         }
         return annotations;
diff --git a/src/test/groovy/bugs/Groovy8008Bug.java b/src/test/groovy/bugs/Groovy8008Bug.java
index 84c1f86..94974ed 100644
--- a/src/test/groovy/bugs/Groovy8008Bug.java
+++ b/src/test/groovy/bugs/Groovy8008Bug.java
@@ -47,7 +47,7 @@ public class Groovy8008Bug extends TestCase {
         Class<Inner> innerClass = Inner.class;
         Constructor<Inner> ctor = innerClass.getDeclaredConstructor(Groovy8008Bug.class,
String.class, Date.class, String.class);
 
-        assertEquals(4, ctor.getParameterTypes().length);       //Groovy8008Bug,String,Date,String
+        assertEquals(4, ctor.getParameterTypes().length);
         // JDK 9 and above correctly report 4
         // assertEquals(3, ctor.getParameterAnnotations().length); //[],[@Anno1,@Anno2],[@Anno2]
 
@@ -58,24 +58,57 @@ public class Groovy8008Bug extends TestCase {
         assertEquals(1, ctors.size());
 
         Parameter[] params = ctors.get(0).getParameters();
+        checkOuterRef(params[0], Groovy8008Bug.class);
+        checkStringWithNoAnnos(params[1]);
+        checkDateWithTwoAnnos(params[2]);
+        checkStringWithOneAnno(params[3]);
 
-        assertEquals(Groovy8008Bug.class.getName(), params[0].getType().getName());
-        assertEquals(0, params[0].getAnnotations().size());
+        // do the same again for an inner inner class
+        Class<Inner.InnerInner> innerInnerClass = Inner.InnerInner.class;
+        Constructor<Inner.InnerInner> innerCtor = innerInnerClass.getDeclaredConstructor(Groovy8008Bug.Inner.class,
String.class, Date.class, String.class);
+        assertEquals(4, innerCtor.getParameterTypes().length);
 
-        assertEquals(String.class.getName(), params[1].getType().getName());
-        assertEquals(0, params[1].getAnnotations().size());
+        cn = new ClassNode(innerInnerClass);
 
-        assertEquals(Date.class.getName(), params[2].getType().getName());
-        assertEquals(2, params[2].getAnnotations().size());
-        assertEquals(TestAnno1.class.getName(), params[2].getAnnotations().get(0).getClassNode().getName());
-        assertEquals(TestAnno2.class.getName(), params[2].getAnnotations().get(1).getClassNode().getName());
+        // trigger the call to VMPlugin#configureClassNode(CompileUnit,ClassNode)
+        ctors = cn.getDeclaredConstructors();
+        assertEquals(1, ctors.size());
+
+        params = ctors.get(0).getParameters();
+        checkOuterRef(params[0], Groovy8008Bug.Inner.class);
+        checkStringWithNoAnnos(params[1]);
+        checkDateWithTwoAnnos(params[2]);
+        checkStringWithOneAnno(params[3]);
+    }
+
+    private void checkOuterRef(Parameter param, Class outerClass) {
+        assertEquals(outerClass.getName(), param.getType().getName());
+        assertEquals(0, param.getAnnotations().size());
+    }
 
-        assertEquals(String.class.getName(), params[3].getType().getName());
-        assertEquals(1, params[3].getAnnotations().size());
-        assertEquals(TestAnno2.class.getName(), params[3].getAnnotations().get(0).getClassNode().getName());
+    private void checkStringWithOneAnno(Parameter param) {
+        assertEquals(String.class.getName(), param.getType().getName());
+        assertEquals(1, param.getAnnotations().size());
+        assertEquals(TestAnno2.class.getName(), param.getAnnotations().get(0).getClassNode().getName());
+    }
+
+    private void checkStringWithNoAnnos(Parameter param) {
+        assertEquals(String.class.getName(), param.getType().getName());
+        assertEquals(0, param.getAnnotations().size());
+    }
+
+    private void checkDateWithTwoAnnos(Parameter param2) {
+        assertEquals(Date.class.getName(), param2.getType().getName());
+        assertEquals(2, param2.getAnnotations().size());
+        assertEquals(TestAnno1.class.getName(), param2.getAnnotations().get(0).getClassNode().getName());
+        assertEquals(TestAnno2.class.getName(), param2.getAnnotations().get(1).getClassNode().getName());
     }
 
     private class Inner {
         private Inner(String arg1, @TestAnno1 @TestAnno2 Date arg2, @TestAnno2 String arg3)
{ }
+
+        private class InnerInner {
+            private InnerInner(String arg1, @TestAnno1 @TestAnno2 Date arg2, @TestAnno2 String
arg3) { }
+        }
     }
 }
diff --git a/src/test/groovy/bugs/groovy8953/Enum8953.java b/src/test/groovy/bugs/groovy8953/Enum8953.java
new file mode 100644
index 0000000..a40a098
--- /dev/null
+++ b/src/test/groovy/bugs/groovy8953/Enum8953.java
@@ -0,0 +1,28 @@
+/*
+ *  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 groovy.bugs.groovy8953;
+
+public enum Enum8953 {
+    A("value");
+    public String value;
+
+    Enum8953(@Deprecated final String value) {
+        this.value = value;
+    }
+}
diff --git a/src/test/groovy/bugs/groovy8953/SyntheticParameterAnnotationsBug.groovy b/src/test/groovy/bugs/groovy8953/SyntheticParameterAnnotationsBug.groovy
new file mode 100644
index 0000000..8d5e297
--- /dev/null
+++ b/src/test/groovy/bugs/groovy8953/SyntheticParameterAnnotationsBug.groovy
@@ -0,0 +1,31 @@
+/*
+ *  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 groovy.bugs.groovy8953
+
+class SyntheticParameterAnnotationsBug extends GroovyTestCase {
+    void testEnumConstructorWithSyntheticParamUsageWithAsmResolvingDisabled() {
+        assertScript '''
+            import org.codehaus.groovy.control.CompilerConfiguration
+
+            def script = "assert groovy.bugs.groovy8953.Enum8953.A.value == 'value'"
+            def config = new CompilerConfiguration()
+            new GroovyShell(config).evaluate(script, "bug8953_dummyName.groovy")
+        '''
+    }
+}


Mime
View raw message