Skip to content

Commit 92d59e5

Browse files
Merge pull request #68460 from CyrusNajmabadi/norecurse
Move off of recursion when determining pp-directive information for a file.
2 parents 724a31f + 924092e commit 92d59e5

File tree

21 files changed

+237
-525
lines changed

21 files changed

+237
-525
lines changed

src/Features/CSharp/Portable/BraceMatching/CSharpDirectiveTriviaBraceMatcher.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
using System;
66
using System.Collections.Generic;
7+
using System.Collections.Immutable;
78
using System.Composition;
89
using System.Linq;
910
using System.Threading;
@@ -27,13 +28,13 @@ public CSharpDirectiveTriviaBraceMatcher()
2728
{
2829
}
2930

30-
internal override List<DirectiveTriviaSyntax>? GetMatchingConditionalDirectives(DirectiveTriviaSyntax directive, CancellationToken cancellationToken)
31-
=> directive.GetMatchingConditionalDirectives(cancellationToken)?.ToList();
31+
protected override ImmutableArray<DirectiveTriviaSyntax> GetMatchingConditionalDirectives(DirectiveTriviaSyntax directive, CancellationToken cancellationToken)
32+
=> directive.GetMatchingConditionalDirectives(cancellationToken);
3233

33-
internal override DirectiveTriviaSyntax GetMatchingDirective(DirectiveTriviaSyntax directive, CancellationToken cancellationToken)
34-
=> directive.GetMatchingDirective(cancellationToken);
34+
protected override DirectiveTriviaSyntax? GetMatchingDirective(DirectiveTriviaSyntax directive, CancellationToken cancellationToken)
35+
=> directive.GetMatchingDirective(cancellationToken);
3536

3637
internal override TextSpan GetSpanForTagging(DirectiveTriviaSyntax directive)
37-
=> TextSpan.FromBounds(directive.HashToken.SpanStart, directive.DirectiveNameToken.Span.End);
38+
=> TextSpan.FromBounds(directive.HashToken.SpanStart, directive.DirectiveNameToken.Span.End);
3839
}
3940
}

src/Features/CSharp/Portable/Highlighting/KeywordHighlighters/ConditionalPreprocessorHighlighter.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33
// See the LICENSE file in the project root for more information.
44

