Skip to content

Commit 2d14fbb

Browse files
authored
Use shared instances of NodeWriter classes (#12362)
Several of the NodeWriter classes don't have state and can have a shared instance used among callers. These allocations aren't huge in the profiles, but the RazorEditingTests.ScrollingAndTypingInCohosting speedometer test shows about 3 MB of allocating these in the CodeAnalysis process.
1 parent 5c66ce6 commit 2d14fbb

File tree

13 files changed

+98
-105
lines changed

13 files changed

+98
-105
lines changed

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

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ protected override void ConfigureCodeDocumentProcessor(RazorCodeDocumentProcesso
2121
public void WriteUsingDirective_NoSource_WritesContent()
2222
{
2323
// Arrange
24-
var writer = new DesignTimeNodeWriter();
24+
var writer = DesignTimeNodeWriter.Instance;
2525
using var context = TestCodeRenderingContext.CreateDesignTime();
2626

2727
var node = new UsingDirectiveIntermediateNode()
@@ -45,7 +45,7 @@ public void WriteUsingDirective_NoSource_WritesContent()
4545
public void WriteUsingDirective_WithSource_WritesContentWithLinePragmaAndMapping()
4646
{
4747
// Arrange
48-
var writer = new DesignTimeNodeWriter();
48+
var writer = DesignTimeNodeWriter.Instance;
4949
using var context = TestCodeRenderingContext.CreateDesignTime();
5050

5151
var originalSpan = new SourceSpan("test.cshtml", 0, 0, 0, 6);
@@ -81,7 +81,7 @@ public void WriteUsingDirective_WithSource_WritesContentWithLinePragmaAndMapping
8181
public void WriteUsingDirective_WithSourceAndLineDirectives_WritesContentWithLinePragmaAndMapping()
8282
{
8383
// Arrange
84-
var writer = new DesignTimeNodeWriter();
84+
var writer = DesignTimeNodeWriter.Instance;
8585
using var context = TestCodeRenderingContext.CreateDesignTime();
8686

8787
var originalSpan = new SourceSpan("test.cshtml", 0, 0, 0, 6);
@@ -120,7 +120,7 @@ public void WriteUsingDirective_WithSourceAndLineDirectives_WritesContentWithLin
120120
public void WriteCSharpExpression_SkipsLinePragma_WithoutSource()
121121
{
122122
// Arrange
123-
var writer = new DesignTimeNodeWriter();
123+
var writer = DesignTimeNodeWriter.Instance;
124124
using var context = TestCodeRenderingContext.CreateDesignTime();
125125

126126
var node = new CSharpExpressionIntermediateNode();
@@ -143,7 +143,7 @@ public void WriteCSharpExpression_SkipsLinePragma_WithoutSource()
143143
public void WriteCSharpExpression_WritesLinePragma_WithSource()
144144
{
145145
// Arrange
146-
var writer = new DesignTimeNodeWriter();
146+
var writer = DesignTimeNodeWriter.Instance;
147147
using var context = TestCodeRenderingContext.CreateDesignTime();
148148

149149
var node = new CSharpExpressionIntermediateNode()
@@ -178,7 +178,7 @@ public void WriteCSharpExpression_WritesLinePragma_WithSource()
178178
public void WriteCSharpExpression_WithExtensionNode_WritesPadding()
179179
{
180180
// Arrange
181-
var writer = new DesignTimeNodeWriter();
181+
var writer = DesignTimeNodeWriter.Instance;
182182
using var context = TestCodeRenderingContext.CreateDesignTime();
183183

184184
var node = new CSharpExpressionIntermediateNode();
@@ -207,7 +207,7 @@ public void WriteCSharpExpression_WithExtensionNode_WritesPadding()
207207
public void WriteCSharpExpression_WithSource_WritesPadding()
208208
{
209209
// Arrange
210-
var writer = new DesignTimeNodeWriter();
210+
var writer = DesignTimeNodeWriter.Instance;
211211
using var context = TestCodeRenderingContext.CreateDesignTime();
212212

213213
var node = new CSharpExpressionIntermediateNode()
@@ -246,7 +246,7 @@ public void WriteCSharpExpression_WithSource_WritesPadding()
246246
public void WriteCSharpCode_WhitespaceContentWithSource_WritesContent()
247247
{
248248
// Arrange
249-
var writer = new DesignTimeNodeWriter();
249+
var writer = DesignTimeNodeWriter.Instance;
250250
using var context = TestCodeRenderingContext.CreateDesignTime();
251251

252252
var node = new CSharpCodeIntermediateNode()
@@ -280,7 +280,7 @@ public void WriteCSharpCode_WhitespaceContentWithSource_WritesContent()
280280
public void WriteCSharpCode_SkipsLinePragma_WithoutSource()
281281
{
282282
// Arrange
283-
var writer = new DesignTimeNodeWriter();
283+
var writer = DesignTimeNodeWriter.Instance;
284284
using var context = TestCodeRenderingContext.CreateDesignTime();
285285

286286
var node = new CSharpCodeIntermediateNode();
@@ -303,7 +303,7 @@ public void WriteCSharpCode_SkipsLinePragma_WithoutSource()
303303
public void WriteCSharpCode_WritesLinePragma_WithSource()
304304
{
305305
// Arrange
306-
var writer = new DesignTimeNodeWriter();
306+
var writer = DesignTimeNodeWriter.Instance;
307307
using var context = TestCodeRenderingContext.CreateDesignTime();
308308

309309
var node = new CSharpCodeIntermediateNode()
@@ -337,7 +337,7 @@ public void WriteCSharpCode_WritesLinePragma_WithSource()
337337
public void WriteCSharpCode_WritesPadding_WithSource()
338338
{
339339
// Arrange
340-
var writer = new DesignTimeNodeWriter();
340+
var writer = DesignTimeNodeWriter.Instance;
341341
using var context = TestCodeRenderingContext.CreateDesignTime();
342342

343343
var node = new CSharpCodeIntermediateNode()
@@ -370,14 +370,14 @@ public void WriteCSharpCode_WritesPadding_WithSource()
370370
[Fact]
371371
public void WriteCSharpExpressionAttributeValue_RendersCorrectly()
372372
{
373-
var writer = new DesignTimeNodeWriter();
373+
var writer = DesignTimeNodeWriter.Instance;
374374

375375
var content = "<input checked=\"hello-world @false\" />";
376376
var source = TestRazorSourceDocument.Create(content);
377377
var codeDocument = ProjectEngine.CreateCodeDocument(source);
378378
var processor = CreateCodeDocumentProcessor(codeDocument);
379379
var documentNode = processor.GetDocumentNode();
380-
var node = documentNode.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode;
380+
var node = (CSharpExpressionAttributeValueIntermediateNode)documentNode.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1];
381381

382382
using var context = TestCodeRenderingContext.CreateDesignTime(source: source);
383383

@@ -403,13 +403,13 @@ public void WriteCSharpExpressionAttributeValue_RendersCorrectly()
403403
[Fact]
404404
public void WriteCSharpCodeAttributeValue_RendersCorrectly()
405405
{
406-
var writer = new DesignTimeNodeWriter();
406+
var writer = DesignTimeNodeWriter.Instance;
407407
var content = "<input checked=\"hello-world @if(@true){ }\" />";
408408
var sourceDocument = TestRazorSourceDocument.Create(content);
409409
var codeDocument = ProjectEngine.CreateCodeDocument(sourceDocument);
410410
var processor = CreateCodeDocumentProcessor(codeDocument);
411411
var documentNode = processor.GetDocumentNode();
412-
var node = documentNode.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode;
412+
var node = (CSharpCodeAttributeValueIntermediateNode)documentNode.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1];
413413

414414
using var context = TestCodeRenderingContext.CreateDesignTime(source: sourceDocument);
415415

@@ -435,13 +435,13 @@ public void WriteCSharpCodeAttributeValue_RendersCorrectly()
435435
[Fact]
436436
public void WriteCSharpCodeAttributeValue_WithExpression_RendersCorrectly()
437437
{
438-
var writer = new DesignTimeNodeWriter();
438+
var writer = DesignTimeNodeWriter.Instance;
439439
var content = "<input checked=\"hello-world @if(@true){ @false }\" />";
440440
var source = TestRazorSourceDocument.Create(content);
441441
var codeDocument = ProjectEngine.CreateCodeDocument(source);
442442
var processor = CreateCodeDocumentProcessor(codeDocument);
443443
var documentNode = processor.GetDocumentNode();
444-
var node = documentNode.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode;
444+
var node = (CSharpCodeAttributeValueIntermediateNode)documentNode.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1];
445445

446446
using var context = TestCodeRenderingContext.CreateDesignTime(source: source);
447447

@@ -484,7 +484,7 @@ Render Children
484484
[InlineData(@"\\SERVER/pages\test.cshtml", @"\\SERVER\pages\test.cshtml")]
485485
public void LinePragma_Is_Adjusted_On_Windows(string fileName, string expectedFileName)
486486
{
487-
var writer = new DesignTimeNodeWriter();
487+
var writer = DesignTimeNodeWriter.Instance;
488488
using var context = TestCodeRenderingContext.CreateDesignTime();
489489

490490
Assert.True(context.Options.RemapLinePragmaPathsOnWindows);
@@ -528,7 +528,7 @@ public void LinePragma_Is_Adjusted_On_Windows(string fileName, string expectedFi
528528
[InlineData(@"\\SERVER/pages\test.cshtml", @"\\SERVER\pages\test.cshtml")]
529529
public void LinePragma_Enhanced_Is_Adjusted_On_Windows(string fileName, string expectedFileName)
530530
{
531-
var writer = new RuntimeNodeWriter();
531+
var writer = RuntimeNodeWriter.Instance;
532532
using var context = TestCodeRenderingContext.CreateDesignTime(source: RazorSourceDocument.Create("", fileName));
533533

534534
Assert.True(context.Options.RemapLinePragmaPathsOnWindows);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class LiteralRuntimeNodeWriterTest
1212
public void WriteCSharpExpression_UsesWriteLiteral_WritesLinePragma_WithSource()
1313
{
1414
// Arrange
15-
var writer = new LiteralRuntimeNodeWriter();
15+
var writer = LiteralRuntimeNodeWriter.Instance;
1616
using var context = TestCodeRenderingContext.CreateRuntime();
1717

1818
var node = new CSharpExpressionIntermediateNode();
@@ -43,7 +43,7 @@ public void WriteCSharpExpression_UsesWriteLiteral_WritesLinePragma_WithSource()
4343
public void WriteCSharpExpression_WithMultipleChildren()
4444
{
4545
// Arrange
46-
var writer = new LiteralRuntimeNodeWriter();
46+
var writer = LiteralRuntimeNodeWriter.Instance;
4747
using var context = TestCodeRenderingContext.CreateRuntime();
4848

4949
var node = new CSharpExpressionIntermediateNode();

0 commit comments

Comments
 (0)