Skip to content

Commit 54c21d0

Browse files
Compiler: Rationalize nodes, tokens, visitors, walkers, and rewriters, oh my! (#11853)
Razor's syntax model doesn't provide as much separation between syntax nodes and tokens as Roslyn's. This is due in part to the fact that Roslyn's model is designed to support two languages, not just one. When Razor's syntax model was adapted from Roslyn's, some mistakes were made when modifying it fit a single language. Currently, the base hierarchy of Razor's syntax model like so: ```mermaid --- config: class: hideEmptyMembersBox: true --- classDiagram SyntaxNode <|-- SyntaxList SyntaxNode <|-- RazorSyntaxNode RazorSyntaxNode <|-- SyntaxToken RazorSyntaxNode <|-- RazorBlockSyntax RazorSyntaxNode <|-- `...Add Other RazorSyntaxNodes` ``` A glaring mistake in the class hierarchy above is that `SyntaxToken` inherits from `RazorSyntaxNode`, which is reserved for Razor non-terminal syntax nodes. This PR changes `SyntaxToken` to inherit from `SyntaxNode` and moves several methods intended for non-terminals to `RazorSyntaxNode. This creates a much more sensible hierarchy: ```mermaid --- config: class: hideEmptyMembersBox: true --- classDiagram SyntaxNode <|-- SyntaxList SyntaxNode <|-- SyntaxToken SyntaxNode <|-- RazorSyntaxNode RazorSyntaxNode <|-- RazorBlockSyntax RazorSyntaxNode <|-- `...And Other RazorSyntaxNodes` ``` This PR adds much cleaner separation between `SyntaxNode`, `SyntaxList` and `SyntaxToken`, and updates the `SyntaxVisitor`, `SyntaxWalker`, and `SyntaxRewriter` APIs to better match Roslyn's. This removes a lot of baggage from `SyntaxToken`, making it easier to convert to a struct in the near future. ---- CI Build: https://dev.azure.com/dnceng/internal/_build/results?buildId=2706052&view=results Test Insertion: https://dev.azure.com/devdiv/DevDiv/_git/VS/pullrequest/635607 Toolset Test Run: https://dev.azure.com/dnceng/internal/_build/results?buildId=2706053&view=results
2 parents c82e88e + a7569f2 commit 54c21d0

File tree

28 files changed

+836
-829
lines changed

28 files changed

+836
-829
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public void ParseMethodCallsParseDocumentOnMarkupParserAndReturnsResults()
3737
var syntaxTree = parser.Parse(TestRazorSourceDocument.Create("foo @bar baz"));
3838

3939
// Assert
40-
var actual = SyntaxNodeSerializer.Serialize(syntaxTree.Root, validateSpanEditHandlers: true);
40+
var actual = TestSyntaxSerializer.Serialize(syntaxTree.Root, allowSpanEditHandlers: true);
4141
AssertEx.AssertEqualToleratingWhitespaceDifferences(expected, actual);
4242
}
4343
}

src/Compiler/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/FindTokenIntegrationTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ public void EmptyDirective()
2020

2121
var root = codeDocument.GetSyntaxTree().Root;
2222
var token = root.FindToken(27);
23-
AssertEx.Equal("Identifier;[<Missing>];", SyntaxSerializer.Serialize(token).Trim());
23+
AssertEx.Equal("Identifier;[<Missing>];", TestSyntaxSerializer.Serialize(token).Trim());
2424
}
2525
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#nullable disable
55

6+
using Microsoft.AspNetCore.Razor.Language;
67
using Xunit;
78

89
namespace Microsoft.AspNetCore.Razor.Language.Legacy;
@@ -48,7 +49,7 @@ public void ParseMethodCallsParseDocumentOnMarkupParserAndReturnsResults()
4849
var syntaxTree = parser.Parse(TestRazorSourceDocument.Create("foo @bar baz"));
4950

5051
// Assert
51-
var actual = SyntaxNodeSerializer.Serialize(syntaxTree.Root, validateSpanEditHandlers: false);
52+
var actual = TestSyntaxSerializer.Serialize(syntaxTree.Root, allowSpanEditHandlers: false);
5253
Assert.Equal(expected, actual);
5354
}
5455
}

0 commit comments

Comments
 (0)