Skip to content

Commit 0e13d49

Browse files
SourceTexts for Everyone! (#11404)
Fixes #8076 This is a change I've been planning for quite a while, and I'm hoping it will have a positive impact on performance. Essentially, this does away with that `CodeWriter.GeneratedCode`, `RazorCSharpDocument.GeneratedCode`, and `RazorHtmlDocument.GeneratedCode` returns a giant string. Instead, each provides a way to get at a canonical `SourceText`. The `SourceText` returned by `CodeWriter.GetText()` is produced efficiently by passing a custom `TextReader` into `SourceText.From(...)`, and the new `RazorCSharpDocument.Text` and `RazorHtmlDocument.Text` properties just return the `SourceText` that `CodeWriter` produced. In generally, I'm hoping this will reduce LOH allocations for large Razor files. However, while moving code that had previously accessed `GeneratedCode` to now use the `SourceText`, I found a few places to make additional performance wins: 1. Any code that was comparing generated code can now do so efficiently using `SourceText.ContentEquals(...)` 2. A number of places in tooling code were grabbing the `GeneratedCode` property and passing it to `CSharpSyntaxTree.ParseText(...)`. These have all been updated and many of them were updated to just call tooling's `RazorCodeDocument.GetOrParseCSharpSyntaxTree(...)`, which caches the C# `SytntaxTree`. I focused on making the commit history high quality, so I recommend reviewing commit-by-commit if that makes sense for you. CI Build: https://dev.azure.com/dnceng/internal/_build/results?buildId=2623654&view=results Test insertion: https://dev.azure.com/devdiv/DevDiv/_git/VS/pullrequest/604233
2 parents ba63de7 + 0eeb663 commit 0e13d49

File tree

64 files changed

+632
-388
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+632
-388
lines changed

src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/InjectTargetExtensionTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public void InjectDirectiveTargetExtension_WritesProperty()
3535
public PropertyType PropertyName { get; private set; }
3636
3737
""",
38-
context.CodeWriter.GenerateCode());
38+
context.CodeWriter.GetText().ToString());
3939
}
4040

4141
[Fact]
@@ -88,6 +88,6 @@ public void InjectDirectiveTargetExtension_WritesPropertyWithLinePragma_WhenSour
8888
= default!;
8989
9090
""",
91-
context.CodeWriter.GenerateCode());
91+
context.CodeWriter.GetText().ToString());
9292
}
9393
}

src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/LegacySectionTargetExtensionTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ Render Children
4141
);
4242
";
4343

44-
var output = context.CodeWriter.GenerateCode();
44+
var output = context.CodeWriter.GetText().ToString();
4545
Assert.Equal(expected, output, ignoreLineEndingDifferences: true);
4646
}
4747
}

src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/ViewComponentTagHelperTargetExtensionTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public void WriteViewComponentTagHelper_GeneratesViewComponentTagHelper()
4040
extension.WriteViewComponentTagHelper(context, node);
4141

4242
// Assert
43-
var csharp = context.CodeWriter.GenerateCode();
43+
var csharp = context.CodeWriter.GetText().ToString();
4444
Assert.Equal(
4545
@"[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElementAttribute(""tagcloud"")]
4646
public class __Generated__TagCloudViewComponentTagHelper : Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
@@ -95,7 +95,7 @@ public void WriteViewComponentTagHelper_GeneratesViewComponentTagHelper_WithInde
9595
extension.WriteViewComponentTagHelper(context, node);
9696

9797
// Assert
98-
var csharp = context.CodeWriter.GenerateCode();
98+
var csharp = context.CodeWriter.GetText().ToString();
9999
Assert.Equal(
100100
@"[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElementAttribute(""tagcloud"")]
101101
public class __Generated__TagCloudViewComponentTagHelper : Microsoft.AspNetCore.Razor.TagHelpers.TagHelper

src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/InjectTargetExtensionTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public void InjectDirectiveTargetExtension_WritesProperty()
3333
public PropertyType PropertyName { get; private set; }
3434
3535
""",
36-
context.CodeWriter.GenerateCode());
36+
context.CodeWriter.GetText().ToString());
3737
}
3838

3939
[Fact]
@@ -86,6 +86,6 @@ public void InjectDirectiveTargetExtension_WritesPropertyWithLinePragma_WhenSour
8686
= default!;
8787
8888
""",
89-
context.CodeWriter.GenerateCode());
89+
context.CodeWriter.GetText().ToString());
9090
}
9191
}

