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 2018/04/12 03:50:16 UTC

groovy git commit: GROOVY-8211: pre-factor avoid AIOOBE with clearer message but real fix to come

Repository: groovy
Updated Branches:
  refs/heads/GROOVY_2_5_X d98afbeb2 -> 7d49e93e5


GROOVY-8211: pre-factor avoid AIOOBE with clearer message but real fix to come


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

Branch: refs/heads/GROOVY_2_5_X
Commit: 7d49e93e515bb985f8fdbac58a0c5dedbac1cd0e
Parents: d98afbe
Author: Paul King <pa...@asert.com.au>
Authored: Thu Apr 12 13:50:08 2018 +1000
Committer: Paul King <pa...@asert.com.au>
Committed: Thu Apr 12 13:50:08 2018 +1000

----------------------------------------------------------------------
 .../groovy/ast/tools/GenericsUtils.java         | 23 ++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/7d49e93e/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java b/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
index 1b0fb04..83d1999 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
@@ -143,8 +143,8 @@ public class GenericsUtils {
      * For a given classnode, fills in the supplied map with the parameterized
      * types it defines.
      *
-     * @param node
-     * @param map
+     * @param node the class node to check
+     + @param map the generics type information collector
      */
     public static void extractPlaceholders(ClassNode node, Map<String, GenericsType> map) {
         if (node == null) return;
@@ -159,6 +159,11 @@ public class GenericsUtils {
         if (parameterized == null || parameterized.length == 0) return;
         GenericsType[] redirectGenericsTypes = node.redirect().getGenericsTypes();
         if (redirectGenericsTypes == null) redirectGenericsTypes = parameterized;
+        if (redirectGenericsTypes.length != parameterized.length) {
+            throw new GroovyBugError("Expected earlier checking to detect generics parameter arity mismatch" +
+                    "\nExpected: " + node.getName() + toGenericTypesString(redirectGenericsTypes) +
+                    "\nSupplied: " + node.getName() + toGenericTypesString(parameterized));
+        }
         for (int i = 0; i < redirectGenericsTypes.length; i++) {
             GenericsType redirectType = redirectGenericsTypes[i];
             if (redirectType.isPlaceholder()) {
@@ -185,6 +190,20 @@ public class GenericsUtils {
         }
     }
 
+    private static String toGenericTypesString(GenericsType[] genericsTypes) {
+        if (genericsTypes == null) return "";
+        StringBuilder sb = new StringBuilder("<");
+        for (int i = 0; i < genericsTypes.length; i++) {
+            final GenericsType genericsType = genericsTypes[i];
+            sb.append(genericsType.toString());
+            if (i < genericsTypes.length - 1) {
+                sb.append(",");
+            }
+        }
+        sb.append("> ");
+        return sb.toString();
+    }
+
     /**
      * Interface class nodes retrieved from {@link org.codehaus.groovy.ast.ClassNode#getInterfaces()}
      * or {@link org.codehaus.groovy.ast.ClassNode#getAllInterfaces()} are returned with generic type