/* * 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> { public int compare(IExecutableMemberDelta a, IExecutableMemberDelta 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 a, List b) { if (a.size() != b.size()) { return a.size() - b.size(); } Iterator aIt = a.iterator(); Iterator 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(); } }