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));
 }