private DirectiveTriviaSyntax ParseElifDirective(SyntaxToken hash, SyntaxToken keyword, bool isActive, bool endIsActive)
{
_lexer.ExpandMacros = true;
var expr = ParseDirectiveExpression();
_lexer.ExpandMacros = false;
var eod = ParseEndOfDirective(false);
if (_directiveStack.HasPreviousIfOrElif())
{
var isTrue = EvaluateBool(expr);
var branchTaken = endIsActive && isTrue && !_directiveStack.PreviousBranchTaken();
return new ElifDirectiveTriviaSyntax(
hash, keyword, expr, eod,
endIsActive, branchTaken, isTrue);
}
eod = eod.WithLeadingTrivia(eod.LeadingTrivia.Add(new SyntaxTrivia(SyntaxKind.DisabledTextTrivia, expr.ToFullString(),
expr.SourceRange, expr.GetTextSpan(),
ImmutableArray<Diagnostic>.Empty)).ToArray());
if (_directiveStack.HasUnfinishedIf())
return WithDiagnostic(new BadDirectiveTriviaSyntax(hash, keyword, eod, isActive), DiagnosticId.EndIfDirectiveExpected);
return WithDiagnostic(new BadDirectiveTriviaSyntax(hash, keyword, eod, isActive), DiagnosticId.UnexpectedDirective, keyword);
}