//Tested with BCEL-5.1
//http://jakarta.apache.org/builds/jakarta-bcel/release/v5.1/
package com.puppycrawl.tools.checkstyle.bcel.generic;
import org.apache.bcel.generic.ReferenceType;
import org.apache.bcel.generic.Type;
/**
* Utility methods.
* @author Rick Giles
* @version 17-Jun-2003
*/
public class Utils
{
/**
* Tests whether one type is compatible with another for method
* invocation conversion. This includes assignment conversion,
* except the implicit narrowing of integer constants.
* JLS Section 5.2
* @param aSubType the type to be converted.
* @param aSuperType the converted type.
* @return true if aSubType can be converted to aSuperType.
*/
public static boolean isCompatible(Type aSubType, Type aSuperType)
{
boolean result = false;
if (aSubType.equals(aSuperType)) {
// identity conversion
result = true;
}
else if ((aSubType instanceof ReferenceType)
&& (aSuperType instanceof ReferenceType))
{
// widening reference conversion?
final ReferenceType aSubRefType = (ReferenceType) aSubType;
result = aSubRefType.isAssignmentCompatibleWith(aSuperType);
}
// widening primitive conversion?
else if (aSubType.equals(Type.BYTE)) {
result =
aSuperType.equals(Type.SHORT)
|| aSuperType.equals(Type.INT)
|| aSuperType.equals(Type.LONG)
|| aSuperType.equals(Type.FLOAT)
|| aSuperType.equals(Type.DOUBLE);
}
else if (aSubType.equals(Type.SHORT)) {
result =
aSuperType.equals(Type.INT)
|| aSuperType.equals(Type.LONG)
|| aSuperType.equals(Type.FLOAT)
|| aSuperType.equals(Type.DOUBLE);
}
else if (aSubType.equals(Type.INT)) {
result =
aSuperType.equals(Type.LONG)
|| aSuperType.equals(Type.FLOAT)
|| aSuperType.equals(Type.DOUBLE);
}
else if (aSubType.equals(Type.LONG)) {
result =
aSuperType.equals(Type.FLOAT) || aSuperType.equals(Type.DOUBLE);
}
else if (aSubType.equals(Type.DOUBLE)) {
result = aSuperType.equals(Type.DOUBLE);
}
return result;
}
}