public static IEnumerable <IInlinedTokenItem> ObtainEdgeSourceTokenItems(this IEnumerable <Tuple <ITokenSource, FiniteAutomationSourceKind> > sources, FiniteAutomationSourceKind?kind = FiniteAutomationSourceKind.Final, bool includeOwner = false, FilterSourcePredicate filterer = null) { var sourceOwners = sources.Where(k => k.Item1 is IOilexerGrammarTokenEntry || (includeOwner && k.Item1 is IInlinedTokenItem)).Where(k => (kind == null || k.Item2 == kind)).Select(k => k.Item1 is IOilexerGrammarTokenEntry ? k : Tuple.Create((ITokenSource)(((IInlinedTokenItem)k.Item1).Root), k.Item2)).Distinct().ToArray(); var middletown = (from s in sources where (kind == null || (s.Item2 & kind) == kind) && (filterer == null || filterer(s.Item1, TokenSourceDerivedFrom.OriginalSources, s.Item2)) let isi = s.Item1 as ICaptureTokenStructuralItem let subQuery = from s2 in isi == null ? new ITokenSource[0] : (IEnumerable <ITokenSource>)isi.Sources select s2 from isiElement in subQuery.DefaultIfEmpty() let currentItem = (IInlinedTokenItem)((s.Item1 is IInlinedTokenItem) ? s.Item1 : isiElement) where currentItem != null where sourceOwners.Any(k => k.Item1 == currentItem.Root && (kind == null || (k.Item2 & kind) == kind) && (filterer == null || filterer(k.Item1, TokenSourceDerivedFrom.CaptureItemSources, k.Item2))) select currentItem).ToArray(); return(middletown); }
public static IEnumerable <IInlinedTokenItem> ObtainEdgeSourceTokenItems(this RegularLanguageDFAState state, FiniteAutomationSourceKind?kind = FiniteAutomationSourceKind.Final, bool includeOwner = false, FilterSourcePredicate filterer = null) { return(ObtainEdgeSourceTokenItems(state.Sources, kind, includeOwner, filterer)); }