private void AddImplicitArgs(XslNode node) {
            Debug.Assert(
                node.NodeType == XslNodeType.CallTemplate ||
                node.NodeType == XslNodeType.UseAttributeSet ||
                node.NodeType == XslNodeType.ApplyTemplates ||
                node.NodeType == XslNodeType.ApplyImports
            );

            XslFlags flags = 0;

            if (IsDebug) {
                flags = XslFlags.FullFocus;
            } else {
                if (node.NodeType == XslNodeType.CallTemplate) {
                    Template tmpl;
                    if (compiler.NamedTemplates.TryGetValue(node.Name, out tmpl)) {
                        flags = tmpl.Flags;
                    }
                } else if (node.NodeType == XslNodeType.UseAttributeSet) {
                    AttributeSet attSet;
                    if (compiler.AttributeSets.TryGetValue(node.Name, out attSet)) {
                        flags = attSet.Flags;
                    }
                } else {
                    if (! compiler.ModeFlags.TryGetValue(node.Name, out flags)) {
                        flags = 0;
                    }
                    // Due to recursive nature of xsl:apply-templates/imports we always need current node
                    flags |= XslFlags.Current;
                }
            }

            List<XslNode> implicitArgs = new List<XslNode>(); {
                if ((flags & XslFlags.Current ) != 0) { implicitArgs.Add(CreateWithParam(nameCurrent , GetCurrentNode()    )); }
                if ((flags & XslFlags.Position) != 0) { implicitArgs.Add(CreateWithParam(namePosition, GetCurrentPosition())); }
                if ((flags & XslFlags.Last    ) != 0) { implicitArgs.Add(CreateWithParam(nameLast    , GetLastPosition()   )); }
            };

            node.InsertContent(implicitArgs);
        }