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 2022/08/24 20:40:51 UTC

[groovy] branch GROOVY_2_5_X updated: GROOVY-9529: STC: bump `Object` distance to match interface DGM

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

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


The following commit(s) were added to refs/heads/GROOVY_2_5_X by this push:
     new 716f8f00ca GROOVY-9529: STC: bump `Object` distance to match interface DGM
716f8f00ca is described below

commit 716f8f00ca77eaa2905d8d4a86f6e3314a1e274c
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Wed Aug 24 15:33:55 2022 -0500

    GROOVY-9529: STC: bump `Object` distance to match interface DGM
---
 .../transform/stc/StaticTypeCheckingSupport.java    | 13 ++++++-------
 .../stc/DefaultGroovyMethodsSTCTest.groovy          | 21 +++++++++++++++++++++
 2 files changed, 27 insertions(+), 7 deletions(-)

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 f1428f3aea..d4263dcb81 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -986,22 +986,21 @@ public abstract class StaticTypeCheckingSupport {
                 break;
             }
             ref = ref.getSuperClass();
-            dist++;
-            if (ref == null) dist++;
+            dist += 1;
+            if (OBJECT_TYPE.equals(ref)) dist += 1; // GROOVY-9529
             dist = (dist + 1) << 1;
         }
         return dist;
     }
 
-    private static int getMaximumInterfaceDistance(ClassNode c, ClassNode interfaceClass) {
+    private static int getMaximumInterfaceDistance(final ClassNode c, final ClassNode interfaceClass) {
         // -1 means a mismatch
         if (c == null) return -1;
         // 0 means a direct match
         if (c.equals(interfaceClass)) return 0;
         ClassNode[] interfaces = c.getInterfaces();
         int max = -1;
-        for (int i = 0; i < interfaces.length; i++) {
-            final ClassNode anInterface = interfaces[i];
+        for (ClassNode anInterface : interfaces) {
             int sub = getMaximumInterfaceDistance(anInterface, interfaceClass);
             // we need to keep the -1 to track the mismatch, a +1
             // by any means could let it look like a direct match
@@ -1019,7 +1018,7 @@ public abstract class StaticTypeCheckingSupport {
     }
 
     /**
-     * @deprecated Use {@link #findDGMMethodsByNameAndArguments(ClassLoader, org.codehaus.groovy.ast.ClassNode, String, org.codehaus.groovy.ast.ClassNode[], java.util.List)} instead
+     * @deprecated Use {@link #findDGMMethodsByNameAndArguments(ClassLoader, ClassNode, String, ClassNode[], List)} instead
      */
     @Deprecated
     public static List<MethodNode> findDGMMethodsByNameAndArguments(final ClassNode receiver, final String name, final ClassNode[] args) {
@@ -1031,7 +1030,7 @@ public abstract class StaticTypeCheckingSupport {
     }
 
     /**
-     * @deprecated Use {@link #findDGMMethodsByNameAndArguments(ClassLoader, org.codehaus.groovy.ast.ClassNode, String, org.codehaus.groovy.ast.ClassNode[], List)} instead
+     * @deprecated Use {@link #findDGMMethodsByNameAndArguments(ClassLoader, ClassNode, String, ClassNode[], List)} instead
      */
     @Deprecated
     public static List<MethodNode> findDGMMethodsByNameAndArguments(final ClassNode receiver, final String name, final ClassNode[] args, final List<MethodNode> methods) {
diff --git a/src/test/groovy/transform/stc/DefaultGroovyMethodsSTCTest.groovy b/src/test/groovy/transform/stc/DefaultGroovyMethodsSTCTest.groovy
index 3e271b0ee7..e75402366c 100644
--- a/src/test/groovy/transform/stc/DefaultGroovyMethodsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/DefaultGroovyMethodsSTCTest.groovy
@@ -285,4 +285,25 @@ class DefaultGroovyMethodsSTCTest extends StaticTypeCheckingTestCase {
             assert test() == [0, 2, 2, 3]
         '''
     }
+
+    // GROOVY-9529
+    void testMapGetAtVsObjectGetAt() {
+        assertScript '''
+            interface A extends Map<Object,Object> {
+            }
+            interface B extends A {
+            }
+            class C extends HashMap<Object,Object> implements B {
+            }
+
+            B newMap() {
+                new C().tap {
+                    put('foo', 'bar')
+                }
+            }
+
+            B map = newMap()
+            assert map['foo'] == 'bar'
+        '''
+    }
 }