src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/ViewComponentTagHelperTargetExtensionTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public void WriteViewComponentTagHelper_GeneratesViewComponentTagHelper()
4040
extension.WriteViewComponentTagHelper(context, node);
4141

4242
// Assert
43-
var csharp = context.CodeWriter.GenerateCode();
43+
var csharp = context.CodeWriter.GetText().ToString();
4444
Assert.Equal(
4545
@"[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElementAttribute(""tagcloud"")]
4646
public class __Generated__TagCloudViewComponentTagHelper : Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
@@ -95,7 +95,7 @@ public void WriteViewComponentTagHelper_GeneratesViewComponentTagHelper_WithInde
9595
extension.WriteViewComponentTagHelper(context, node);
9696

9797
// Assert
98-
var csharp = context.CodeWriter.GenerateCode();
98+
var csharp = context.CodeWriter.GetText().ToString();
9999
Assert.Equal(
100100
@"[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElementAttribute(""tagcloud"")]
101101
public class __Generated__TagCloudViewComponentTagHelper : Microsoft.AspNetCore.Razor.TagHelpers.TagHelper

src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions/test/InjectTargetExtensionTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public void InjectDirectiveTargetExtension_WritesProperty()
3737
#nullable disable
3838
3939
""",
40-
context.CodeWriter.GenerateCode());
40+
context.CodeWriter.GetText().ToString());
4141
}
4242

4343
[Fact]
@@ -90,6 +90,6 @@ public void InjectDirectiveTargetExtension_WritesPropertyWithLinePragma_WhenSour
9090
= default!;
9191
9292
""",
93-
context.CodeWriter.GenerateCode());
93+
context.CodeWriter.GetText().ToString());
9494
}
9595
}

src/Compiler/Microsoft.AspNetCore.Mvc.Razor.Extensions/test/ViewComponentTagHelperTargetExtensionTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public void WriteViewComponentTagHelper_GeneratesViewComponentTagHelper()
4040
extension.WriteViewComponentTagHelper(context, node);
4141

