return true;
}
case APPLICATION: {
TypeApplication app = (TypeApplication) argType;
List<TypeExpression> types = app.getTypes();
IRubyObject ret = resolveIdentity(template, app.getIdentity());
if (!(ret instanceof RubyModule) || !arg.isKindOf((RubyModule) ret)) {
return false;
} else {
RubyModule klass = (RubyModule) ret;
ClassType klassType = RuntimeHelper.getClassAnnotation(klass);
TypeVarMap typeVarMap = RuntimeHelper.getTypeVarMap(arg);
if (klassType != null && typeVarMap != null) {
List<TypeVariable> vars = klassType.getTypes();
for (int i = 0; i < vars.size(); i++) {
TypeVariable var = vars.get(i);
Vertex vertex = typeVarMap.get(var);
if (i < types.size() && vertex != null) {
TypeExpression expr = types.get(i);
for (IRubyObject a : vertex.getTypeSet()) {
if (!resolveMethodArg(template, klassType, expr, receiver, a)) {
return false;
}
}
}
}
}
}
return true;
}
case SCOPED_IDENTITY:
case ABSOLUTE_IDENTITY:
case RELATIVE_IDENTITY: {
IRubyObject guard = resolveIdentity(template, (TypeIdentity) argType);
return (guard instanceof RubyClass) && arg.isKindOf((RubyClass) guard);
}
case UNION:
for (TypeExpression expr : (TypeUnion) argType) {
if (resolveMethodArg(template, classType, expr, receiver, arg)) {