Skip to content

Commit 07adf33

Browse files
Remove SpanEditHandler from annotations
This change updates the compiler to update and use SpanEditHandlers from the syntax model rather than as annotations.
1 parent 14c5939 commit 07adf33

37 files changed

+460
-326
lines changed

src/Compiler/Microsoft.AspNetCore.Razor.Language/legacyTest/Legacy/ImplicitExpressionEditHandlerTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,8 @@ private static Syntax.MarkupTextLiteralSyntax GetSyntaxNode(SourceLocation start
451451
{
452452
builder.Add(token);
453453
}
454-
var node = SyntaxFactory.MarkupTextLiteral(builder.ToList(), SpanChunkGenerator.Null).CreateRed(parent: null, position: start.AbsoluteIndex);
454+
var node = SyntaxFactory.MarkupTextLiteral(builder.ToList(), SpanChunkGenerator.Null, editHandler: null)
455+
.CreateRed(parent: null, position: start.AbsoluteIndex);
455456

456457
return (Syntax.MarkupTextLiteralSyntax)node;
457458
}

src/Compiler/Microsoft.AspNetCore.Razor.Language/test/DirectiveTokenEditHandlerTest.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,7 @@ private static CSharpStatementLiteralSyntax GetSyntaxNode(DirectiveTokenEditHand
7272
builder.Add(new SyntaxToken(token));
7373
}
7474

75-
var node = SyntaxFactory.CSharpStatementLiteral(builder.ToList(), SpanChunkGenerator.Null);
76-
77-
return node.WithEditHandler(editHandler);
75+
return SyntaxFactory.CSharpStatementLiteral(builder.ToList(), SpanChunkGenerator.Null, editHandler);
7876
}
7977

8078
private class TestDirectiveTokenEditHandler : DirectiveTokenEditHandler

src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Legacy/CodeBlockEditHandlerTest.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,8 +289,7 @@ private static SyntaxNode GetSpan(SourceLocation start, string content)
289289
{
290290
builder.Add(new SyntaxToken(token));
291291
}
292-
var node = SyntaxFactory.CSharpStatementLiteral(builder.ToList(), SpanChunkGenerator.Null);
293292

294-
return node;
293+
return SyntaxFactory.CSharpStatementLiteral(builder.ToList(), SpanChunkGenerator.Null, editHandler: null);
295294
}
296295
}

src/Compiler/Microsoft.AspNetCore.Razor.Language/test/SourceChangeTest.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public void GetEditedContent_SyntaxNode_ReturnsNewContent()
110110
builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "Hello, "));
111111
builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "World"));
112112

113-
var node = SyntaxFactory.MarkupTextLiteral(builder.ToList(), SpanChunkGenerator.Null).CreateRed();
113+
var node = SyntaxFactory.MarkupTextLiteral(builder.ToList(), SpanChunkGenerator.Null, editHandler: null).CreateRed();
114114

115115
var change = new SourceChange(2, 2, "heyo");
116116

@@ -129,7 +129,7 @@ public void GetOffSet_SpanIsOwner_ReturnsOffset()
129129
builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "Hello, "));
130130
builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "World"));
131131

132-
var node = SyntaxFactory.MarkupTextLiteral(builder.ToList(), SpanChunkGenerator.Null).CreateRed(null, 13);
132+
var node = SyntaxFactory.MarkupTextLiteral(builder.ToList(), SpanChunkGenerator.Null, editHandler: null).CreateRed(null, 13);
133133

134134
var change = new SourceChange(15, 2, "heyo");
135135

@@ -148,7 +148,7 @@ public void GetOffSet_SpanIsNotOwnerOfChange_ThrowsException()
148148
builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "Hello, "));
149149
builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "World"));
150150

151-
var node = SyntaxFactory.MarkupTextLiteral(builder.ToList(), SpanChunkGenerator.Null).CreateRed(null, 13);
151+
var node = SyntaxFactory.MarkupTextLiteral(builder.ToList(), SpanChunkGenerator.Null, editHandler: null).CreateRed(null, 13);
152152

153153
var change = new SourceChange(12, 2, "heyo");
154154

@@ -167,7 +167,7 @@ public void GetOrigninalText_SpanIsOwner_ReturnsContent()
167167
builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "Hello, "));
168168
builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "World"));
169169

170-
var node = SyntaxFactory.MarkupTextLiteral(builder.ToList(), SpanChunkGenerator.Null).CreateRed(null, 13);
170+
var node = SyntaxFactory.MarkupTextLiteral(builder.ToList(), SpanChunkGenerator.Null, editHandler: null).CreateRed(null, 13);
171171

