summaryrefslogtreecommitdiffstats
path: root/tools/signature-tools/src/signature/io/html/ExecutableMemberComparator.java
diff options
context:
space:
mode:
Diffstat (limited to 'tools/signature-tools/src/signature/io/html/ExecutableMemberComparator.java')
-rw-r--r--tools/signature-tools/src/signature/io/html/ExecutableMemberComparator.java102
1 files changed, 102 insertions, 0 deletions
diff --git a/tools/signature-tools/src/signature/io/html/ExecutableMemberComparator.java b/tools/signature-tools/src/signature/io/html/ExecutableMemberComparator.java
new file mode 100644
index 00000000000..e3423421543
--- /dev/null
+++ b/tools/signature-tools/src/signature/io/html/ExecutableMemberComparator.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed 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 signature.io.html;
+
+import signature.compare.model.IExecutableMemberDelta;
+import signature.model.IArrayType;
+import signature.model.IClassDefinition;
+import signature.model.IClassReference;
+import signature.model.IExecutableMember;
+import signature.model.IParameter;
+import signature.model.IParameterizedType;
+import signature.model.IPrimitiveType;
+import signature.model.ITypeDefinition;
+import signature.model.ITypeReference;
+import signature.model.ITypeVariableDefinition;
+import signature.model.ITypeVariableReference;
+
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+
+public class ExecutableMemberComparator implements
+ Comparator<IExecutableMemberDelta<? extends IExecutableMember>> {
+
+ public int compare(IExecutableMemberDelta<? extends IExecutableMember> a,
+ IExecutableMemberDelta<? extends IExecutableMember> b) {
+ assert a.getType() == b.getType();
+ IExecutableMember aMember = null;
+ IExecutableMember bMember = null;
+
+ if (a.getFrom() != null) {
+ aMember = a.getFrom();
+ bMember = b.getFrom();
+ } else {
+ aMember = a.getTo();
+ bMember = b.getTo();
+ }
+
+ int returnValue = aMember.getName().compareTo(bMember.getName());
+ return returnValue != 0 ? returnValue : compareParameterLists(aMember
+ .getParameters(), bMember.getParameters());
+ }
+
+ private int compareParameterLists(List<IParameter> a, List<IParameter> b) {
+ if (a.size() != b.size()) {
+ return a.size() - b.size();
+ }
+ Iterator<IParameter> aIt = a.iterator();
+ Iterator<IParameter> bIt = b.iterator();
+ int returnValue = 0;
+ while (aIt.hasNext() && bIt.hasNext()) {
+ returnValue += getTypeName(aIt.next().getType()).compareTo(
+ getTypeName(bIt.next().getType()));
+ }
+ return returnValue;
+ }
+
+ private String getTypeName(ITypeReference type) {
+ if (type instanceof IClassReference) {
+ return getTypeName(((IClassReference) type).getClassDefinition());
+ }
+ if (type instanceof ITypeVariableReference) {
+ return getTypeName(((ITypeVariableReference) type)
+ .getTypeVariableDefinition());
+ }
+ if (type instanceof IParameterizedType) {
+ return getTypeName(((IParameterizedType) type).getRawType());
+ }
+ if (type instanceof IArrayType) {
+ return getTypeName(((IArrayType) type).getComponentType());
+ }
+ if (type instanceof IPrimitiveType) {
+ return ((IPrimitiveType) type).getName();
+ }
+ return type.toString();
+ }
+
+ private String getTypeName(ITypeDefinition type) {
+ if (type instanceof IClassDefinition) {
+ return ((IClassDefinition) type).getName();
+ }
+ if (type instanceof ITypeVariableDefinition) {
+ return ((ITypeVariableDefinition) type).getName();
+ }
+ return type.toString();
+ }
+
+}