private QilNode CompileCallTemplate(XslNodeEx node)
{
VerifyXPathQName(node.Name);
int varScope = _varHelper.StartVariables();
IList<XslNode> content = node.Content;
foreach (VarPar withParam in content)
{
CompileWithParam(withParam);
// In debug mode precalculate all with-param's
if (IsDebug)
{
QilNode val = withParam.Value;
QilIterator let = _f.Let(val);
let.DebugName = _f.QName("with-param " + withParam.Name.QualifiedName, XmlReservedNs.NsXslDebug).ToString();
_varHelper.AddVariable(let);
withParam.Value = let;
}
}
QilNode result;
{
Template tmpl;
if (_compiler.NamedTemplates.TryGetValue(node.Name, out tmpl))
{
Debug.Assert(tmpl.Function != null, "All templates should be already compiled");
result = _invkGen.GenerateInvoke(tmpl.Function, AddRemoveImplicitArgs(node.Content, tmpl.Flags));
}
else
{
if (!_compiler.IsPhantomName(node.Name))
{
_compiler.ReportError(/*[XT0710]*/node.SourceLine, SR.Xslt_InvalidCallTemplate, node.Name.QualifiedName);
}
result = _f.Sequence();
}
}
// Do not create an additional sequence point if there are no parameters
if (content.Count > 0)
{
result = SetLineInfo(result, node.ElemNameLi);
}
result = _varHelper.FinishVariables(result, varScope);
if (IsDebug)
{
return _f.Nop(result);
}
return result;
}