172172
var change = new SourceChange(15, 2, "heyo");
173173

@@ -186,7 +186,7 @@ public void GetOrigninalText_SpanIsOwner_ReturnsContent_ZeroLengthSpan()
186186
builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "Hello, "));
187187
builder.Add(SyntaxFactory.Token(SyntaxKind.Marker, "World"));
188188

189-
var node = SyntaxFactory.MarkupTextLiteral(builder.ToList(), SpanChunkGenerator.Null).CreateRed(null, 13);
189+
var node = SyntaxFactory.MarkupTextLiteral(builder.ToList(), SpanChunkGenerator.Null, editHandler: null).CreateRed(null, 13);
190190

191191
var change = new SourceChange(15, 0, "heyo");
192192

src/Compiler/Microsoft.AspNetCore.Razor.Language/test/Syntax/SyntaxListTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ private static MarkupTextLiteralSyntax CreateMarkupTextLiteral(params ReadOnlySp
1515
using var builder = new PooledArrayBuilder<SyntaxToken>(tokens.Length);
1616
builder.AddRange(tokens);
1717

18-
return SyntaxFactory.MarkupTextLiteral(builder.ToList(), chunkGenerator: null);
18+
return SyntaxFactory.MarkupTextLiteral(builder.ToList());
1919
}
2020

2121
private static readonly SyntaxToken s_openAngle = SyntaxFactory.Token(SyntaxKind.OpenAngle, "<");

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

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -595,12 +595,13 @@ protected static MarkupTextLiteralSyntax MergeAttributeValue(MarkupLiteralAttrib
595595
node.Prefix?.LiteralTokens,
596596
node.Value?.LiteralTokens);
597597

598-
var rewritten = node.Prefix?.Update(valueTokens, node.Prefix.ChunkGenerator) ?? node.Value?.Update(valueTokens, node.Value.ChunkGenerator);
598+
var rewritten = node.Prefix?.Update(valueTokens) ?? node.Value?.Update(valueTokens);
599+
599600
rewritten = (MarkupTextLiteralSyntax)rewritten?.Green.CreateRed(node, node.Position);
600601

601-
if (rewritten.GetEditHandler() is { } originalEditHandler)
602+
if (rewritten.EditHandler is { } originalEditHandler)
602603
{
603-
rewritten = rewritten.Update(rewritten.LiteralTokens, MarkupChunkGenerator.Instance).WithEditHandler(originalEditHandler);
604+
rewritten = rewritten.Update(rewritten.LiteralTokens, MarkupChunkGenerator.Instance, originalEditHandler);
604605
}
605606

606607
return rewritten;
@@ -633,7 +634,8 @@ public override void VisitMarkupAttributeBlock(MarkupAttributeBlockSyntax node)
633634
new SyntaxTokenList(node.EqualsToken),
634635
node.ValuePrefix?.LiteralTokens);
635636

636-
var prefix = (MarkupTextLiteralSyntax)SyntaxFactory.MarkupTextLiteral(prefixTokens, chunkGenerator: null).Green.CreateRed(node, node.NamePrefix?.Position ?? node.Name.Position);
637+
var position = node.NamePrefix?.Position ?? node.Name.Position;
638+
var prefix = (MarkupTextLiteralSyntax)SyntaxFactory.MarkupTextLiteral(prefixTokens).Green.CreateRed(node, position);
637639

638640
var name = node.Name.GetContent();
639641
if (!_options.AllowConditionalDataDashAttributes && name.StartsWith("data-", StringComparison.OrdinalIgnoreCase))
@@ -658,14 +660,14 @@ public override void VisitMarkupAttributeBlock(MarkupAttributeBlockSyntax node)
658660
builder.AddRange(mergedValue.LiteralTokens);
659661
}
660662

661-
var rewritten = SyntaxFactory.MarkupTextLiteral(builder.ToList(), chunkGenerator: null);
663+
var rewritten = SyntaxFactory.MarkupTextLiteral(builder.ToList());
662664

663665
var mergedLiterals = MergeTokenLists(
664666
prefix?.LiteralTokens,
665667
rewritten.LiteralTokens,
666668
node.ValueSuffix?.LiteralTokens);
667669

