Skip to content

Commit 7d91b81

Browse files
committed
Create specific syntax node type for using directives
1 parent 565d573 commit 7d91b81

File tree

5 files changed

+194
-3
lines changed

5 files changed

+194
-3
lines changed

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

Lines changed: 93 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2935,7 +2935,20 @@ internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
29352935
=> new CSharpImplicitExpressionBodySyntax(Kind, _csharpCode, diagnostics);
29362936
}
29372937

2938-
internal sealed partial class RazorDirectiveSyntax : CSharpRazorBlockSyntax
2938+
internal abstract partial class BaseRazorDirectiveSyntax : CSharpRazorBlockSyntax
2939+
{
2940+
internal BaseRazorDirectiveSyntax(SyntaxKind kind, RazorDiagnostic[] diagnostics)
2941+
: base(kind, diagnostics)
2942+
{
2943+
}
2944+
2945+
internal BaseRazorDirectiveSyntax(SyntaxKind kind)
2946+
: base(kind)
2947+
{
2948+
}
2949+
}
2950+
2951+
internal sealed partial class RazorDirectiveSyntax : BaseRazorDirectiveSyntax
29392952
{
29402953
internal readonly CSharpTransitionSyntax _transition;
29412954
internal readonly CSharpSyntaxNode _body;
@@ -2998,6 +3011,69 @@ internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
29983011
=> new RazorDirectiveSyntax(Kind, _transition, _body, _directiveDescriptor, diagnostics);
29993012
}
30003013

3014+
internal sealed partial class RazorUsingDirectiveSyntax : BaseRazorDirectiveSyntax
3015+
{
3016+
internal readonly CSharpTransitionSyntax _transition;
3017+
internal readonly CSharpSyntaxNode _body;
3018+
internal readonly DirectiveDescriptor _directiveDescriptor;
3019+
3020+
internal RazorUsingDirectiveSyntax(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body, DirectiveDescriptor directiveDescriptor, RazorDiagnostic[] diagnostics)
3021+
: base(kind, diagnostics)
3022+
{
3023+
SlotCount = 2;
3024+
AdjustFlagsAndWidth(transition);
3025+
_transition = transition;
3026+
AdjustFlagsAndWidth(body);
3027+
_body = body;
3028+
_directiveDescriptor = directiveDescriptor;
3029+
}
3030+
3031+
internal RazorUsingDirectiveSyntax(SyntaxKind kind, CSharpTransitionSyntax transition, CSharpSyntaxNode body, DirectiveDescriptor directiveDescriptor)
3032+
: base(kind)
3033+
{
3034+
SlotCount = 2;
3035+
AdjustFlagsAndWidth(transition);
3036+
_transition = transition;
3037+
AdjustFlagsAndWidth(body);
3038+
_body = body;
3039+
_directiveDescriptor = directiveDescriptor;
3040+
}
3041+
3042+
public override CSharpTransitionSyntax Transition => _transition;
3043+
public override CSharpSyntaxNode Body => _body;
3044+
public DirectiveDescriptor DirectiveDescriptor => _directiveDescriptor;
3045+
3046+
internal override GreenNode GetSlot(int index)
3047+
=> index switch
3048+
{
3049+
0 => _transition,
3050+
1 => _body,
3051+
_ => null
3052+
};
3053+
3054+
internal override SyntaxNode CreateRed(SyntaxNode parent, int position) => new Syntax.RazorUsingDirectiveSyntax(this, parent, position);
3055+
3056+
public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor) => visitor.VisitRazorUsingDirective(this);
3057+
public override void Accept(SyntaxVisitor visitor) => visitor.VisitRazorUsingDirective(this);
3058+
3059+
public RazorUsingDirectiveSyntax Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body, DirectiveDescriptor directiveDescriptor)
3060+
{
3061+
if (transition != Transition || body != Body)
3062+
{
3063+
var newNode = SyntaxFactory.RazorUsingDirective(transition, body, directiveDescriptor);
3064+
var diags = GetDiagnostics();
3065+
if (diags != null && diags.Length > 0)
3066+
newNode = newNode.WithDiagnosticsGreen(diags);
3067+
return newNode;
3068+
}
3069+
3070+
return this;
3071+
}
3072+
3073+
internal override GreenNode SetDiagnostics(RazorDiagnostic[] diagnostics)
3074+
=> new RazorUsingDirectiveSyntax(Kind, _transition, _body, _directiveDescriptor, diagnostics);
3075+
}
3076+
30013077
internal sealed partial class RazorDirectiveBodySyntax : CSharpSyntaxNode
30023078
{
30033079
internal readonly RazorSyntaxNode _keyword;
@@ -3104,6 +3180,7 @@ internal partial class SyntaxVisitor<TResult>
31043180
public virtual TResult VisitCSharpImplicitExpression(CSharpImplicitExpressionSyntax node) => DefaultVisit(node);
31053181
public virtual TResult VisitCSharpImplicitExpressionBody(CSharpImplicitExpressionBodySyntax node) => DefaultVisit(node);
31063182
public virtual TResult VisitRazorDirective(RazorDirectiveSyntax node) => DefaultVisit(node);
3183+
public virtual TResult VisitRazorUsingDirective(RazorUsingDirectiveSyntax node) => DefaultVisit(node);
31073184
public virtual TResult VisitRazorDirectiveBody(RazorDirectiveBodySyntax node) => DefaultVisit(node);
31083185
}
31093186

