private bool FillupInvokeArgs(IList<QilNode> formalArgs, IList<XslNode> actualArgs, QilList invokeArgs)
{
if (actualArgs.Count != formalArgs.Count)
{
return false;
}
invokeArgs.Clear();
for (int invArg = 0; invArg < formalArgs.Count; invArg++)
{
QilName formalArgName = ((QilParameter)formalArgs[invArg]).Name;
XmlQueryType paramType = formalArgs[invArg].XmlType;
QilNode arg = null;
{
for (int actArg = 0; actArg < actualArgs.Count; actArg++)
{
Debug.Assert(actualArgs[actArg].NodeType == XslNodeType.WithParam, "All Sorts was removed in CompileSorts()");
VarPar withParam = (VarPar)actualArgs[actArg];
if (formalArgName.Equals(withParam.Name))
{
QilNode value = withParam.Value;
XmlQueryType valueType = value.XmlType;
if (valueType != paramType)
{
if (valueType.IsNode && paramType.IsNode && valueType.IsSubtypeOf(paramType))
{
// We can pass it
}
else
{
// Formal argument has the same name but a different type
return false;
}
}
arg = value;
break;
}
}
}
if (arg == null)
{
// Formal argument has not been found among actual arguments
return false;
}
invokeArgs.Add(arg);
}
// All arguments have been found
return true;
}