668-
var mergedAttribute = SyntaxFactory.MarkupTextLiteral(mergedLiterals, chunkGenerator: null).Green.CreateRed(node.Parent, node.Position);
670+
var mergedAttribute = SyntaxFactory.MarkupTextLiteral(mergedLiterals).Green.CreateRed(node.Parent, node.Position);
669671
Visit(mergedAttribute);
670672

671673
return;
@@ -704,7 +706,7 @@ public override void VisitMarkupMinimizedAttributeBlock(MarkupMinimizedAttribute
704706
node.NamePrefix?.LiteralTokens,
705707
node.Name?.LiteralTokens);
706708

707-
var literal = SyntaxFactory.MarkupTextLiteral(literals, chunkGenerator: null).Green.CreateRed(node.Parent, node.Position);
709+
var literal = SyntaxFactory.MarkupTextLiteral(literals).Green.CreateRed(node.Parent, node.Position);
708710

709711
Visit(literal);
710712
}
@@ -889,7 +891,7 @@ public override void VisitCSharpExpressionLiteral(CSharpExpressionLiteralSyntax
889891
// If we are top level in a tag helper HTML attribute, we want to be rendered as markup.
890892
// This case happens for duplicate non-string bound attributes. They would be initially be categorized as
891893
// CSharp but since they are duplicate, they should just be markup.
892-
var markupLiteral = SyntaxFactory.MarkupTextLiteral(node.LiteralTokens, chunkGenerator: null).Green.CreateRed(node.Parent, node.Position);
894+
var markupLiteral = SyntaxFactory.MarkupTextLiteral(node.LiteralTokens).Green.CreateRed(node.Parent, node.Position);
893895
Visit(markupLiteral);
894896
return;
895897
}
@@ -1184,7 +1186,7 @@ private void VisitAttributeValue(SyntaxNode node)
11841186
builder.AddRange(mergedValue.LiteralTokens);
11851187
}
11861188

1187-
var rewritten = SyntaxFactory.MarkupTextLiteral(builder.ToList(), chunkGenerator: null).Green.CreateRed(node.Parent, position);
1189+
var rewritten = SyntaxFactory.MarkupTextLiteral(builder.ToList()).Green.CreateRed(node.Parent, position);
11881190
Visit(rewritten);
11891191
}
11901192
else if (children.TryCast<MarkupTextLiteralSyntax>(out var markupLiteralArray))
@@ -1196,7 +1198,7 @@ private void VisitAttributeValue(SyntaxNode node)
11961198
builder.AddRange(literal.LiteralTokens);
11971199
}
11981200

1199-
var rewritten = SyntaxFactory.MarkupTextLiteral(builder.ToList(), chunkGenerator: null).Green.CreateRed(node.Parent, position);
1201+
var rewritten = SyntaxFactory.MarkupTextLiteral(builder.ToList()).Green.CreateRed(node.Parent, position);
12001202
Visit(rewritten);
12011203
}
12021204
else if (children.TryCast<CSharpExpressionLiteralSyntax>(out var expressionLiteralArray))
@@ -1208,12 +1210,11 @@ private void VisitAttributeValue(SyntaxNode node)
12081210
foreach (var literal in expressionLiteralArray)
12091211
{
12101212
generator = literal.ChunkGenerator;
1211-
editHandler = literal.GetEditHandler();
1213+
editHandler = literal.EditHandler;
12121214
builder.AddRange(literal.LiteralTokens);
12131215
}
12141216

1215-
var rewritten = SyntaxFactory.CSharpExpressionLiteral(builder.ToList(), generator).Green.CreateRed(node.Parent, position);
1216-
rewritten = editHandler != null ? rewritten.WithEditHandler(editHandler) : rewritten;
1217+
var rewritten = SyntaxFactory.CSharpExpressionLiteral(builder.ToList(), generator, editHandler).Green.CreateRed(node.Parent, position);
12171218
Visit(rewritten);
12181219
}
12191220
else
@@ -1380,7 +1381,8 @@ public override void VisitMarkupAttributeBlock(MarkupAttributeBlockSyntax node)
13801381
new SyntaxTokenList(node.EqualsToken),
13811382
node.ValuePrefix?.LiteralTokens);
13821383

1383-
var prefix = (MarkupTextLiteralSyntax)SyntaxFactory.MarkupTextLiteral(prefixTokens, chunkGenerator: null).Green.CreateRed(node, node.NamePrefix?.Position ?? node.Name.Position);
1384+
var position = node.NamePrefix?.Position ?? node.Name.Position;
1385+
var prefix = (MarkupTextLiteralSyntax)SyntaxFactory.MarkupTextLiteral(prefixTokens).Green.CreateRed(node, position);
13841386