@@ -3148,6 +3225,7 @@ internal partial class SyntaxVisitor
31483225
public virtual void VisitCSharpImplicitExpression(CSharpImplicitExpressionSyntax node) => DefaultVisit(node);
31493226
public virtual void VisitCSharpImplicitExpressionBody(CSharpImplicitExpressionBodySyntax node) => DefaultVisit(node);
31503227
public virtual void VisitRazorDirective(RazorDirectiveSyntax node) => DefaultVisit(node);
3228+
public virtual void VisitRazorUsingDirective(RazorUsingDirectiveSyntax node) => DefaultVisit(node);
31513229
public virtual void VisitRazorDirectiveBody(RazorDirectiveBodySyntax node) => DefaultVisit(node);
31523230
}
31533231

@@ -3270,6 +3348,9 @@ public override GreenNode VisitCSharpImplicitExpressionBody(CSharpImplicitExpres
32703348
public override GreenNode VisitRazorDirective(RazorDirectiveSyntax node)
32713349
=> node.Update((CSharpTransitionSyntax)Visit(node.Transition), (CSharpSyntaxNode)Visit(node.Body), node.DirectiveDescriptor);
32723350

3351+
public override GreenNode VisitRazorUsingDirective(RazorUsingDirectiveSyntax node)
3352+
=> node.Update((CSharpTransitionSyntax)Visit(node.Transition), (CSharpSyntaxNode)Visit(node.Body), node.DirectiveDescriptor);
3353+
32733354
public override GreenNode VisitRazorDirectiveBody(RazorDirectiveBodySyntax node)
32743355
=> node.Update((RazorSyntaxNode)Visit(node.Keyword), (CSharpCodeBlockSyntax)Visit(node.CSharpCode));
32753356
}
@@ -3663,6 +3744,16 @@ public static RazorDirectiveSyntax RazorDirective(CSharpTransitionSyntax transit
36633744
return result;
36643745
}
36653746

