minor refactor
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/036c14fa Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/036c14fa Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/036c14fa Branch: refs/heads/GROOVY_2_4_X Commit: 036c14fa0ecc883ccc3b931aef40a666e374ed22 Parents: df63a38 Author: paulk <pa...@asert.com.au> Authored: Wed Jun 1 13:35:39 2016 +1000 Committer: paulk <pa...@asert.com.au> Committed: Wed Jun 1 13:47:09 2016 +1000 ---------------------------------------------------------------------- src/main/org/codehaus/groovy/ast/ClassNode.java | 45 ++++++++------------ .../groovy/ast/tools/ClassNodeUtils.java | 41 ++++++++++++++++++ .../groovy/ast/tools/ParameterUtils.java | 39 +++++++++++++++++ .../classgen/ClassCompletionVerifier.java | 3 +- .../groovy/classgen/ExtendedVerifier.java | 19 +-------- .../classgen/asm/OptimizingStatementWriter.java | 18 +------- 6 files changed, 103 insertions(+), 62 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/036c14fa/src/main/org/codehaus/groovy/ast/ClassNode.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/ast/ClassNode.java b/src/main/org/codehaus/groovy/ast/ClassNode.java index faf4570..6306f5f 100644 --- a/src/main/org/codehaus/groovy/ast/ClassNode.java +++ b/src/main/org/codehaus/groovy/ast/ClassNode.java @@ -24,9 +24,11 @@ import org.codehaus.groovy.ast.expr.Expression; import org.codehaus.groovy.ast.expr.FieldExpression; import org.codehaus.groovy.ast.expr.MapExpression; import org.codehaus.groovy.ast.expr.TupleExpression; +import org.codehaus.groovy.ast.stmt.BlockStatement; import org.codehaus.groovy.ast.stmt.ExpressionStatement; import org.codehaus.groovy.ast.stmt.Statement; -import org.codehaus.groovy.ast.stmt.BlockStatement; +import org.codehaus.groovy.ast.tools.ClassNodeUtils; +import org.codehaus.groovy.ast.tools.ParameterUtils; import org.codehaus.groovy.control.CompilePhase; import org.codehaus.groovy.transform.ASTTransformation; import org.codehaus.groovy.transform.GroovyASTTransformation; @@ -34,8 +36,18 @@ import org.codehaus.groovy.vmplugin.VMPluginFactory; import org.objectweb.asm.Opcodes; import java.lang.reflect.Array; -import java.lang.reflect.Constructor; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; +import java.util.Set; /** * Represents a class in the AST. @@ -435,7 +447,7 @@ public class ClassNode extends AnnotatedNode implements Opcodes { } else { result = new HashMap<String, MethodNode>(); } - addInterfaceMethods(result); + ClassNodeUtils.addInterfaceMethods(this, result); // And add in the methods implemented in this class. for (MethodNode method : getMethods()) { @@ -445,19 +457,6 @@ public class ClassNode extends AnnotatedNode implements Opcodes { return result; } - public void addInterfaceMethods(Map<String, MethodNode> methodsMap) { - // add in unimplemented abstract methods from the interfaces - for (ClassNode iface : getInterfaces()) { - Map<String, MethodNode> ifaceMethodsMap = iface.getDeclaredMethodsMap(); - for (String methSig : ifaceMethodsMap.keySet()) { - if (!methodsMap.containsKey(methSig)) { - MethodNode methNode = ifaceMethodsMap.get(methSig); - methodsMap.put(methSig, methNode); - } - } - } - } - public String getName() { return redirect().name; } @@ -1039,17 +1038,7 @@ public class ClassNode extends AnnotatedNode implements Opcodes { * @return true if the two arrays are of the same size and have the same contents */ protected boolean parametersEqual(Parameter[] a, Parameter[] b) { - if (a.length == b.length) { - boolean answer = true; - for (int i = 0; i < a.length; i++) { - if (!a[i].getType().equals(b[i].getType())) { - answer = false; - break; - } - } - return answer; - } - return false; + return ParameterUtils.parametersEqual(a, b); } /** http://git-wip-us.apache.org/repos/asf/groovy/blob/036c14fa/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 new file mode 100644 index 0000000..f3eec90 --- /dev/null +++ b/src/main/org/codehaus/groovy/ast/tools/ClassNodeUtils.java @@ -0,0 +1,41 @@ +/* + * 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 org.codehaus.groovy.ast.tools; + +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.ast.MethodNode; + +import java.util.Map; + +public class ClassNodeUtils { + public static void addInterfaceMethods(ClassNode cnode, Map<String, MethodNode> methodsMap) { + // add in unimplemented abstract methods from the interfaces + for (ClassNode iface : cnode.getInterfaces()) { + Map<String, MethodNode> ifaceMethodsMap = iface.getDeclaredMethodsMap(); + for (String methSig : ifaceMethodsMap.keySet()) { + if (!methodsMap.containsKey(methSig)) { + MethodNode methNode = ifaceMethodsMap.get(methSig); + methodsMap.put(methSig, methNode); + } + } + } + } +} http://git-wip-us.apache.org/repos/asf/groovy/blob/036c14fa/src/main/org/codehaus/groovy/ast/tools/ParameterUtils.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/ast/tools/ParameterUtils.java b/src/main/org/codehaus/groovy/ast/tools/ParameterUtils.java new file mode 100644 index 0000000..4edf92e --- /dev/null +++ b/src/main/org/codehaus/groovy/ast/tools/ParameterUtils.java @@ -0,0 +1,39 @@ +/* + * 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 org.codehaus.groovy.ast.tools; + +import org.codehaus.groovy.ast.Parameter; + +public class ParameterUtils { + public static boolean parametersEqual(Parameter[] a, Parameter[] b) { + if (a.length == b.length) { + boolean answer = true; + for (int i = 0; i < a.length; i++) { + if (!a[i].getType().equals(b[i].getType())) { + answer = false; + break; + } + } + return answer; + } + return false; + } +} http://git-wip-us.apache.org/repos/asf/groovy/blob/036c14fa/src/main/org/codehaus/groovy/classgen/ClassCompletionVerifier.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/classgen/ClassCompletionVerifier.java b/src/main/org/codehaus/groovy/classgen/ClassCompletionVerifier.java index c29c705..9fe13cf 100644 --- a/src/main/org/codehaus/groovy/classgen/ClassCompletionVerifier.java +++ b/src/main/org/codehaus/groovy/classgen/ClassCompletionVerifier.java @@ -35,6 +35,7 @@ import org.codehaus.groovy.ast.expr.PropertyExpression; import org.codehaus.groovy.ast.expr.TupleExpression; import org.codehaus.groovy.ast.expr.VariableExpression; import org.codehaus.groovy.ast.stmt.CatchStatement; +import org.codehaus.groovy.ast.tools.ClassNodeUtils; import org.codehaus.groovy.ast.tools.GeneralUtils; import org.codehaus.groovy.control.SourceUnit; import org.codehaus.groovy.runtime.MetaClassHelper; @@ -93,7 +94,7 @@ public class ClassCompletionVerifier extends ClassCodeVisitorSupport { result = new HashMap<String, MethodNode>(); } // add in unimplemented abstract methods from the interfaces - node.addInterfaceMethods(result); + ClassNodeUtils.addInterfaceMethods(node, result); for (MethodNode methodNode : node.getMethods()) { MethodNode mn = result.get(methodNode.getTypeDescriptor()); if (mn != null && (mn.isStatic() ^ methodNode.isStatic()) && !methodNode.isStaticConstructor()) { http://git-wip-us.apache.org/repos/asf/groovy/blob/036c14fa/src/main/org/codehaus/groovy/classgen/ExtendedVerifier.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/classgen/ExtendedVerifier.java b/src/main/org/codehaus/groovy/classgen/ExtendedVerifier.java index 14697e6..611c67c 100644 --- a/src/main/org/codehaus/groovy/classgen/ExtendedVerifier.java +++ b/src/main/org/codehaus/groovy/classgen/ExtendedVerifier.java @@ -22,6 +22,7 @@ import org.codehaus.groovy.ast.*; import org.codehaus.groovy.ast.expr.DeclarationExpression; import org.codehaus.groovy.ast.stmt.ReturnStatement; import org.codehaus.groovy.ast.stmt.Statement; +import org.codehaus.groovy.ast.tools.ParameterUtils; import org.codehaus.groovy.control.AnnotationConstantsVisitor; import org.codehaus.groovy.control.CompilerConfiguration; import org.codehaus.groovy.control.ErrorCollector; @@ -46,8 +47,6 @@ import static org.codehaus.groovy.ast.tools.GenericsUtils.createGenericsSpec; * <p> * Current limitations: * - annotations on local variables are not supported - * - * @author <a href='mailto:the[dot]mindstorm[at]gmail[dot]com'>Alex Popescu</a> */ public class ExtendedVerifier extends ClassCodeVisitorSupport { public static final String JVM_ERROR_MESSAGE = "Please make sure you are running on a JVM >= 1.5"; @@ -234,27 +233,13 @@ public class ExtendedVerifier extends ClassCodeVisitorSupport { private static MethodNode getDeclaredMethodCorrected(Map genericsSpec, MethodNode mn, ClassNode correctedNext) { for (MethodNode orig : correctedNext.getDeclaredMethods(mn.getName())) { MethodNode method = correctToGenericsSpec(genericsSpec, orig); - if (parametersEqual(method.getParameters(), mn.getParameters())) { + if (ParameterUtils.parametersEqual(method.getParameters(), mn.getParameters())) { return method; } } return null; } - private static boolean parametersEqual(Parameter[] a, Parameter[] b) { - if (a.length == b.length) { - boolean answer = true; - for (int i = 0; i < a.length; i++) { - if (!a[i].getType().equals(b[i].getType())) { - answer = false; - break; - } - } - return answer; - } - return false; - } - /** * Resolve metadata and details of the annotation. * http://git-wip-us.apache.org/repos/asf/groovy/blob/036c14fa/src/main/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java b/src/main/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java index 104eb1f..9e660fa 100644 --- a/src/main/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java +++ b/src/main/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java @@ -25,6 +25,7 @@ import org.codehaus.groovy.ast.*; import org.codehaus.groovy.ast.expr.*; import org.codehaus.groovy.ast.stmt.*; import org.codehaus.groovy.GroovyBugError; +import org.codehaus.groovy.ast.tools.ParameterUtils; import org.codehaus.groovy.classgen.AsmClassGenerator; import org.codehaus.groovy.classgen.Verifier; import org.codehaus.groovy.control.SourceUnit; @@ -40,7 +41,6 @@ import static org.codehaus.groovy.ast.tools.WideningCategories.*; /** * A class to write out the optimized statements - * @author <a href="mailto:blackd...@gmx.org">Jochen "blackdrag" Theodorou</a> */ public class OptimizingStatementWriter extends StatementWriter { @@ -850,7 +850,7 @@ public class OptimizingStatementWriter extends StatementWriter { List<ConstructorNode> cl = node.getDeclaredConstructors(); MethodNode res = null; for (ConstructorNode cn : cl) { - if (parametersEqual(cn.getParameters(), paraTypes)) { + if (ParameterUtils.parametersEqual(cn.getParameters(), paraTypes)) { res = cn; break; } @@ -859,20 +859,6 @@ public class OptimizingStatementWriter extends StatementWriter { return null; } - private static boolean parametersEqual(Parameter[] a, Parameter[] b) { - if (a.length == b.length) { - boolean answer = true; - for (int i = 0; i < a.length; i++) { - if (!a[i].getType().equals(b[i].getType())) { - answer = false; - break; - } - } - return answer; - } - return false; - } - private static boolean validTypeForCall(ClassNode type) { // do call only for final classes and primitive types if (isPrimitiveType(type)) return true;