public override void VisitCall(CallExpression call)
{
TypeData receiverType;
if (call.Receiver != null) {
call.Receiver.Accept(this);
receiverType = call.Receiver.NodeType;
}
else {
call.TypeSpecifier.Accept(this);
receiverType = call.TypeSpecifier.NodeType;
}
if (receiverType == null) {
report.Error(call.Location, "no match for {0}", call.Name);
return;
}
call.Arguments.Accept(this);
try {
MethodData method = receiverType.LookupMethod(call.Name,
call.Arguments,
call.HasValue);
call.IsBuiltin = method.IsBuiltin;
SetupMethod(call, method.MethodInfo, receiverType);
}
catch (LookupMethodException e) {
string routInfo = receiverType.FullName +
"::" + call.Name;
if (call.Arguments.Length > 0) {
routInfo += "(";
foreach (ModalExpression arg in call.Arguments) {
if (arg != call.Arguments.First)
routInfo += ",";
routInfo += arg.NodeType.FullName;
}
routInfo += ")";
}
if (call.HasValue)
routInfo += ":_";
report.Error(call.Location,
"{0} for {1}", e.Message, routInfo);
}
}