3747+
public static RazorUsingDirectiveSyntax RazorUsingDirective(CSharpTransitionSyntax transition, CSharpSyntaxNode body, DirectiveDescriptor directiveDescriptor)
3748+
{
3749+
ArgHelper.ThrowIfNull(transition);
3750+
ArgHelper.ThrowIfNull(body);
3751+
3752+
var result = new RazorUsingDirectiveSyntax(SyntaxKind.RazorUsingDirective, transition, body, directiveDescriptor);
3753+
3754+
return result;
3755+
}
3756+
36663757
public static RazorDirectiveBodySyntax RazorDirectiveBody(RazorSyntaxNode keyword, CSharpCodeBlockSyntax csharpCode)
36673758
{
36683759
ArgHelper.ThrowIfNull(keyword);
@@ -3715,6 +3806,7 @@ internal static IEnumerable<Type> GetNodeTypes()
37153806
typeof(CSharpImplicitExpressionSyntax),
37163807
typeof(CSharpImplicitExpressionBodySyntax),
37173808
typeof(RazorDirectiveSyntax),
3809+
typeof(RazorUsingDirectiveSyntax),
37183810
typeof(RazorDirectiveBodySyntax)
37193811
};
37203812
}

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ internal partial class SyntaxVisitor<TResult>
125125
/// <summary>Called when the visitor visits a RazorDirectiveSyntax node.</summary>
126126
public virtual TResult VisitRazorDirective(RazorDirectiveSyntax node) => DefaultVisit(node);
127127

128+
/// <summary>Called when the visitor visits a RazorUsingDirectiveSyntax node.</summary>
129+
public virtual TResult VisitRazorUsingDirective(RazorUsingDirectiveSyntax node) => DefaultVisit(node);
130+
128131
/// <summary>Called when the visitor visits a RazorDirectiveBodySyntax node.</summary>
129132
public virtual TResult VisitRazorDirectiveBody(RazorDirectiveBodySyntax node) => DefaultVisit(node);
130133
}
@@ -248,6 +251,9 @@ internal partial class SyntaxVisitor
248251
/// <summary>Called when the visitor visits a RazorDirectiveSyntax node.</summary>
249252
public virtual void VisitRazorDirective(RazorDirectiveSyntax node) => DefaultVisit(node);
250253

