use of com.sun.jdi.ClassNotLoadedException in project che by eclipse.
the class Evaluator method invokeMethod.
public ExpressionValue invokeMethod(Value value, String name, List<Value> arguments) {
if (!(value instanceof ObjectReference)) {
throw new ExpressionException("Value is not object. Cannot invoke method " + name);
}
ObjectReference object = (ObjectReference) value;
ReferenceType type = object.referenceType();
List<Method> methods = type.methodsByName(name);
Method method = findMethod(methods, arguments);
if (method == null) {
throw new ExpressionException("No method with name " + name + " matched to specified arguments for " + type.name());
}
try {
return new ReadOnlyValue(object.invokeMethod(thread, method, arguments, 0));
} catch (InvalidTypeException | ClassNotLoadedException | IncompatibleThreadStateException | InvocationException e) {
throw new ExpressionException(e.getMessage(), e);
}
}
use of com.sun.jdi.ClassNotLoadedException in project che by eclipse.
the class Evaluator method findMethod.
private Method findMethod(List<Method> methods, List<Value> arguments) {
Method m = null;
for (Method mm : methods) {
List<Type> argumentTypes;
try {
argumentTypes = mm.argumentTypes();
} catch (ClassNotLoadedException e) {
continue;
}
ARGUMENT_MATCHING argumentMatching = argumentsMatching(argumentTypes, arguments);
if (argumentMatching == ARGUMENT_MATCHING.MATCH) {
m = mm;
break;
} else if (argumentMatching == ARGUMENT_MATCHING.ASSIGNABLE) {
if (m == null) {
m = mm;
} else {
throw new ExpressionException("Multiple methods with name " + mm.name() + " matched to specified arguments. ");
}
}
}
return m;
}
use of com.sun.jdi.ClassNotLoadedException in project che by eclipse.
the class Evaluator method isAssignable.
private boolean isAssignable(Type from, Type to) {
if (from.equals(to)) {
return true;
}
if (from instanceof BooleanType) {
return to instanceof BooleanType;
}
if (to instanceof BooleanType) {
return false;
}
if (from instanceof PrimitiveType) {
return to instanceof PrimitiveType;
}
if (to instanceof PrimitiveType) {
return false;
}
if (from instanceof ArrayType) {
if (to instanceof ArrayType) {
Type fromArrayComponent;
Type toArrayComponent;
try {
fromArrayComponent = ((ArrayType) from).componentType();
toArrayComponent = ((ArrayType) to).componentType();
} catch (ClassNotLoadedException e) {
return false;
}
if (fromArrayComponent instanceof PrimitiveType) {
return fromArrayComponent.equals(toArrayComponent);
}
return !(toArrayComponent instanceof PrimitiveType) && isAssignable(fromArrayComponent, toArrayComponent);
}
return to.name().equals("java.lang.Object");
}
if (from instanceof ClassType) {
ClassType superClass = ((ClassType) from).superclass();
if (superClass != null && isAssignable(superClass, to)) {
return true;
}
for (InterfaceType interfaceType : ((ClassType) from).interfaces()) {
if (isAssignable(interfaceType, to)) {
return true;
}
}
}
for (InterfaceType interfaceType : ((InterfaceType) from).subinterfaces()) {
if (isAssignable(interfaceType, to)) {
return true;
}
}
return false;
}
Aggregations