Repository: groovy Updated Branches: refs/heads/master b7383d29e -> 667e134ca
minor refactor Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/667e134c Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/667e134c Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/667e134c Branch: refs/heads/master Commit: 667e134ca0b898ad9e15fee7122ea03b80f5c14b Parents: b7383d2 Author: paulk <[email protected]> Authored: Tue Jun 7 21:46:11 2016 +1000 Committer: paulk <[email protected]> Committed: Tue Jun 14 23:12:24 2016 +1000 ---------------------------------------------------------------------- .../groovy/ast/tools/ClassNodeUtils.java | 27 ++++++++++++++++++ .../org/codehaus/groovy/classgen/Verifier.java | 29 +++----------------- 2 files changed, 31 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/667e134c/src/main/org/codehaus/groovy/ast/tools/ClassNodeUtils.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/ast/tools/ClassNodeUtils.java b/src/main/org/codehaus/groovy/ast/tools/ClassNodeUtils.java index f3eec90..82cc190 100644 --- a/src/main/org/codehaus/groovy/ast/tools/ClassNodeUtils.java +++ b/src/main/org/codehaus/groovy/ast/tools/ClassNodeUtils.java @@ -20,9 +20,13 @@ package org.codehaus.groovy.ast.tools; +import org.codehaus.groovy.ast.ClassHelper; import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.ast.MethodNode; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; import java.util.Map; public class ClassNodeUtils { @@ -38,4 +42,27 @@ public class ClassNodeUtils { } } } + + public static Map<String, MethodNode> getDeclaredMethodMapsFromInterfaces(ClassNode classNode) { + Map<String, MethodNode> result = new HashMap<String, MethodNode>(); + ClassNode[] interfaces = classNode.getInterfaces(); + for (ClassNode iface : interfaces) { + result.putAll(iface.getDeclaredMethodsMap()); + } + return result; + } + + public static void addDeclaredMethodMapsFromSuperInterfaces(ClassNode cn, Map<String, MethodNode> allInterfaceMethods) { + List cnInterfaces = Arrays.asList(cn.getInterfaces()); + ClassNode sn = cn.getSuperClass(); + while (sn != null && !sn.equals(ClassHelper.OBJECT_TYPE)) { + ClassNode[] interfaces = sn.getInterfaces(); + for (ClassNode iface : interfaces) { + if (!cnInterfaces.contains(iface)) { + allInterfaceMethods.putAll(iface.getDeclaredMethodsMap()); + } + } + sn = sn.getSuperClass(); + } + } } http://git-wip-us.apache.org/repos/asf/groovy/blob/667e134c/src/main/org/codehaus/groovy/classgen/Verifier.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/classgen/Verifier.java b/src/main/org/codehaus/groovy/classgen/Verifier.java index c950e51..7f5c5fa 100644 --- a/src/main/org/codehaus/groovy/classgen/Verifier.java +++ b/src/main/org/codehaus/groovy/classgen/Verifier.java @@ -37,6 +37,7 @@ import org.codehaus.groovy.ast.stmt.BlockStatement; import org.codehaus.groovy.ast.stmt.ExpressionStatement; import org.codehaus.groovy.ast.stmt.ReturnStatement; import org.codehaus.groovy.ast.stmt.Statement; +import org.codehaus.groovy.ast.tools.ClassNodeUtils; import org.codehaus.groovy.ast.tools.GenericsUtils; import org.codehaus.groovy.classgen.asm.BytecodeHelper; import org.codehaus.groovy.classgen.asm.MopWriter; @@ -1172,16 +1173,9 @@ public class Verifier implements GroovyClassVisitor, Opcodes { Map genericsSpec = new HashMap(); // unimplemented abstract methods from interfaces - Map abstractMethods = new HashMap(); - Map<String, MethodNode> allInterfaceMethods = new HashMap<String, MethodNode>(); - ClassNode[] interfaces = classNode.getInterfaces(); - for (ClassNode iface : interfaces) { - Map ifaceMethodsMap = iface.getDeclaredMethodsMap(); - abstractMethods.putAll(ifaceMethodsMap); - allInterfaceMethods.putAll(ifaceMethodsMap); - } - - collectSuperInterfaceMethods(classNode, allInterfaceMethods); + Map<String, MethodNode> abstractMethods = ClassNodeUtils.getDeclaredMethodMapsFromInterfaces(classNode); + Map<String, MethodNode> allInterfaceMethods = new HashMap<String, MethodNode>(abstractMethods); + ClassNodeUtils.addDeclaredMethodMapsFromSuperInterfaces(classNode, allInterfaceMethods); List<MethodNode> declaredMethods = new ArrayList<MethodNode>(classNode.getMethods()); // remove all static, private and package private methods @@ -1220,21 +1214,6 @@ public class Verifier implements GroovyClassVisitor, Opcodes { } } - private static void collectSuperInterfaceMethods(ClassNode cn, Map<String, MethodNode> allInterfaceMethods) { - List cnInterfaces = Arrays.asList(cn.getInterfaces()); - ClassNode sn = cn.getSuperClass(); - while (sn != null && !sn.equals(ClassHelper.OBJECT_TYPE)) { - ClassNode[] interfaces = sn.getInterfaces(); - for (ClassNode iface : interfaces) { - if (!cnInterfaces.contains(iface)) { - Map<String, MethodNode> ifaceMethodsMap = iface.getDeclaredMethodsMap(); - allInterfaceMethods.putAll(ifaceMethodsMap); - } - } - sn = sn.getSuperClass(); - } - } - private void addCovariantMethods(ClassNode classNode, List declaredMethods, Map abstractMethods, Map methodsToAdd, Map oldGenericsSpec) { ClassNode sn = classNode.getUnresolvedSuperClass(false);
