public QilNode BuildMatcher(QilIterator it, IList <XslNode> actualArgs, QilNode otherwise) { QilNode matcher = f.Int32(NoMatch); matcher = MatchPatterns(it, T.PI, piPatterns, matcher); matcher = MatchPatterns(it, T.Comment, commentPatterns, matcher); matcher = MatchPatterns(it, T.Document, documentPatterns, matcher); matcher = MatchPatterns(it, T.Text, textPatterns, matcher); matcher = MatchPatterns(it, T.Attribute, attributePatterns, matcher); matcher = MatchPatterns(it, T.Element, elementPatterns, matcher); matcher = MatchPatternsWhosePriorityGreater(it, heterogenousPatterns, matcher); if (IsNoMatch(matcher)) { return(otherwise); } QilNode[] branches = new QilNode[this.priority + 2]; int priority = -1; foreach (List <TemplateMatch> list in allMatches) { foreach (TemplateMatch match in list) { branches[++priority] = invkGen.GenerateInvoke(match.TemplateFunction, actualArgs); } } branches[++priority] = otherwise; Debug.Assert(priority == branches.Length - 1); return(f.Choice(matcher, f.BranchList(branches))); }
public QilNode BuildMatcher(QilIterator it, IList <XslNode> actualArgs, QilNode otherwise) { QilNode matcher = _f.Int32(NoMatch); matcher = MatchPatterns(it, T.PI, _piPatterns, matcher); matcher = MatchPatterns(it, T.Comment, _commentPatterns, matcher); matcher = MatchPatterns(it, T.Document, _documentPatterns, matcher); matcher = MatchPatterns(it, T.Text, _textPatterns, matcher); matcher = MatchPatterns(it, T.Attribute, _attributePatterns, matcher); matcher = MatchPatterns(it, T.Element, _elementPatterns, matcher); matcher = MatchPatternsWhosePriorityGreater(it, _heterogenousPatterns, matcher); if (IsNoMatch(matcher)) { return(otherwise); } #if !DISABLE_SWITCH QilNode[] branches = new QilNode[_priority + 2]; int priority = -1; foreach (List <TemplateMatch> list in _allMatches) { foreach (TemplateMatch match in list) { branches[++priority] = _invkGen.GenerateInvoke(match.TemplateFunction !, actualArgs); } } branches[++priority] = otherwise; Debug.Assert(priority == branches.Length - 1); return(_f.Choice(matcher, _f.BranchList(branches))); #else QilIterator p = f.Let(matcher); QilNode result = otherwise; int priority = 0; foreach (List <TemplateMatch> list in allMatches) { foreach (TemplateMatch match in list) { result = f.Conditional(f.Eq(p, f.Int32(priority++)), invkGen.GenerateInvoke(match.TemplateFunction, actualArgs), result ); } } return(f.Loop(p, result)); #endif }