private DirectiveTriviaSyntax GetPreviousPossiblyRelatedDirective() { DirectiveTriviaSyntax d = this; while (d != null) { d = d.GetPreviousDirective(); if (d != null) { // skip matched sets switch (d.Kind()) { case SyntaxKind.EndIfDirectiveTrivia: while (d != null && d.Kind() != SyntaxKind.IfDirectiveTrivia) { d = d.GetPreviousRelatedDirective(); } continue; case SyntaxKind.EndRegionDirectiveTrivia: while (d != null && d.Kind() != SyntaxKind.RegionDirectiveTrivia) { d = d.GetPreviousRelatedDirective(); } continue; } } return(d); } return(null); }
private void ClassifyPreprocessorDirective(DirectiveTriviaSyntax node) { if (!_textSpan.OverlapsWith(node.Span)) { return; } switch (node.Kind()) { case SyntaxKind.IfDirectiveTrivia: ClassifyIfDirective((IfDirectiveTriviaSyntax)node); break; case SyntaxKind.ElifDirectiveTrivia: ClassifyElifDirective((ElifDirectiveTriviaSyntax)node); break; case SyntaxKind.ElseDirectiveTrivia: ClassifyElseDirective((ElseDirectiveTriviaSyntax)node); break; case SyntaxKind.EndIfDirectiveTrivia: ClassifyEndIfDirective((EndIfDirectiveTriviaSyntax)node); break; case SyntaxKind.RegionDirectiveTrivia: ClassifyRegionDirective((RegionDirectiveTriviaSyntax)node); break; case SyntaxKind.EndRegionDirectiveTrivia: ClassifyEndRegionDirective((EndRegionDirectiveTriviaSyntax)node); break; case SyntaxKind.ErrorDirectiveTrivia: ClassifyErrorDirective((ErrorDirectiveTriviaSyntax)node); break; case SyntaxKind.WarningDirectiveTrivia: ClassifyWarningDirective((WarningDirectiveTriviaSyntax)node); break; case SyntaxKind.BadDirectiveTrivia: ClassifyBadDirective((BadDirectiveTriviaSyntax)node); break; case SyntaxKind.DefineDirectiveTrivia: ClassifyDefineDirective((DefineDirectiveTriviaSyntax)node); break; case SyntaxKind.UndefDirectiveTrivia: ClassifyUndefDirective((UndefDirectiveTriviaSyntax)node); break; case SyntaxKind.LineDirectiveTrivia: ClassifyLineDirective((LineDirectiveTriviaSyntax)node); break; case SyntaxKind.PragmaChecksumDirectiveTrivia: ClassifyPragmaChecksumDirective((PragmaChecksumDirectiveTriviaSyntax)node); break; case SyntaxKind.PragmaWarningDirectiveTrivia: ClassifyPragmaWarningDirective((PragmaWarningDirectiveTriviaSyntax)node); break; case SyntaxKind.ReferenceDirectiveTrivia: ClassifyReferenceDirective((ReferenceDirectiveTriviaSyntax)node); break; case SyntaxKind.LoadDirectiveTrivia: ClassifyLoadDirective((LoadDirectiveTriviaSyntax)node); break; } }
private static bool IsActiveConditionalDirective(DirectiveTriviaSyntax directive) { switch (directive.Kind()) { case SyntaxKind.DefineDirectiveTrivia: return ((DefineDirectiveTriviaSyntax)directive).IsActive; case SyntaxKind.UndefDirectiveTrivia: return ((UndefDirectiveTriviaSyntax)directive).IsActive; default: return false; } }
private static bool IsActiveConditionalDirective(DirectiveTriviaSyntax directive) { switch (directive.Kind()) { case SyntaxKind.DefineDirectiveTrivia: return(((DefineDirectiveTriviaSyntax)directive).IsActive); case SyntaxKind.UndefDirectiveTrivia: return(((UndefDirectiveTriviaSyntax)directive).IsActive); default: return(false); } }
private static bool HasRelatedDirectives(DirectiveTriviaSyntax directive) { switch (directive.Kind()) { case SyntaxKind.IfDirectiveTrivia: case SyntaxKind.ElseDirectiveTrivia: case SyntaxKind.ElifDirectiveTrivia: case SyntaxKind.EndIfDirectiveTrivia: case SyntaxKind.RegionDirectiveTrivia: case SyntaxKind.EndRegionDirectiveTrivia: return(true); default: return(false); } }
private static string GetReplacementText(DirectiveTriviaSyntax startDirective, DirectiveTriviaSyntax endDirective) { if (startDirective.Kind() == SyntaxKind.IfDirectiveTrivia && endDirective.Kind() == SyntaxKind.ElifDirectiveTrivia) { var elifDirective = (ElifDirectiveTriviaSyntax)endDirective; var elifKeyword = elifDirective.ElifKeyword; var newIfDirective = SyntaxFactory.IfDirectiveTrivia( elifDirective.HashToken, SyntaxFactory.Token(elifKeyword.LeadingTrivia, SyntaxKind.IfKeyword, "if", "if", elifKeyword.TrailingTrivia), elifDirective.Condition, elifDirective.EndOfDirectiveToken, elifDirective.IsActive, elifDirective.BranchTaken, elifDirective.ConditionValue); return newIfDirective.ToFullString(); } else { return endDirective.ToFullString(); } }
private DirectiveTriviaSyntax GetPreviousRelatedDirective() { DirectiveTriviaSyntax d = this; switch (d.Kind()) { case SyntaxKind.EndIfDirectiveTrivia: while (d != null) { switch (d.Kind()) { case SyntaxKind.IfDirectiveTrivia: case SyntaxKind.ElifDirectiveTrivia: case SyntaxKind.ElseDirectiveTrivia: return(d); } d = d.GetPreviousPossiblyRelatedDirective(); } break; case SyntaxKind.ElifDirectiveTrivia: d = d.GetPreviousPossiblyRelatedDirective(); while (d != null) { switch (d.Kind()) { case SyntaxKind.IfDirectiveTrivia: case SyntaxKind.ElifDirectiveTrivia: return(d); } d = d.GetPreviousPossiblyRelatedDirective(); } break; case SyntaxKind.ElseDirectiveTrivia: while (d != null) { switch (d.Kind()) { case SyntaxKind.IfDirectiveTrivia: case SyntaxKind.ElifDirectiveTrivia: return(d); } d = d.GetPreviousPossiblyRelatedDirective(); } break; case SyntaxKind.EndRegionDirectiveTrivia: while (d != null) { if (d.Kind() == SyntaxKind.RegionDirectiveTrivia) { return(d); } d = d.GetPreviousPossiblyRelatedDirective(); } break; } return(null); }
private static bool IsBranchingDirective(DirectiveTriviaSyntax directive) { switch (directive.Kind()) { case SyntaxKind.IfDirectiveTrivia: case SyntaxKind.ElifDirectiveTrivia: case SyntaxKind.ElseDirectiveTrivia: return true; default: return false; } }
private DirectiveTriviaSyntax SimplifyDirectiveExpression(DirectiveTriviaSyntax directive) { switch (directive.Kind()) { case SyntaxKind.IfDirectiveTrivia: { var ifDirective = (IfDirectiveTriviaSyntax)directive; return ifDirective.WithCondition((ExpressionSyntax)ifDirective.Condition.Accept(_expressionSimplifier)); } case SyntaxKind.ElifDirectiveTrivia: { var elifDirective = (ElifDirectiveTriviaSyntax)directive; return elifDirective.WithCondition((ExpressionSyntax)elifDirective.Condition.Accept(_expressionSimplifier)); } case SyntaxKind.ElseDirectiveTrivia: return directive; default: Debug.Assert(false); return null; } }
private Tristate EvaluateDirectiveExpression(DirectiveTriviaSyntax directive, Tristate previousRegionState) { switch (directive.Kind()) { case SyntaxKind.IfDirectiveTrivia: return EvaluateExpression(((IfDirectiveTriviaSyntax)directive).Condition); case SyntaxKind.ElifDirectiveTrivia: Tristate result = EvaluateExpression(((ElifDirectiveTriviaSyntax)directive).Condition); return !previousRegionState & result; case SyntaxKind.ElseDirectiveTrivia: return !previousRegionState; default: Debug.Assert(false); return Tristate.Varying; } }