9
9
using Microsoft . CodeAnalysis . Formatting ;
10
10
using Microsoft . CodeAnalysis . CSharp ;
11
11
using System . Linq ;
12
+ using Microsoft . CodeAnalysis . CSharp . Syntax ;
12
13
13
14
namespace Microsoft . DotNet . CodeFormatting . Rules
14
15
{
@@ -17,20 +18,21 @@ internal sealed class IsFormattedFormattingRule : IFormattingRule
17
18
{
18
19
public async Task < Document > ProcessAsync ( Document document , CancellationToken cancellationToken )
19
20
{
21
+ var newDocument = await Formatter . FormatAsync ( document , cancellationToken : cancellationToken ) ;
20
22
// Roslyn formatter doesn't format code in #if false as it's considered as DisabledTextTrivia. Will be removed after the bug is fixed.
21
23
// Doing that manually here
22
- var syntaxRoot = await document . GetSyntaxRootAsync ( cancellationToken ) as CSharpSyntaxNode ;
23
- var oldTrivia = syntaxRoot . DescendantTrivia ( ) . Where ( trivia => trivia . CSharpKind ( ) == SyntaxKind . DisabledTextTrivia ) ;
24
- Func < SyntaxTrivia , SyntaxTrivia , SyntaxTrivia > replacementTrivia = ( trivia , dummy ) =>
25
- {
26
- var levelToIndent = trivia . Token . Parent . Ancestors ( ) . Count ( ) ;
27
- var compilation = SyntaxFactory . ParseCompilationUnit ( trivia . ToString ( ) ) ;
28
- var formattedTrivia = Formatter . Format ( compilation . SyntaxTree . GetRoot ( ) , document . Project . Solution . Workspace ) . GetText ( ) . ToString ( ) ;
29
- return SyntaxFactory . DisabledText ( formattedTrivia ) ;
30
- } ;
24
+ var syntaxRoot = await newDocument . GetSyntaxRootAsync ( cancellationToken ) as CSharpSyntaxNode ;
25
+ var preprocessorNamesDefined = newDocument . Project . ParseOptions . PreprocessorSymbolNames ;
26
+ var preprocessorNamesToAdd = syntaxRoot . DescendantTrivia ( ) . Where ( trivia => trivia . CSharpKind ( ) == SyntaxKind . IfDirectiveTrivia )
27
+ . SelectMany ( trivia => trivia . GetStructure ( ) . DescendantNodes ( ) . OfType < IdentifierNameSyntax > ( ) )
28
+ . Select ( identifier => identifier . Identifier . Text ) . Distinct ( ) . Where ( ( name ) => ! preprocessorNamesDefined . Contains ( name ) ) ;
29
+
30
+ var newParseOptions = new CSharpParseOptions ( ) . WithPreprocessorSymbols ( preprocessorNamesToAdd ) ;
31
31
32
- var newDocument = document . WithSyntaxRoot ( syntaxRoot . ReplaceTrivia ( oldTrivia , replacementTrivia ) ) ;
33
- return await Formatter . FormatAsync ( newDocument , cancellationToken : cancellationToken ) ;
32
+ var documentToProcess = newDocument . Project . WithParseOptions ( newParseOptions ) . GetDocument ( newDocument . Id ) ;
33
+ documentToProcess = await Formatter . FormatAsync ( documentToProcess , cancellationToken : cancellationToken ) ;
34
+
35
+ return documentToProcess . Project . WithParseOptions ( new CSharpParseOptions ( ) . WithPreprocessorSymbols ( preprocessorNamesDefined ) ) . GetDocument ( documentToProcess . Id ) ;
34
36
}
35
37
}
36
38
}
0 commit comments