private void BuildPreprocessorStateChangeMap() { DirectiveStack currentState = DirectiveStack.Empty; var positions = ArrayBuilder <int> .GetInstance(); var states = ArrayBuilder <DirectiveStack> .GetInstance(); foreach (IDirectiveTriviaSyntax directive in this.GetRootNode(). GetDirectives(d => { switch (((IDirectiveTriviaSyntax)d).Directive.Kind) { case DirectiveKind.If: case DirectiveKind.Elif: case DirectiveKind.Else: case DirectiveKind.EndIf: case DirectiveKind.Define: case DirectiveKind.Undef: return(true); default: return(false); } })) { currentState = currentState.Add(directive.Directive); int position = ((SyntaxNode)directive).SpanStart; switch (directive.Directive.Kind) { case DirectiveKind.If: // #if directive doesn't affect the set of defined/undefined symbols break; case DirectiveKind.Elif: case DirectiveKind.Else: case DirectiveKind.EndIf: case DirectiveKind.Define: case DirectiveKind.Undef: states.Add(currentState); positions.Add(position); break; default: throw ExceptionUtilities.UnexpectedValue(directive.Directive.Kind); } } #if DEBUG int currentPos = -1; foreach (int pos in positions) { Debug.Assert(currentPos < pos); currentPos = pos; } #endif ImmutableInterlocked.InterlockedInitialize(ref _preprocessorStates, states.ToImmutableAndFree()); ImmutableInterlocked.InterlockedInitialize(ref _preprocessorStateChangePositions, positions.ToImmutableAndFree()); }
internal override DirectiveStack ApplyDirectives(DirectiveStack stack) { return(stack.Add(new Directive(this))); }