13851387
var name = node.Name.GetContent();
13861388
_builder.Push(new HtmlAttributeIntermediateNode()
@@ -1402,7 +1404,8 @@ public override void VisitMarkupMinimizedAttributeBlock(MarkupMinimizedAttribute
14021404
node.NamePrefix?.LiteralTokens,
14031405
node.Name.LiteralTokens);
14041406

1405-
var prefix = (MarkupTextLiteralSyntax)SyntaxFactory.MarkupTextLiteral(prefixTokens, chunkGenerator: null).Green.CreateRed(node, node.NamePrefix?.Position ?? node.Name.Position);
1407+
var position = node.NamePrefix?.Position ?? node.Name.Position;
1408+
var prefix = (MarkupTextLiteralSyntax)SyntaxFactory.MarkupTextLiteral(prefixTokens).Green.CreateRed(node, position);
14061409

14071410
var name = node.Name.GetContent();
14081411
_builder.Add(new HtmlAttributeIntermediateNode()
@@ -1492,7 +1495,7 @@ public override void VisitMarkupTextLiteral(MarkupTextLiteralSyntax node)
14921495
return;
14931496
}
14941497

1495-
var context = node.GetEditHandler();
1498+
var context = node.EditHandler;
14961499
if (node.ChunkGenerator == SpanChunkGenerator.Null)
14971500
{
14981501
return;
@@ -1699,7 +1702,7 @@ public override void VisitCSharpExpressionLiteral(CSharpExpressionLiteralSyntax
16991702
// If we are top level in a tag helper HTML attribute, we want to be rendered as markup.
17001703
// This case happens for duplicate non-string bound attributes. They would be initially be categorized as
17011704
// CSharp but since they are duplicate, they should just be markup.
1702-
var markupLiteral = SyntaxFactory.MarkupTextLiteral(node.LiteralTokens, chunkGenerator: null).Green.CreateRed(node.Parent, node.Position);
1705+
var markupLiteral = SyntaxFactory.MarkupTextLiteral(node.LiteralTokens).Green.CreateRed(node.Parent, node.Position);
17031706
Visit(markupLiteral);
17041707
return;
17051708
}
@@ -2047,7 +2050,7 @@ private void VisitAttributeValue(SyntaxNode node)
20472050
valueTokens.AddRange(mergedValue.LiteralTokens);
20482051
}
20492052

2050-
var rewritten = SyntaxFactory.MarkupTextLiteral(valueTokens.ToList(), chunkGenerator: null).Green.CreateRed(node.Parent, position);
2053+
var rewritten = SyntaxFactory.MarkupTextLiteral(valueTokens.ToList()).Green.CreateRed(node.Parent, position);
20512054
Visit(rewritten);
20522055
}
20532056
else if (children.TryCast<MarkupTextLiteralSyntax>(out var markupLiteralArray))
@@ -2059,7 +2062,7 @@ private void VisitAttributeValue(SyntaxNode node)
20592062
builder.AddRange(literal.LiteralTokens);
20602063
}
20612064

2062-
var rewritten = SyntaxFactory.MarkupTextLiteral(builder.ToList(), chunkGenerator: null).Green.CreateRed(node.Parent, position);
2065+
var rewritten = SyntaxFactory.MarkupTextLiteral(builder.ToList()).Green.CreateRed(node.Parent, position);
20632066
Visit(rewritten);
20642067
}
20652068
else if (children.TryCast<CSharpExpressionLiteralSyntax>(out var expressionLiteralArray))
@@ -2071,16 +2074,11 @@ private void VisitAttributeValue(SyntaxNode node)
20712074
foreach (var literal in expressionLiteralArray)
20722075
{
20732076
generator = literal.ChunkGenerator;
2074-
editHandler = literal.GetEditHandler();
2077+
editHandler = literal.EditHandler;
20752078
builder.AddRange(literal.LiteralTokens);
20762079
}
20772080

2078-
var rewritten = SyntaxFactory.CSharpExpressionLiteral(builder.ToList(), generator).Green.CreateRed(node.Parent, position);
2079-
2080-
if (editHandler != null)
2081-
{
2082-
rewritten = rewritten.WithEditHandler(editHandler);
2083-
}
2081+
var rewritten = SyntaxFactory.CSharpExpressionLiteral(builder.ToList(), generator, editHandler).Green.CreateRed(node.Parent, position);
20842082

20852083
Visit(rewritten);
20862084
}

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ public HtmlMarkupParser HtmlParser
314314

