// routines related to "reconstructing" the syntax tree from the saved tokens to do context checks /// <summary> /// Returns the context object for the given token index, ignoring empty fragments. /// Throws an ArgumentNullException if the given token index is null. /// </summary> private static Context.SyntaxTokenContext GetContext(this CodeFragment.TokenIndex tokenIndex) { if (tokenIndex == null) { throw new ArgumentNullException(nameof(tokenIndex)); } QsNullable <QsFragmentKind> Nullable(CodeFragment fragment) => fragment?.Kind == null ? QsNullable <QsFragmentKind> .Null : fragment.IncludeInCompilation ? QsNullable <QsFragmentKind> .NewValue(fragment.Kind) : QsNullable <QsFragmentKind> .NewValue(QsFragmentKind.InvalidFragment); var self = tokenIndex.GetFragment(); var previous = tokenIndex.PreviousOnScope()?.GetFragment(); // excludes empty tokens var next = tokenIndex.NextOnScope()?.GetFragment(); // excludes empty tokens var parents = tokenIndex.GetNonEmptyParents().Select(tIndex => Nullable(tIndex.GetFragment())).ToArray(); var nullableSelf = self?.Kind == null // special treatment such that errors for fragments excluded from compilation still get logged... ? QsNullable <QsFragmentKind> .Null : QsNullable <QsFragmentKind> .NewValue(self.Kind); var headerRange = self?.HeaderRange ?? QsCompilerDiagnostic.DefaultRange; return(new Context.SyntaxTokenContext(headerRange, nullableSelf, Nullable(previous), Nullable(next), parents)); }
// routines related to "reconstructing" the syntax tree from the saved tokens to do context checks /// <summary> /// Returns the context object for the given token index, ignoring empty fragments. /// </summary> private static Context.SyntaxTokenContext GetContext(this CodeFragment.TokenIndex tokenIndex) { QsNullable <QsFragmentKind> Nullable(CodeFragment?token, bool precedesSelf) => token?.Kind == null ? QsNullable <QsFragmentKind> .Null : precedesSelf && !token.IncludeInCompilation // fragments that *follow * self need to be re-evaluated first ? QsNullable <QsFragmentKind> .NewValue(QsFragmentKind.InvalidFragment) : QsNullable <QsFragmentKind> .NewValue(token.Kind); var fragment = tokenIndex.GetFragment(); var headerRange = fragment?.HeaderRange ?? Range.Zero; var self = Nullable(fragment, false); // making sure that errors for fragments excluded from compilation still get logged var previous = Nullable(tokenIndex.PreviousOnScope()?.GetFragment(), true); // excludes empty tokens var next = Nullable(tokenIndex.NextOnScope()?.GetFragment(), false); // excludes empty tokens var parents = tokenIndex.GetNonEmptyParents().Select(tIndex => Nullable(tIndex.GetFragment(), true)).ToArray(); return(new Context.SyntaxTokenContext(headerRange, self, previous, next, parents)); }