Skip to content

Commit 2e62cfd

Browse files
Add DirectiveDescriptor to syntax model and remove from annotations
In addition to the mechanical work of transitioning from annotations to the syntax model, I added a handful of helpers to RazorDirectiveSyntax and used them throughout tooling layer.
1 parent d9c3607 commit 2e62cfd

File tree

25 files changed

+87
-102
lines changed

25 files changed

+87
-102
lines changed

src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/DefaultDirectiveSyntaxTreePass.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public override SyntaxNode VisitRazorDirective(RazorDirectiveSyntax node)
6969
{
7070
_cancellationToken.ThrowIfCancellationRequested();
7171

72-
if (node.DirectiveDescriptor?.Directive != SectionDirective.Directive.Directive)
72+
if (!node.IsDirective(SectionDirective.Directive))
7373
{
7474
// We only want to track the nesting of section directives.
7575
return base.VisitRazorDirective(node);

src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Legacy/CSharpCodeParser.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1900,11 +1900,10 @@ RazorDirectiveSyntax BuildDirective(SyntaxKind expectedTokenKindIfMissing)
19001900
var directiveCodeBlock = SyntaxFactory.CSharpCodeBlock(directiveBuilder.ToList());
19011901

19021902
var directiveBody = SyntaxFactory.RazorDirectiveBody(keywordBlock, directiveCodeBlock);
1903-
var directive = SyntaxFactory.RazorDirective(transition, directiveBody);
1903+
var directive = SyntaxFactory.RazorDirective(transition, directiveBody, descriptor);
19041904

19051905
var diagnostics = directiveErrorSink.GetErrorsAndClear();
19061906
directive = directive.WithDiagnosticsGreen(diagnostics);
1907-
directive = directive.WithDirectiveDescriptor(descriptor);
19081907
return directive;
19091908
}
19101909
}

