/// <summary> /// Creates a new document with preprocessor directives of the specified kind removed. /// </summary> /// <param name="document"></param> /// <param name="directiveKinds"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public static async Task <Document> RemovePreprocessorDirectivesAsync( this Document document, PreprocessorDirectiveKinds directiveKinds, CancellationToken cancellationToken = default(CancellationToken)) { if (document == null) { throw new ArgumentNullException(nameof(document)); } SyntaxNode root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); SourceText sourceText = await document.GetTextAsync(cancellationToken).ConfigureAwait(false); SourceText newSourceText = RemovePreprocessorDirectives(sourceText, root.DescendantPreprocessorDirectives(), directiveKinds); return(document.WithText(newSourceText)); }
private static SourceText RemovePreprocessorDirectives( SourceText sourceText, IEnumerable <DirectiveTriviaSyntax> directives, PreprocessorDirectiveKinds directiveKinds) { return(sourceText.WithChanges(GetTextChanges())); IEnumerable <TextChange> GetTextChanges() { TextLineCollection lines = sourceText.Lines; foreach (DirectiveTriviaSyntax directive in directives) { if (ShouldRemoveDirective(directive)) { int startLine = directive.GetSpanStartLine(); yield return(new TextChange(lines[startLine].SpanIncludingLineBreak, "")); } } } bool ShouldRemoveDirective(DirectiveTriviaSyntax directive) { switch (directive.Kind()) { case SyntaxKind.IfDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.If) != 0); case SyntaxKind.ElifDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.Elif) != 0); case SyntaxKind.ElseDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.Else) != 0); case SyntaxKind.EndIfDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.EndIf) != 0); case SyntaxKind.RegionDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.Region) != 0); case SyntaxKind.EndRegionDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.EndRegion) != 0); case SyntaxKind.DefineDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.Define) != 0); case SyntaxKind.UndefDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.Undef) != 0); case SyntaxKind.ErrorDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.Error) != 0); case SyntaxKind.WarningDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.Warning) != 0); case SyntaxKind.LineDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.Line) != 0); case SyntaxKind.PragmaWarningDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.PragmaWarning) != 0); case SyntaxKind.PragmaChecksumDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.PragmaChecksum) != 0); case SyntaxKind.ReferenceDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.Reference) != 0); case SyntaxKind.BadDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.Bad) != 0); case SyntaxKind.ShebangDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.Shebang) != 0); case SyntaxKind.LoadDirectiveTrivia: return((directiveKinds & PreprocessorDirectiveKinds.Load) != 0); } Debug.Fail(directive.Kind().ToString()); return(false); } }