You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2020/03/03 02:00:42 UTC

[groovy] branch master updated (a7e660f -> e9f18de)

This is an automated email from the ASF dual-hosted git repository.

emilles pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git.


    from a7e660f  GROOVY-9412: check bound for generics, not its superclass and interfaces (adjust test)
     new f3881aa  minor edits
     new e9f18de  GROOVY-9413: translate <*> in signature to <?> not <? extends Object>

The 2 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:
 .../groovy/ast/decompiled/TypeSignatureParser.java | 18 +++++++-------
 .../transform/stc/StaticTypeCheckingSupport.java   | 29 ++++++++--------------
 .../transform/stc/StaticTypeCheckingVisitor.java   | 10 +++-----
 src/test/groovy/bugs/Groovy9413.groovy             |  5 ++--
 .../groovy/ast/decompiled/AsmDecompilerTest.groovy |  3 ++-
 5 files changed, 28 insertions(+), 37 deletions(-)


[groovy] 01/02: minor edits

Posted by em...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f3881aaa7e3866f8eda05d8fc42e94c0e0f33cc4
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Mar 2 19:54:47 2020 -0600

    minor edits
---
 .../groovy/ast/decompiled/TypeSignatureParser.java | 16 ++++++------
 .../transform/stc/StaticTypeCheckingSupport.java   | 29 ++++++++--------------
 .../transform/stc/StaticTypeCheckingVisitor.java   | 10 +++-----
 3 files changed, 23 insertions(+), 32 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/decompiled/TypeSignatureParser.java b/src/main/java/org/codehaus/groovy/ast/decompiled/TypeSignatureParser.java
