package jdiff;
|
|
import java.io.*;
|
import java.util.*;
|
|
/**
|
* Class to represent a method, analogous to MethodDoc in the
|
* Javadoc doclet API.
|
*
|
* The method used for Collection comparison (compareTo) must make its
|
* comparison based upon everything that is known about this method.
|
*
|
* See the file LICENSE.txt for copyright details.
|
* @author Matthew Doar, mdoar@pobox.com
|
*/
|
class MethodAPI implements Comparable {
|
|
/** Name of the method. */
|
public String name_ = null;
|
|
/** Return type of the method. */
|
public String returnType_ = null;
|
|
/**
|
* The fully qualified name of the class or interface this method is
|
* inherited from. If this is null, then the method is defined locally
|
* in this class or interface.
|
*/
|
public String inheritedFrom_ = null;
|
|
/**
|
* The exceptions thrown by this method, being all the exception types
|
* separated by commas. "no exceptions" if no exceptions are thrown.
|
*/
|
public String exceptions_ = "no exceptions";
|
|
/** Set if this method is abstract. */
|
public boolean isAbstract_ = false;
|
|
/** Set if this method is native. */
|
public boolean isNative_ = false;
|
|
/** Set if this method is synchronized. */
|
public boolean isSynchronized_ = false;
|
|
/** Modifiers for this class. */
|
public Modifiers modifiers_;
|
|
public List params_; // ParamAPI[]
|
|
/** The doc block, default is null. */
|
public String doc_ = null;
|
|
/** Constructor. */
|
public MethodAPI(String name, String returnType, boolean isAbstract,
|
boolean isNative, boolean isSynchronized,
|
Modifiers modifiers) {
|
name_ = name;
|
returnType_ = returnType;
|
isAbstract_ = isAbstract;
|
isNative_ = isNative;
|
isSynchronized_ = isSynchronized;
|
modifiers_ = modifiers;
|
params_ = new ArrayList(); // ParamAPI[]
|
}
|
|
/** Copy constructor. */
|
public MethodAPI(MethodAPI m) {
|
name_ = m.name_;
|
returnType_ = m.returnType_;
|
inheritedFrom_ = m.inheritedFrom_;
|
exceptions_ = m.exceptions_;
|
isAbstract_ = m.isAbstract_;
|
isNative_ = m.isNative_;
|
isSynchronized_ = m.isSynchronized_;
|
modifiers_ = m.modifiers_; // Note: shallow copy
|
params_ = m.params_; // Note: shallow copy
|
doc_ = m.doc_;
|
signature_ = m.signature_; // Cached
|
}
|
|
/**
|
* Compare two methods, including the return type, and parameter
|
* names and types, and modifiers.
|
*/
|
public int compareTo(Object o) {
|
MethodAPI oMethod = (MethodAPI)o;
|
int comp = name_.compareTo(oMethod.name_);
|
if (comp != 0)
|
return comp;
|
comp = returnType_.compareTo(oMethod.returnType_);
|
if (comp != 0)
|
return comp;
|
if (APIComparator.changedInheritance(inheritedFrom_, oMethod.inheritedFrom_) != 0)
|
return -1;
|
if (isAbstract_ != oMethod.isAbstract_) {
|
return -1;
|
}
|
if (Diff.showAllChanges &&
|
isNative_ != oMethod.isNative_) {
|
return -1;
|
}
|
if (Diff.showAllChanges &&
|
isSynchronized_ != oMethod.isSynchronized_) {
|
return -1;
|
}
|
comp = exceptions_.compareTo(oMethod.exceptions_);
|
if (comp != 0)
|
return comp;
|
comp = modifiers_.compareTo(oMethod.modifiers_);
|
if (comp != 0)
|
return comp;
|
comp = getSignature().compareTo(oMethod.getSignature());
|
if (comp != 0)
|
return comp;
|
if (APIComparator.docChanged(doc_, oMethod.doc_))
|
return -1;
|
return 0;
|
}
|
|
/**
|
* Tests two methods, using just the method name, used by indexOf().
|
*/
|
public boolean equals(Object o) {
|
if (name_.compareTo(((MethodAPI)o).name_) == 0)
|
return true;
|
return false;
|
}
|
|
/**
|
* Tests two methods for equality, using just the signature.
|
*/
|
public boolean equalSignatures(Object o) {
|
if (getSignature().compareTo(((MethodAPI)o).getSignature()) == 0)
|
return true;
|
return false;
|
}
|
|
/** Cached result of getSignature(). */
|
private String signature_ = null;
|
|
/** Return the signature of the method. */
|
public String getSignature() {
|
if (signature_ != null)
|
return signature_;
|
String res = "";
|
boolean first = true;
|
Iterator iter = params_.iterator();
|
while (iter.hasNext()) {
|
if (!first)
|
res += ", ";
|
ParamAPI param = (ParamAPI)(iter.next());
|
res += param.toString();
|
first = false;
|
}
|
signature_ = res;
|
return res;
|
}
|
}
|