src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/NamespaceComputer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ public override void VisitRazorDirective(RazorDirectiveSyntax node)
247247
{
248248
Debug.Assert(_source != null);
249249

250-
if (node.DirectiveDescriptor == NamespaceDirective.Directive &&
250+
if (node.IsDirective(NamespaceDirective.Directive) &&
251251
node.Body is RazorDirectiveBodySyntax { CSharpCode.Children: [_, CSharpSyntaxNode @namespace, ..] })
252252
{
253253
_lastNamespaceName = @namespace.GetContent();

src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/Generated/Syntax.xml.Internal.Generated.cs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3147,29 +3147,33 @@ internal sealed partial class RazorDirectiveSyntax : CSharpRazorBlockSyntax
31473147
{
31483148
internal readonly CSharpTransitionSyntax _transition;
31493149
internal readonly CSharpSyntaxNode _body;
3150+
internal readonly DirectiveDescriptor _directiveDescriptor;
31503151

3151-
internal RazorDirectiveSyntax(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
3152+
internal RazorDirectiveSyntax(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body, DirectiveDescriptor directiveDescriptor, RazorDiagnostic[] diagnostics, SyntaxAnnotation[] annotations)
31523153
: base(kind, diagnostics, annotations)
31533154
{
31543155
SlotCount = 2;
31553156
AdjustFlagsAndWidth(transition);
31563157
_transition = transition;
31573158
AdjustFlagsAndWidth(body);
31583159
_body = body;
3160+
_directiveDescriptor = directiveDescriptor;
31593161
}
31603162

3161-
internal RazorDirectiveSyntax(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body)
3163+
internal RazorDirectiveSyntax(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body, DirectiveDescriptor directiveDescriptor)
31623164
: base(kind)
31633165
{
31643166
SlotCount = 2;
31653167
AdjustFlagsAndWidth(transition);
31663168
_transition = transition;
31673169
AdjustFlagsAndWidth(body);
31683170
_body = body;
3171+
_directiveDescriptor = directiveDescriptor;
31693172
}
31703173

31713174
public override CSharpTransitionSyntax Transition => _transition;
31723175
public override CSharpSyntaxNode Body => _body;
3176+
public DirectiveDescriptor DirectiveDescriptor => _directiveDescriptor;
31733177

31743178
internal override GreenNode GetSlot(int index)
31753179
=> index switch
@@ -3184,11 +3188,11 @@ internal override GreenNode GetSlot(int index)
31843188
public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor) => visitor.VisitRazorDirective(this);
31853189
public override void Accept(SyntaxVisitor visitor) => visitor.VisitRazorDirective(this);
31863190

3187-
public RazorDirectiveSyntax Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
3191+
public RazorDirectiveSyntax Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body, DirectiveDescriptor directiveDescriptor)
31883192
{
31893193
if (transition != Transition || body != Body)
31903194
{
3191-
var newNode = SyntaxFactory.RazorDirective(transition, body);
3195+
var newNode = SyntaxFactory.RazorDirective(transition, body, directiveDescriptor);
31923196
var diags = GetDiagnostics();
31933197
if (diags != null && diags.Length > 0)
31943198
newNode = newNode.WithDiagnosticsGreen(diags);
@@ -3202,10 +3206,10 @@ public RazorDirectiveSyntax Update(CSharpTransitionSyntax transition, CSharpSynt
32023206
}
32033207

32043208
internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
3205-
=> new RazorDirectiveSyntax(Kind, _transition, _body, diagnostics, GetAnnotations());
3209+
=> new RazorDirectiveSyntax(Kind, _transition, _body, _directiveDescriptor, diagnostics, GetAnnotations());
32063210

32073211
internal override GreenNode SetAnnotations(SyntaxAnnotation[] annotations)
3208-
=> new RazorDirectiveSyntax(Kind, _transition, _body, GetDiagnostics(), annotations);
3212+
=> new RazorDirectiveSyntax(Kind, _transition, _body, _directiveDescriptor, GetDiagnostics(), annotations);
32093213
}
32103214

32113215
internal sealed partial class RazorDirectiveBodySyntax : CSharpSyntaxNode
@@ -3484,7 +3488,7 @@ public override GreenNode VisitCSharpImplicitExpressionBody(CSharpImplicitExpres
34843488
=> node.Update((CSharpCodeBlockSyntax)Visit(node.CSharpCode));
34853489

34863490
public override GreenNode VisitRazorDirective(RazorDirectiveSyntax node)
3487-
=> node.Update((CSharpTransitionSyntax)Visit(node.Transition), (CSharpSyntaxNode)Visit(node.Body));
3491+
=> node.Update((CSharpTransitionSyntax)Visit(node.Transition), (CSharpSyntaxNode)Visit(node.Body), node.DirectiveDescriptor);
34883492

34893493
public override GreenNode VisitRazorDirectiveBody(RazorDirectiveBodySyntax node)
34903494
=> node.Update((RazorSyntaxNode)Visit(node.Keyword), (CSharpCodeBlockSyntax)Visit(node.CSharpCode));
@@ -3871,12 +3875,12 @@ public static CSharpImplicitExpressionBodySyntax CSharpImplicitExpressionBody(CS
38713875
return result;
38723876
}
38733877

3874-
public static RazorDirectiveSyntax RazorDirective(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
3878+
public static RazorDirectiveSyntax RazorDirective(CSharpTransitionSyntax transition, CSharpSyntaxNode body, DirectiveDescriptor directiveDescriptor)
38753879
{
38763880
ArgHelper.ThrowIfNull(transition);
38773881
ArgHelper.ThrowIfNull(body);
38783882

3879-
var result = new RazorDirectiveSyntax(SyntaxKind.RazorDirective, transition, body);
3883+
var result = new RazorDirectiveSyntax(SyntaxKind.RazorDirective, transition, body, directiveDescriptor);
38803884

38813885
return result;
38823886
}

src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/Generated/Syntax.xml.Main.Generated.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ public override SyntaxNode VisitCSharpImplicitExpressionBody(CSharpImplicitExpre
369369
=> node.Update((CSharpCodeBlockSyntax)Visit(node.CSharpCode));
370370

371371
public override SyntaxNode VisitRazorDirective(RazorDirectiveSyntax node)
372-
=> node.Update((CSharpTransitionSyntax)Visit(node.Transition), (CSharpSyntaxNode)Visit(node.Body));
372+
=> node.Update((CSharpTransitionSyntax)Visit(node.Transition), (CSharpSyntaxNode)Visit(node.Body), node.DirectiveDescriptor);
373373

374374
public override SyntaxNode VisitRazorDirectiveBody(RazorDirectiveBodySyntax node)
375375
=> node.Update((RazorSyntaxNode)Visit(node.Keyword), (CSharpCodeBlockSyntax)Visit(node.CSharpCode));
@@ -796,13 +796,17 @@ public static CSharpImplicitExpressionBodySyntax CSharpImplicitExpressionBody()
796796
=> SyntaxFactory.CSharpImplicitExpressionBody(SyntaxFactory.CSharpCodeBlock());
797797

798798
/// <summary>Creates a new RazorDirectiveSyntax instance.</summary>
799-
public static RazorDirectiveSyntax RazorDirective(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
799+
public static RazorDirectiveSyntax RazorDirective(CSharpTransitionSyntax transition, CSharpSyntaxNode body, DirectiveDescriptor directiveDescriptor)
800800
{
801801
ArgHelper.ThrowIfNull(transition);
802802
ArgHelper.ThrowIfNull(body);
803-
return (RazorDirectiveSyntax)InternalSyntax.SyntaxFactory.RazorDirective(transition == null ? null : (InternalSyntax.CSharpTransitionSyntax)transition.Green, body == null ? null : (InternalSyntax.CSharpSyntaxNode)body.Green).CreateRed();
803+
return (RazorDirectiveSyntax)InternalSyntax.SyntaxFactory.RazorDirective(transition == null ? null : (InternalSyntax.CSharpTransitionSyntax)transition.Green, body == null ? null : (InternalSyntax.CSharpSyntaxNode)body.Green, directiveDescriptor).CreateRed();
804804
}
805805

806+
/// <summary>Creates a new RazorDirectiveSyntax instance.</summary>
807+
public static RazorDirectiveSyntax RazorDirective(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
808+
=> SyntaxFactory.RazorDirective(transition, body, default(DirectiveDescriptor));
809+
806810
/// <summary>Creates a new RazorDirectiveBodySyntax instance.</summary>
807811
public static RazorDirectiveBodySyntax RazorDirectiveBody(RazorSyntaxNode keyword, CSharpCodeBlockSyntax csharpCode)
808812
{

src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/Generated/Syntax.xml.Syntax.Generated.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2168,6 +2168,7 @@ internal RazorDirectiveSyntax(GreenNode green, SyntaxNode parent, int position)
21682168

21692169
public override CSharpTransitionSyntax Transition => GetRedAtZero(ref _transition);
21702170
public override CSharpSyntaxNode Body => GetRed(ref _body, 1);
2171+
public DirectiveDescriptor DirectiveDescriptor => ((InternalSyntax.RazorDirectiveSyntax)Green).DirectiveDescriptor;
21712172

21722173
internal override SyntaxNode GetNodeSlot(int index)
21732174
=> index switch
@@ -2188,11 +2189,11 @@ internal override SyntaxNode GetCachedSlot(int index)
21882189
public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor) => visitor.VisitRazorDirective(this);
21892190
public override void Accept(SyntaxVisitor visitor) => visitor.VisitRazorDirective(this);
21902191

2191-
public RazorDirectiveSyntax Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
2192+
public RazorDirectiveSyntax Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body, DirectiveDescriptor directiveDescriptor)
21922193
{
2193-
if (transition != Transition || body != Body)
2194+
if (transition != Transition || body != Body || directiveDescriptor != DirectiveDescriptor)
21942195
{
2195-
var newNode = SyntaxFactory.RazorDirective(transition, body);
2196+
var newNode = SyntaxFactory.RazorDirective(transition, body, directiveDescriptor);
21962197
var diagnostics = GetDiagnostics();
21972198
if (diagnostics != null && diagnostics.Length > 0)
21982199
newNode = newNode.WithDiagnostics(diagnostics);
@@ -2204,9 +2205,10 @@ public RazorDirectiveSyntax Update(CSharpTransitionSyntax transition, CSharpSynt
22042205
}
22052206

22062207
internal override CSharpRazorBlockSyntax WithTransitionCore(CSharpTransitionSyntax transition) => WithTransition(transition);
2207-
public new RazorDirectiveSyntax WithTransition(CSharpTransitionSyntax transition) => Update(transition, Body);
2208+
public new RazorDirectiveSyntax WithTransition(CSharpTransitionSyntax transition) => Update(transition, Body, DirectiveDescriptor);
22082209
internal override CSharpRazorBlockSyntax WithBodyCore(CSharpSyntaxNode body) => WithBody(body);
2209-
public new RazorDirectiveSyntax WithBody(CSharpSyntaxNode body) => Update(Transition, body);
2210+
public new RazorDirectiveSyntax WithBody(CSharpSyntaxNode body) => Update(Transition, body, DirectiveDescriptor);
2211+
public RazorDirectiveSyntax WithDirectiveDescriptor(DirectiveDescriptor directiveDescriptor) => Update(Transition, Body, directiveDescriptor);
22102212
}
22112213

22122214
internal sealed partial class RazorDirectiveBodySyntax : CSharpSyntaxNode

src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/InternalSyntax/RazorDirectiveSyntax.cs

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

src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/InternalSyntax/SyntaxFactory.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,7 @@ public static CSharpTransitionSyntax CSharpTransition(SyntaxToken transition)
3030

3131
public static MarkupTextLiteralSyntax MarkupTextLiteral(SyntaxList<SyntaxToken> literalTokens)
3232
=> MarkupTextLiteral(literalTokens, chunkGenerator: null, editHandler: null);
33+
34+
public static RazorDirectiveSyntax RazorDirective(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
35+
=> RazorDirective(transition, body, directiveDescriptor: null);
3336
}
Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,21 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4-
#nullable disable
4+
using System.Diagnostics.CodeAnalysis;
55

66
namespace Microsoft.AspNetCore.Razor.Language.Syntax;
77

88
internal sealed partial class RazorDirectiveSyntax
99
{
10-
private static readonly string DirectiveDescriptorKey = typeof(DirectiveDescriptor).Name;
10+
[MemberNotNullWhen(true, nameof(DirectiveDescriptor))]
11+
public bool HasDirectiveDescriptor
12+
=> DirectiveDescriptor is not null;
1113

12-
public DirectiveDescriptor DirectiveDescriptor
13-
{
14-
get
15-
{
16-
var descriptor = this.GetAnnotationValue(DirectiveDescriptorKey) as DirectiveDescriptor;
17-
return descriptor;
18-
}
19-
}
14+
[MemberNotNullWhen(true, nameof(DirectiveDescriptor))]
15+
public bool IsDirective(DirectiveDescriptor directive)
16+
=> DirectiveDescriptor == directive;
2017

21-
public RazorDirectiveSyntax WithDirectiveDescriptor(DirectiveDescriptor descriptor)
22-
{
23-
var newGreen = Green.WithAnnotationsGreen([.. GetAnnotations(), new(DirectiveDescriptorKey, descriptor)]);
24-
25-
return (RazorDirectiveSyntax)newGreen.CreateRed(Parent, Position);
26-
}
18+
[MemberNotNullWhen(true, nameof(DirectiveDescriptor))]
19+
public bool IsDirectiveKind(DirectiveKind kind)
20+
=> DirectiveDescriptor?.Kind == kind;
2721
}

src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/Syntax.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,7 @@
383383
<Field Name="Body" Type="CSharpSyntaxNode" Override="true">
384384
<Kind Name="RazorDirectiveBody" />
385385
</Field>
386+
<Field Name="DirectiveDescriptor" Type="DirectiveDescriptor" Optional="true" />
386387
</Node>
387388
<Node Name="RazorDirectiveBodySyntax" Base="CSharpSyntaxNode">
388389
<Kind Name="RazorDirectiveBody" />

0 commit comments

Comments
 (0)