4242
// Assert
43-
var csharp = context.CodeWriter.GenerateCode();
43+
var csharp = context.CodeWriter.GetText().ToString();
4444
Assert.Equal(
4545
@"[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElementAttribute(""tagcloud"")]
4646
public class __Generated__TagCloudViewComponentTagHelper : Microsoft.AspNetCore.Razor.TagHelpers.TagHelper
@@ -104,7 +104,7 @@ public void WriteViewComponentTagHelper_GeneratesViewComponentTagHelper_WithInde
104104
extension.WriteViewComponentTagHelper(context, node);
105105

106106
// Assert
107-
var csharp = context.CodeWriter.GenerateCode();
107+
var csharp = context.CodeWriter.GetText().ToString();
108108
Assert.Equal(
109109
@"[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElementAttribute(""tagcloud"")]
110110
public class __Generated__TagCloudViewComponentTagHelper : Microsoft.AspNetCore.Razor.TagHelpers.TagHelper

src/Compiler/Microsoft.AspNetCore.Razor.Language/test/CodeGeneration/CSharpCodeWriterTest.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ public void WriteLineNumberDirective_UsesFilePath_FromSourceLocation()
292292

293293
// Act
294294
writer.WriteLineNumberDirective(mappingLocation);
295-
var code = writer.GenerateCode();
295+
var code = writer.GetText().ToString();
296296

297297
// Assert
298298
Assert.Equal(expected, code);
@@ -308,7 +308,7 @@ public void WriteField_WritesFieldDeclaration()
308308
writer.WriteField(Array.Empty<string>(), new[] { "private" }, "global::System.String", "_myString");
309309

310310
// Assert
311-
var output = writer.GenerateCode();
311+
var output = writer.GetText().ToString();
312312
Assert.Equal("""
313313
private global::System.String _myString;
314314
@@ -325,7 +325,7 @@ public void WriteField_WithModifiers_WritesFieldDeclaration()
325325
writer.WriteField(Array.Empty<string>(), new[] { "private", "readonly", "static" }, "global::System.String", "_myString");
326326

327327
// Assert
328-
var output = writer.GenerateCode();
328+
var output = writer.GetText().ToString();
329329
Assert.Equal("""
330330
private readonly static global::System.String _myString;
331331
@@ -346,7 +346,7 @@ public void WriteField_WithModifiersAndSupressions_WritesFieldDeclaration()
346346
"_myString");
347347

348348
// Assert
349-
var output = writer.GenerateCode();
349+
var output = writer.GetText().ToString();
350350
Assert.Equal("""
351351
#pragma warning disable 0001
352352
#pragma warning disable 0002
@@ -368,7 +368,7 @@ public void WriteAutoPropertyDeclaration_WritesPropertyDeclaration()
368368
writer.WriteAutoPropertyDeclaration(new[] { "public" }, "global::System.String", "MyString");
369369

370370
// Assert
371-
var output = writer.GenerateCode();
371+
var output = writer.GetText().ToString();
372372
Assert.Equal("""
373373
public global::System.String MyString { get; set; }
374374
@@ -385,7 +385,7 @@ public void WriteAutoPropertyDeclaration_WithModifiers_WritesPropertyDeclaration
385385
writer.WriteAutoPropertyDeclaration(new[] { "public", "static" }, "global::System.String", "MyString");
386386

387387
// Assert
388-
var output = writer.GenerateCode();
388+
var output = writer.GetText().ToString();
389389
Assert.Equal("""
390390
public static global::System.String MyString { get; set; }
391391
@@ -409,7 +409,7 @@ public void CSharpCodeWriter_RespectTabSetting()
409409
writer.WriteField(Array.Empty<string>(), Array.Empty<string>(), "int", "f");
410410

411411
// Assert
412-
var output = writer.GenerateCode();
412+
var output = writer.GetText().ToString();
413413
Assert.Equal("""
414414
class C
415415
{
@@ -435,7 +435,7 @@ public void CSharpCodeWriter_RespectSpaceSetting()
435435
writer.WriteField(Array.Empty<string>(), Array.Empty<string>(), "int", "f");
436436

437437
// Assert
438-
var output = writer.GenerateCode();
438+
var output = writer.GetText().ToString();
439439
Assert.Equal("""
440440
class C
441441
{

src/Compiler/Microsoft.AspNetCore.Razor.Language/test/CodeGeneration/DefaultDocumentWriterTest.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public void WriteDocument_EndToEnd_WritesChecksumAndMarksAutoGenerated()
2929
var result = writer.WriteDocument(codeDocument, document);
3030

3131
// Assert
32-
var csharp = result.GeneratedCode;
32+
var csharp = result.Text.ToString();
3333
AssertEx.AssertEqualToleratingWhitespaceDifferences(
3434
"""
3535
#pragma checksum "test.cshtml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "f1945cd6c19e56b3c1c78943ef5ec18116907a4ca1efc40a57d48ab1db7adfc5"
@@ -60,7 +60,7 @@ public void WriteDocument_SHA1_WritesChecksumAndMarksAutoGenerated()
6060
var result = writer.WriteDocument(codeDocument, document);
6161

6262
// Assert
63-
var csharp = result.GeneratedCode;
63+
var csharp = result.Text.ToString();
6464
AssertEx.AssertEqualToleratingWhitespaceDifferences(
6565
"""
6666
#pragma checksum "test.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "da39a3ee5e6b4b0d3255bfef95601890afd80709"
@@ -91,7 +91,7 @@ public void WriteDocument_SHA256_WritesChecksumAndMarksAutoGenerated()
9191
var result = writer.WriteDocument(codeDocument, document);
9292

9393
// Assert
94-
var csharp = result.GeneratedCode;
94+
var csharp = result.Text.ToString();
9595
AssertEx.AssertEqualToleratingWhitespaceDifferences(
9696
"""
9797
#pragma checksum "test.cshtml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
@@ -123,7 +123,7 @@ public void WriteDocument_Empty_SuppressChecksumTrue_DoesnotWriteChecksum()
123123
var result = writer.WriteDocument(codeDocument, document);
124124

125125
// Assert
126-
var csharp = result.GeneratedCode;
126+
var csharp = result.Text.ToString();
127127
AssertEx.AssertEqualToleratingWhitespaceDifferences(
128128
@"// <auto-generated/>
129129
#pragma warning disable 1591
@@ -153,7 +153,7 @@ public void WriteDocument_WritesNamespace()
153153
var result = writer.WriteDocument(codeDocument, document);
154154

155155
// Assert
156-
var csharp = result.GeneratedCode;
156+
var csharp = result.Text.ToString();
157157
AssertEx.AssertEqualToleratingWhitespaceDifferences(
158158
"""
159159
#pragma checksum "test.cshtml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "f1945cd6c19e56b3c1c78943ef5ec18116907a4ca1efc40a57d48ab1db7adfc5"
@@ -201,7 +201,7 @@ public void WriteDocument_WritesClass()
201201
var result = writer.WriteDocument(codeDocument, document);
202202

203203
// Assert
204-
var csharp = result.GeneratedCode;
204+
var csharp = result.Text.ToString();
205205
AssertEx.AssertEqualToleratingWhitespaceDifferences(
206206
"""
207207
#pragma checksum "test.cshtml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "f1945cd6c19e56b3c1c78943ef5ec18116907a4ca1efc40a57d48ab1db7adfc5"
@@ -252,7 +252,7 @@ public void WriteDocument_WithNullableContext_WritesClass()
252252
var result = writer.WriteDocument(codeDocument, document);
253253

254254
// Assert
255-
var csharp = result.GeneratedCode;
255+
var csharp = result.Text.ToString();
256256
AssertEx.AssertEqualToleratingWhitespaceDifferences(
257257
"""
258258
#pragma checksum "test.cshtml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "f1945cd6c19e56b3c1c78943ef5ec18116907a4ca1efc40a57d48ab1db7adfc5"
@@ -301,7 +301,7 @@ public void WriteDocument_WritesClass_ConstrainedGenericTypeParameters()
301301
var result = writer.WriteDocument(codeDocument, document);
302302

303303
// Assert
304-
var csharp = result.GeneratedCode;
304+
var csharp = result.Text.ToString();
305305
AssertEx.AssertEqualToleratingWhitespaceDifferences(
306306
"""
307307
#pragma checksum "test.cshtml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "f1945cd6c19e56b3c1c78943ef5ec18116907a4ca1efc40a57d48ab1db7adfc5"
@@ -364,7 +364,7 @@ public void WriteDocument_WritesMethod()
364364
var result = writer.WriteDocument(codeDocument, document);
365365

366366
// Assert
367-
var csharp = result.GeneratedCode;
367+
var csharp = result.Text.ToString();
368368
AssertEx.AssertEqualToleratingWhitespaceDifferences(
369369
"""
370370
#pragma checksum "test.cshtml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "f1945cd6c19e56b3c1c78943ef5ec18116907a4ca1efc40a57d48ab1db7adfc5"
@@ -408,7 +408,7 @@ public void WriteDocument_WritesField()
408408
var result = writer.WriteDocument(codeDocument, document);
409409

410410
// Assert
411-
var csharp = result.GeneratedCode;
411+
var csharp = result.Text.ToString();
412412
AssertEx.AssertEqualToleratingWhitespaceDifferences(
413413
"""
414414
#pragma checksum "test.cshtml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "f1945cd6c19e56b3c1c78943ef5ec18116907a4ca1efc40a57d48ab1db7adfc5"
@@ -448,7 +448,7 @@ public void WriteDocument_WritesProperty()
448448
var result = writer.WriteDocument(codeDocument, document);
449449

450450
// Assert
451-
var csharp = result.GeneratedCode;
451+
var csharp = result.Text.ToString();
452452
AssertEx.AssertEqualToleratingWhitespaceDifferences(
453453
"""
454454
#pragma checksum "test.cshtml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "f1945cd6c19e56b3c1c78943ef5ec18116907a4ca1efc40a57d48ab1db7adfc5"

0 commit comments

Comments
 (0)