5-
#nullable disable
6-
75
using System;
86
using System.Collections.Generic;
97
using System.Composition;
@@ -29,11 +27,6 @@ protected override void AddHighlights(
2927
DirectiveTriviaSyntax directive, List<TextSpan> highlights, CancellationToken cancellationToken)
3028
{
3129
var conditionals = directive.GetMatchingConditionalDirectives(cancellationToken);
32-
if (conditionals == null)
33-
{
34-
return;
35-
}
36-
3730
foreach (var conditional in conditionals)
3831
{
3932
highlights.Add(TextSpan.FromBounds(

src/Features/Core/Portable/BraceMatching/AbstractDirectiveTriviaBraceMatcher.cs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33
// See the LICENSE file in the project root for more information.
44

5-
#nullable disable
6-
7-
using System.Collections.Generic;
5+
using System.Collections.Immutable;
86
using System.Threading;
97
using System.Threading.Tasks;
8+
using Microsoft.CodeAnalysis.Shared.Extensions;
109
using Microsoft.CodeAnalysis.Text;
1110

1211
namespace Microsoft.CodeAnalysis.BraceMatching
@@ -23,29 +22,27 @@ internal abstract class AbstractDirectiveTriviaBraceMatcher<TDirectiveTriviaSynt
2322
where TRegionDirectiveTriviaSyntax : TDirectiveTriviaSyntax
2423
where TEndRegionDirectiveTriviaSyntax : TDirectiveTriviaSyntax
2524
{
26-
internal abstract List<TDirectiveTriviaSyntax> GetMatchingConditionalDirectives(TDirectiveTriviaSyntax directive, CancellationToken cancellationToken);
27-
internal abstract TDirectiveTriviaSyntax GetMatchingDirective(TDirectiveTriviaSyntax directive, CancellationToken cancellationToken);
25+
protected abstract ImmutableArray<TDirectiveTriviaSyntax> GetMatchingConditionalDirectives(TDirectiveTriviaSyntax directive, CancellationToken cancellationToken);
26+
protected abstract TDirectiveTriviaSyntax? GetMatchingDirective(TDirectiveTriviaSyntax directive, CancellationToken cancellationToken);
2827
internal abstract TextSpan GetSpanForTagging(TDirectiveTriviaSyntax directive);
2928

3029
public async Task<BraceMatchingResult?> FindBracesAsync(Document document, int position, BraceMatchingOptions options, CancellationToken cancellationToken)
3130
{
32-
var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
31+
var root = await document.GetRequiredSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
3332
var token = root.FindToken(position, findInsideTrivia: true);
3433

3534
if (token.Parent is not TDirectiveTriviaSyntax directive)
3635
{
3736
return null;
3837
}
3938

40-
TDirectiveTriviaSyntax matchingDirective = null;
39+
TDirectiveTriviaSyntax? matchingDirective = null;
4140
if (IsConditionalDirective(directive))
4241
{
4342
// #if/#elif/#else/#endif directive cases.
4443
var matchingDirectives = GetMatchingConditionalDirectives(directive, cancellationToken);
45-
if (matchingDirectives?.Count > 0)
46-
{
47-
matchingDirective = matchingDirectives[(matchingDirectives.IndexOf(directive) + 1) % matchingDirectives.Count];
48-
}
44+
if (matchingDirectives.Length > 0)
45+
matchingDirective = matchingDirectives[(matchingDirectives.IndexOf(directive) + 1) % matchingDirectives.Length];
4946
}
5047
else
5148
{
@@ -65,11 +62,9 @@ internal abstract class AbstractDirectiveTriviaBraceMatcher<TDirectiveTriviaSynt
6562
}
6663

6764
private static bool IsConditionalDirective(TDirectiveTriviaSyntax directive)
68-
{
69-
return directive is TIfDirectiveTriviaSyntax or
65+
=> directive is TIfDirectiveTriviaSyntax or
7066
TElseIfDirectiveTriviaSyntax or
7167
TElseDirectiveTriviaSyntax or
7268
TEndIfDirectiveTriviaSyntax;
73-
}
7469
}
7570
}

src/Features/VisualBasic/Portable/BraceMatching/VisualBasicDirectiveTriviaBraceMatcher.vb

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
' The .NET Foundation licenses this file to you under the MIT license.
33
' See the LICENSE file in the project root for more information.
44

5+
Imports System.Collections.Immutable
56
Imports System.Composition
67
Imports System.Threading
78
Imports Microsoft.CodeAnalysis.BraceMatching
@@ -22,11 +23,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.BraceMatching
2223
Public Sub New()
2324
End Sub
2425

25-
Friend Overrides Function GetMatchingConditionalDirectives(directive As DirectiveTriviaSyntax, cancellationToken As CancellationToken) As List(Of DirectiveTriviaSyntax)
26-
Return directive.GetMatchingConditionalDirectives(cancellationToken)?.ToList()
26+
Protected Overrides Function GetMatchingConditionalDirectives(directive As DirectiveTriviaSyntax, cancellationToken As CancellationToken) As ImmutableArray(Of DirectiveTriviaSyntax)
27+
Return directive.GetMatchingConditionalDirectives(cancellationToken)
2728
End Function
2829

29-
Friend Overrides Function GetMatchingDirective(directive As DirectiveTriviaSyntax, cancellationToken As CancellationToken) As DirectiveTriviaSyntax
30+
Protected Overrides Function GetMatchingDirective(directive As DirectiveTriviaSyntax, cancellationToken As CancellationToken) As DirectiveTriviaSyntax
3031
Return directive.GetMatchingStartOrEndDirective(cancellationToken)
3132
End Function
3233

@@ -40,7 +41,5 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.BraceMatching
4041

4142
Return TextSpan.FromBounds(directive.HashToken.SpanStart, keywordToken.Span.End)
4243
End Function
43-
4444
End Class
45-
4645
End Namespace

src/Features/VisualBasic/Portable/Highlighting/KeywordHighlighters/ConditionalPreprocessorHighlighter.vb

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.KeywordHighlighting
2121

2222
Protected Overloads Overrides Sub AddHighlights(directive As DirectiveTriviaSyntax, highlights As List(Of TextSpan), cancellationToken As CancellationToken)
2323
Dim conditionals = directive.GetMatchingConditionalDirectives(cancellationToken)
24-
If conditionals Is Nothing Then
25-
Return
26-
End If
27-
2824
For Each conditional In conditionals
2925
If TypeOf conditional Is IfDirectiveTriviaSyntax Then
3026
With DirectCast(conditional, IfDirectiveTriviaSyntax)

src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/CSharpCompilerExtensions.projitems

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@
2929
<Compile Include="$(MSBuildThisFileDirectory)Extensions\ConversionExtensions.cs" />
3030
<Compile Include="$(MSBuildThisFileDirectory)Extensions\DefaultExpressionSyntaxExtensions.cs" />
3131
<Compile Include="$(MSBuildThisFileDirectory)Extensions\DirectiveSyntaxExtensions.cs" />
32-
<Compile Include="$(MSBuildThisFileDirectory)Extensions\DirectiveSyntaxExtensions.DirectiveInfo.cs" />
33-
<Compile Include="$(MSBuildThisFileDirectory)Extensions\DirectiveSyntaxExtensions.DirectiveSyntaxEqualityComparer.cs" />
34-
<Compile Include="$(MSBuildThisFileDirectory)Extensions\DirectiveSyntaxExtensions.DirectiveWalker.cs" />
3532
<Compile Include="$(MSBuildThisFileDirectory)Extensions\ExpressionSyntaxExtensions.cs" />
3633
<Compile Include="$(MSBuildThisFileDirectory)Extensions\ForEachStatementSyntaxExtensions.cs" />
3734
<Compile Include="$(MSBuildThisFileDirectory)Extensions\ILocalSymbolExtensions.cs" />

src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/DirectiveSyntaxExtensions.DirectiveInfo.cs

Lines changed: 0 additions & 41 deletions
This file was deleted.

src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/DirectiveSyntaxExtensions.DirectiveSyntaxEqualityComparer.cs

Lines changed: 0 additions & 29 deletions
This file was deleted.

0 commit comments

Comments
 (0)