315315
chunkGenerator = SpanChunkGenerator.Null;
316316
SetAcceptedCharacters(AcceptedCharactersInternal.None);
317-
var transition = GetNodeWithEditHandler(SyntaxFactory.CSharpTransition(transitionToken, chunkGenerator));
317+
var transition = SyntaxFactory.CSharpTransition(transitionToken, chunkGenerator, GetEditHandler());
318318

319319
if (At(SyntaxKind.LeftBrace))
320320
{
@@ -1893,8 +1893,9 @@ RazorDirectiveSyntax BuildDirective(SyntaxKind expectedTokenKindIfMissing)
18931893
var node = OutputTokensAsStatementLiteral();
18941894
if (node == null && directiveBuilder.Count == 0)
18951895
{
1896-
node = SyntaxFactory.CSharpStatementLiteral(new SyntaxList<SyntaxToken>(SyntaxFactory.MissingToken(expectedTokenKindIfMissing)), chunkGenerator);
1896+
node = SyntaxFactory.CSharpStatementLiteral(SyntaxFactory.MissingToken(expectedTokenKindIfMissing), chunkGenerator, editHandler: null);
18971897
}
1898+
18981899
directiveBuilder.Add(node);
18991900
var directiveCodeBlock = SyntaxFactory.CSharpCodeBlock(directiveBuilder.ToList());
19001901

@@ -2709,7 +2710,7 @@ private void ParseReservedDirective(SyntaxListBuilder<RazorSyntaxNode> builder,
27092710
var directiveBody = SyntaxFactory.RazorDirectiveBody(keyword, csharpCode: null);
27102711

27112712
// transition could be null if we're already inside a code block.
2712-
transition = transition ?? SyntaxFactory.CSharpTransition(SyntaxFactory.MissingToken(SyntaxKind.Transition), chunkGenerator: null);
2713+
transition = transition ?? SyntaxFactory.CSharpTransition(SyntaxFactory.MissingToken(SyntaxKind.Transition));
27132714
var directive = SyntaxFactory.RazorDirective(transition, directiveBody);
27142715
builder.Add(directive);
27152716
}
@@ -2811,7 +2812,7 @@ private void ExplicitExpressionSpanContextConfig(SpanEditHandlerBuilder? editHan
28112812
return null;
28122813
}
28132814

2814-
return GetNodeWithEditHandler(SyntaxFactory.CSharpStatementLiteral(tokens, chunkGenerator));
2815+
return SyntaxFactory.CSharpStatementLiteral(tokens, chunkGenerator, GetEditHandler());
28152816
}
28162817

28172818
private CSharpExpressionLiteralSyntax? OutputTokensAsExpressionLiteral()
@@ -2822,7 +2823,7 @@ private void ExplicitExpressionSpanContextConfig(SpanEditHandlerBuilder? editHan
28222823
return null;
28232824
}
28242825

2825-
return GetNodeWithEditHandler(SyntaxFactory.CSharpExpressionLiteral(tokens, chunkGenerator));
2826+
return SyntaxFactory.CSharpExpressionLiteral(tokens, chunkGenerator, GetEditHandler());
28262827
}
28272828

28282829
private CSharpEphemeralTextLiteralSyntax? OutputTokensAsEphemeralLiteral()
@@ -2833,7 +2834,7 @@ private void ExplicitExpressionSpanContextConfig(SpanEditHandlerBuilder? editHan
28332834
return null;
28342835
}
28352836

2836-
return GetNodeWithEditHandler(SyntaxFactory.CSharpEphemeralTextLiteral(tokens, chunkGenerator));
2837+
return SyntaxFactory.CSharpEphemeralTextLiteral(tokens, chunkGenerator, GetEditHandler());
28372838
}
28382839

28392840
private UnclassifiedTextLiteralSyntax? OutputTokensAsUnclassifiedLiteral()
@@ -2844,7 +2845,7 @@ private void ExplicitExpressionSpanContextConfig(SpanEditHandlerBuilder? editHan
28442845
return null;
28452846
}
28462847

2847-
return GetNodeWithEditHandler(SyntaxFactory.UnclassifiedTextLiteral(tokens, chunkGenerator));
2848+
return SyntaxFactory.UnclassifiedTextLiteral(tokens, chunkGenerator, GetEditHandler());
28482849
}
28492850

28502851
private void OtherParserBlock(in SyntaxListBuilder<RazorSyntaxNode> builder)

0 commit comments

Comments
 (0)