index 67986ef..83e79fa 100644
--- a/src/main/java/org/codehaus/groovy/ast/decompiled/TypeSignatureParser.java
+++ b/src/main/java/org/codehaus/groovy/ast/decompiled/TypeSignatureParser.java
@@ -30,9 +30,10 @@ import java.util.ArrayList;
 import java.util.List;
 
 abstract class TypeSignatureParser extends SignatureVisitor {
+
     private final AsmReferenceResolver resolver;
 
-    public TypeSignatureParser(AsmReferenceResolver resolver) {
+    public TypeSignatureParser(final AsmReferenceResolver resolver) {
         super(CompilerConfiguration.ASM_API_VERSION);
         this.resolver = resolver;
     }
@@ -40,15 +41,15 @@ abstract class TypeSignatureParser extends SignatureVisitor {
     abstract void finished(ClassNode result);
 
     private String baseName;
-    private final List<GenericsType> arguments = new ArrayList<GenericsType>();
+    private final List<GenericsType> arguments = new ArrayList<>();
 
     @Override
-    public void visitTypeVariable(String name) {
+    public void visitTypeVariable(final String name) {
         finished(Java8.configureTypeVariableReference(name));
     }
 
     @Override
-    public void visitBaseType(char descriptor) {
+    public void visitBaseType(final char descriptor) {
         finished(resolver.resolveType(Type.getType(String.valueOf(descriptor))));
     }
 
@@ -64,7 +65,7 @@ abstract class TypeSignatureParser extends SignatureVisitor {
     }
 
     @Override
-    public void visitClassType(String name) {
+    public void visitClassType(final String name) {
         baseName = AsmDecompiler.fromInternalName(name);
     }
 
@@ -90,7 +91,7 @@ abstract class TypeSignatureParser extends SignatureVisitor {
         };
     }
 
-    private static GenericsType createWildcard(ClassNode[] upper, ClassNode lower) {
+    private static GenericsType createWildcard(final ClassNode[] upper, final ClassNode lower) {
         ClassNode base = ClassHelper.makeWithoutCaching("?");
         base.setRedirect(ClassHelper.OBJECT_TYPE);
         GenericsType t = new GenericsType(base, upper, lower);
@@ -99,7 +100,7 @@ abstract class TypeSignatureParser extends SignatureVisitor {
     }
 
     @Override
-    public void visitInnerClassType(String name) {
+    public void visitInnerClassType(final String name) {
         baseName += "$" + name;
         arguments.clear();
     }
@@ -116,5 +117,4 @@ abstract class TypeSignatureParser extends SignatureVisitor {
         bound.setGenericsTypes(arguments.toArray(GenericsType.EMPTY_ARRAY));
         finished(bound);
     }
-
 }
diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
index 08bd784..7f68533 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -441,13 +441,9 @@ public abstract class StaticTypeCheckingSupport {
      * @return true if the class node is assignable to the other class node, false otherwise
      */
     static boolean isAssignableTo(ClassNode type, ClassNode toBeAssignedTo) {
-        if (UNKNOWN_PARAMETER_TYPE == type) return true;
-        if (type == toBeAssignedTo) return true;
-        if (toBeAssignedTo.redirect() == STRING_TYPE && type.redirect() == GSTRING_TYPE) {
-            return true;
-        }
-        if (isPrimitiveType(toBeAssignedTo)) toBeAssignedTo = getWrapper(toBeAssignedTo);
+        if (type == toBeAssignedTo || type == UNKNOWN_PARAMETER_TYPE) return true;
         if (isPrimitiveType(type)) type = getWrapper(type);
+        if (isPrimitiveType(toBeAssignedTo)) toBeAssignedTo = getWrapper(toBeAssignedTo);
         if (NUMBER_TYPES.containsKey(type.redirect()) && NUMBER_TYPES.containsKey(toBeAssignedTo.redirect())) {
             return NUMBER_TYPES.get(type.redirect()) <= NUMBER_TYPES.get(toBeAssignedTo.redirect());
         }
@@ -457,12 +453,11 @@ public abstract class StaticTypeCheckingSupport {
         if (type.isDerivedFrom(GSTRING_TYPE) && STRING_TYPE.equals(toBeAssignedTo)) {
             return true;
         }
-        if (toBeAssignedTo.isDerivedFrom(GSTRING_TYPE) && STRING_TYPE.equals(type)) {
+        if (STRING_TYPE.equals(type) && toBeAssignedTo.isDerivedFrom(GSTRING_TYPE)) {
             return true;
         }
         if (implementsInterfaceOrIsSubclassOf(type, toBeAssignedTo)) {
-            if (OBJECT_TYPE.equals(toBeAssignedTo)) return true;
-            if (toBeAssignedTo.isUsingGenerics()) {
+            if (toBeAssignedTo.getGenericsTypes() != null) {
                 // perform additional check on generics
                 // ? extends toBeAssignedTo
                 GenericsType gt = GenericsUtils.buildWildcardType(toBeAssignedTo);
@@ -678,8 +673,7 @@ public abstract class StaticTypeCheckingSupport {
 
         // on an assignment everything that can be done by a GroovyCast is allowed
 
-        // anything can be assigned to an Object, String, Boolean
-        // or Class typed variable
+        // anything can be assigned to an Object, String, Boolean or Class typed variable
         if (isWildcardLeftHandSide(leftRedirect) && !(boolean_TYPE.equals(left) && rightExpressionIsNull)) return true;
 
         // char as left expression
@@ -837,16 +831,15 @@ public abstract class StaticTypeCheckingSupport {
     }
 
     static String toMethodParametersString(final String methodName, final ClassNode... parameters) {
-        StringBuilder sb = new StringBuilder();
-        sb.append(methodName).append("(");
+        StringBuilder sb = new StringBuilder(methodName);
+        sb.append('(');
         if (parameters != null) {
-            for (int i = 0, parametersLength = parameters.length; i < parametersLength; i += 1) {
-                final ClassNode parameter = parameters[i];
-                sb.append(prettyPrintType(parameter));
-                if (i < parametersLength - 1) sb.append(", ");
+            for (int i = 0, n = parameters.length; i < n; i += 1) {
+                sb.append(prettyPrintType(parameters[i]));
+                if (i < n - 1) sb.append(", ");
             }
         }
-        sb.append(")");
+        sb.append(')');
         return sb.toString();
     }
 
diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 1a72af2..e41f14b 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -5369,15 +5369,13 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
     protected boolean typeCheckMethodsWithGenericsOrFail(final ClassNode receiver, final ClassNode[] arguments, final MethodNode candidateMethod, final Expression location) {
         if (!typeCheckMethodsWithGenerics(receiver, arguments, candidateMethod)) {
             Map<GenericsTypeName, GenericsType> classGTs = GenericsUtils.extractPlaceholders(receiver);
-            ClassNode[] ptypes = new ClassNode[candidateMethod.getParameters().length];
             Parameter[] parameters = candidateMethod.getParameters();
+            ClassNode[] paramTypes = new ClassNode[parameters.length];
             for (int i = 0, n = parameters.length; i < n; i += 1) {
-                Parameter parameter = parameters[i];
-                ClassNode type = parameter.getType();
-                ptypes[i] = fullyResolveType(type, classGTs);
+                paramTypes[i] = fullyResolveType(parameters[i].getType(), classGTs);
             }
             addStaticTypeError("Cannot call " + toMethodGenericTypesString(candidateMethod) + receiver.toString(false) + "#" +
-                    toMethodParametersString(candidateMethod.getName(), ptypes) + " with arguments " + formatArgumentList(arguments), location);
+                    toMethodParametersString(candidateMethod.getName(), paramTypes) + " with arguments " + formatArgumentList(arguments), location);
             return false;
         }
         return true;
@@ -5392,7 +5390,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
     protected static String formatArgumentList(final ClassNode[] nodes) {
         if (nodes == null || nodes.length == 0) return "[]";
         StringBuilder sb = new StringBuilder(24 * nodes.length);
-        sb.append("[");
+        sb.append('[');
         for (ClassNode node : nodes) {
             sb.append(prettyPrintType(node));
             sb.append(", ");


[groovy] 02/02: GROOVY-9413: translate <*> in signature to not

Posted by em...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit e9f18ded75c88bd23334318d1406d4b6cc0ff81f
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Mar 2 19:57:49 2020 -0600

    GROOVY-9413: translate <*> in signature to <?> not <? extends Object>
---
 .../java/org/codehaus/groovy/ast/decompiled/TypeSignatureParser.java | 2 +-
 src/test/groovy/bugs/Groovy9413.groovy                               | 5 ++---
 src/test/org/codehaus/groovy/ast/decompiled/AsmDecompilerTest.groovy | 3 ++-
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/decompiled/TypeSignatureParser.java b/src/main/java/org/codehaus/groovy/ast/decompiled/TypeSignatureParser.java
index 83e79fa..691d7e8 100644
--- a/src/main/java/org/codehaus/groovy/ast/decompiled/TypeSignatureParser.java
+++ b/src/main/java/org/codehaus/groovy/ast/decompiled/TypeSignatureParser.java
@@ -71,7 +71,7 @@ abstract class TypeSignatureParser extends SignatureVisitor {
 
     @Override
     public void visitTypeArgument() {
-        arguments.add(createWildcard(new ClassNode[]{ClassHelper.OBJECT_TYPE}, null));
+        arguments.add(createWildcard(null, null));
     }
 
     @Override
diff --git a/src/test/groovy/bugs/Groovy9413.groovy b/src/test/groovy/bugs/Groovy9413.groovy
index 02bfa0a..03f026c 100644
--- a/src/test/groovy/bugs/Groovy9413.groovy
+++ b/src/test/groovy/bugs/Groovy9413.groovy
@@ -18,14 +18,13 @@
  */
 package groovy.bugs
 
-import groovy.test.NotYetImplemented
 import org.codehaus.groovy.control.CompilerConfiguration
 import org.codehaus.groovy.tools.javac.JavaAwareCompilationUnit
 import org.junit.Test
 
 final class Groovy9413 {
-
-    @Test @NotYetImplemented
+// .\gradlew --no-daemon --max-workers 2 :test --tests groovy.bugs.Groovy9413 --debug-jvm
+    @Test
     void testInterfaceGenerics() {
         def config = new CompilerConfiguration(
             targetDirectory: File.createTempDir(),
diff --git a/src/test/org/codehaus/groovy/ast/decompiled/AsmDecompilerTest.groovy b/src/test/org/codehaus/groovy/ast/decompiled/AsmDecompilerTest.groovy
index 0a5b1c0..73decc5 100644
--- a/src/test/org/codehaus/groovy/ast/decompiled/AsmDecompilerTest.groovy
+++ b/src/test/org/codehaus/groovy/ast/decompiled/AsmDecompilerTest.groovy
@@ -240,7 +240,8 @@ class AsmDecompilerTest extends TestCase {
 
         def wildcard = ret.genericsTypes[0]
         assert wildcard.wildcard
-        assert wildcard.upperBounds[0].name == Object.name
+        assert wildcard.lowerBound == null
+        assert wildcard.upperBounds == null
     }
 
     void "test non-generic exceptions"() {