254+
/// <summary>Called when the visitor visits a RazorUsingDirectiveSyntax node.</summary>
255+
public virtual void VisitRazorUsingDirective(RazorUsingDirectiveSyntax node) => DefaultVisit(node);
256+
251257
/// <summary>Called when the visitor visits a RazorDirectiveBodySyntax node.</summary>
252258
public virtual void VisitRazorDirectiveBody(RazorDirectiveBodySyntax node) => DefaultVisit(node);
253259
}
@@ -371,6 +377,9 @@ public override SyntaxNode VisitCSharpImplicitExpressionBody(CSharpImplicitExpre
371377
public override SyntaxNode VisitRazorDirective(RazorDirectiveSyntax node)
372378
=> node.Update((CSharpTransitionSyntax)Visit(node.Transition), (CSharpSyntaxNode)Visit(node.Body), node.DirectiveDescriptor);
373379

380+
public override SyntaxNode VisitRazorUsingDirective(RazorUsingDirectiveSyntax node)
381+
=> node.Update((CSharpTransitionSyntax)Visit(node.Transition), (CSharpSyntaxNode)Visit(node.Body), node.DirectiveDescriptor);
382+
374383
public override SyntaxNode VisitRazorDirectiveBody(RazorDirectiveBodySyntax node)
375384
=> node.Update((RazorSyntaxNode)Visit(node.Keyword), (CSharpCodeBlockSyntax)Visit(node.CSharpCode));
376385
}
@@ -807,6 +816,18 @@ public static RazorDirectiveSyntax RazorDirective(CSharpTransitionSyntax transit
807816
public static RazorDirectiveSyntax RazorDirective(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
808817
=> SyntaxFactory.RazorDirective(transition, body, default(DirectiveDescriptor));
809818

819+
/// <summary>Creates a new RazorUsingDirectiveSyntax instance.</summary>
820+
public static RazorUsingDirectiveSyntax RazorUsingDirective(CSharpTransitionSyntax transition, CSharpSyntaxNode body, DirectiveDescriptor directiveDescriptor)
821+
{
822+
ArgHelper.ThrowIfNull(transition);
823+
ArgHelper.ThrowIfNull(body);
824+
return (RazorUsingDirectiveSyntax)InternalSyntax.SyntaxFactory.RazorUsingDirective(transition == null ? null : (InternalSyntax.CSharpTransitionSyntax)transition.Green, body == null ? null : (InternalSyntax.CSharpSyntaxNode)body.Green, directiveDescriptor).CreateRed();
825+
}
826+
827+
/// <summary>Creates a new RazorUsingDirectiveSyntax instance.</summary>
828+
public static RazorUsingDirectiveSyntax RazorUsingDirective(CSharpTransitionSyntax transition, CSharpSyntaxNode body)
829+
=> SyntaxFactory.RazorUsingDirective(transition, body, default(DirectiveDescriptor));
830+
810831
/// <summary>Creates a new RazorDirectiveBodySyntax instance.</summary>
811832
public static RazorDirectiveBodySyntax RazorDirectiveBody(RazorSyntaxNode keyword, CSharpCodeBlockSyntax csharpCode)
812833
{

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

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2128,7 +2128,18 @@ public CSharpImplicitExpressionBodySyntax Update(CSharpCodeBlockSyntax csharpCod
21282128
public CSharpImplicitExpressionBodySyntax AddCSharpCodeChildren(params RazorSyntaxNode[] items) => WithCSharpCode(this.CSharpCode.WithChildren(this.CSharpCode.Children.AddRange(items)));
21292129
}
21302130

2131-
internal sealed partial class RazorDirectiveSyntax : CSharpRazorBlockSyntax
2131+
internal abstract partial class BaseRazorDirectiveSyntax : CSharpRazorBlockSyntax
2132+
{
2133+
internal BaseRazorDirectiveSyntax(GreenNode green, SyntaxNode parent, int position)
2134+
: base(green, parent, position)
2135+
{
2136+
}
2137+
2138+
public new BaseRazorDirectiveSyntax WithTransition(CSharpTransitionSyntax transition) => (BaseRazorDirectiveSyntax)WithTransitionCore(transition);
2139+
public new BaseRazorDirectiveSyntax WithBody(CSharpSyntaxNode body) => (BaseRazorDirectiveSyntax)WithBodyCore(body);
2140+
}
2141+
2142+
internal sealed partial class RazorDirectiveSyntax : BaseRazorDirectiveSyntax
21322143
{
21332144
private CSharpTransitionSyntax _transition;
21342145
private CSharpSyntaxNode _body;
@@ -2182,6 +2193,60 @@ public RazorDirectiveSyntax Update(CSharpTransitionSyntax transition, CSharpSynt
21822193
public RazorDirectiveSyntax WithDirectiveDescriptor(DirectiveDescriptor directiveDescriptor) => Update(Transition, Body, directiveDescriptor);
21832194
}
21842195

2196+
internal sealed partial class RazorUsingDirectiveSyntax : BaseRazorDirectiveSyntax
2197+
{
2198+
private CSharpTransitionSyntax _transition;
2199+
private CSharpSyntaxNode _body;
2200+
2201+
internal RazorUsingDirectiveSyntax(GreenNode green, SyntaxNode parent, int position)
2202+
: base(green, parent, position)
2203+
{
2204+
}
2205+
2206+
public override CSharpTransitionSyntax Transition => GetRedAtZero(ref _transition);
2207+
public override CSharpSyntaxNode Body => GetRed(ref _body, 1);
2208+
public DirectiveDescriptor DirectiveDescriptor => ((InternalSyntax.RazorUsingDirectiveSyntax)Green).DirectiveDescriptor;
2209+
2210+
internal override SyntaxNode GetNodeSlot(int index)
2211+
=> index switch
2212+
{
2213+
0 => GetRedAtZero(ref _transition),
2214+
1 => GetRed(ref _body, 1),
2215+
_ => null
2216+
};
2217+
2218+
internal override SyntaxNode GetCachedSlot(int index)
2219+
=> index switch
2220+
{
2221+
0 => this._transition,
2222+
1 => this._body,
2223+
_ => null
2224+
};
2225+
2226+
public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor) => visitor.VisitRazorUsingDirective(this);
2227+
public override void Accept(SyntaxVisitor visitor) => visitor.VisitRazorUsingDirective(this);
2228+
2229+
public RazorUsingDirectiveSyntax Update(CSharpTransitionSyntax transition, CSharpSyntaxNode body, DirectiveDescriptor directiveDescriptor)
2230+
{
2231+
if (transition != Transition || body != Body || directiveDescriptor != DirectiveDescriptor)
2232+
{
2233+
var newNode = SyntaxFactory.RazorUsingDirective(transition, body, directiveDescriptor);
2234+
var diagnostics = GetDiagnostics();
2235+
if (diagnostics != null && diagnostics.Length > 0)
2236+
newNode = newNode.WithDiagnostics(diagnostics);
2237+
return newNode;
2238+
}
2239+
2240+
return this;
2241+
}
2242+
2243+
internal override CSharpRazorBlockSyntax WithTransitionCore(CSharpTransitionSyntax transition) => WithTransition(transition);
2244+
public new RazorUsingDirectiveSyntax WithTransition(CSharpTransitionSyntax transition) => Update(transition, Body, DirectiveDescriptor);
2245+
internal override CSharpRazorBlockSyntax WithBodyCore(CSharpSyntaxNode body) => WithBody(body);
2246+
public new RazorUsingDirectiveSyntax WithBody(CSharpSyntaxNode body) => Update(Transition, body, DirectiveDescriptor);
2247+
public RazorUsingDirectiveSyntax WithDirectiveDescriptor(DirectiveDescriptor directiveDescriptor) => Update(Transition, Body, directiveDescriptor);
2248+
}
2249+
21852250
internal sealed partial class RazorDirectiveBodySyntax : CSharpSyntaxNode
21862251
{
21872252
private RazorSyntaxNode _keyword;

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,9 @@
380380
<Kind Name="CSharpImplicitExpressionBody" />
381381
<Field Name="CSharpCode" Type="CSharpCodeBlockSyntax" />
382382
</Node>
383-
<Node Name="RazorDirectiveSyntax" Base="CSharpRazorBlockSyntax">
383+
<AbstractNode Name="BaseRazorDirectiveSyntax" Base="CSharpRazorBlockSyntax">
384+
</AbstractNode>
385+
<Node Name="RazorDirectiveSyntax" Base="BaseRazorDirectiveSyntax">
384386
<Kind Name="RazorDirective" />
385387
<Field Name="Transition" Type="CSharpTransitionSyntax" Override="true">
386388
<Kind Name="CSharpTransition" />
@@ -390,6 +392,16 @@
390392
</Field>
391393
<Field Name="DirectiveDescriptor" Type="DirectiveDescriptor" Optional="true" />
392394
</Node>
395+
<Node Name="RazorUsingDirectiveSyntax" Base="BaseRazorDirectiveSyntax">
396+
<Kind Name="RazorUsingDirective" />
397+
<Field Name="Transition" Type="CSharpTransitionSyntax" Override="true">
398+
<Kind Name="CSharpTransition" />
399+
</Field>
400+
<Field Name="Body" Type="CSharpSyntaxNode" Override="true">
401+
<Kind Name="RazorDirectiveBody" />
402+
</Field>
403+
<Field Name="DirectiveDescriptor" Type="DirectiveDescriptor" Optional="true" />
404+
</Node>
393405
<Node Name="RazorDirectiveBodySyntax" Base="CSharpSyntaxNode">
394406
<Kind Name="RazorDirectiveBody" />
395407
<Field Name="Keyword" Type="RazorSyntaxNode" />

src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/Syntax/SyntaxKind.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ internal enum SyntaxKind : byte
1414
RazorComment,
1515
RazorMetaCode,
1616
RazorDirective,
17+
RazorUsingDirective,
1718
RazorDirectiveBody,
1819
UnclassifiedTextLiteral,
1920

0 commit comments

Comments
 (0)