Skip to content

Commit 1bccebd

Browse files
Fix razor whitespace removal in methods (#23699)
1 parent c5ba43f commit 1bccebd

File tree

14 files changed

+337
-24
lines changed

14 files changed

+337
-24
lines changed

src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentWhitespacePass.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,11 @@ protected override void ExecuteCore(RazorCodeDocument codeDocument, DocumentInte
4545
return;
4646
}
4747

48-
var method = documentNode.FindPrimaryMethod();
49-
if (method != null)
48+
var @class = documentNode.FindPrimaryClass();
49+
if (@class != null)
5050
{
51-
RemoveContiguousWhitespace(method.Children, TraversalDirection.Forwards);
52-
RemoveContiguousWhitespace(method.Children, TraversalDirection.Backwards);
53-
5451
var visitor = new Visitor();
55-
visitor.Visit(method);
52+
visitor.Visit(@class);
5653
}
5754
}
5855

@@ -145,6 +142,13 @@ enum TraversalDirection
145142

146143
class Visitor : IntermediateNodeWalker
147144
{
145+
public override void VisitMethodDeclaration(MethodDeclarationIntermediateNode node)
146+
{
147+
RemoveContiguousWhitespace(node.Children, TraversalDirection.Forwards);
148+
RemoveContiguousWhitespace(node.Children, TraversalDirection.Backwards);
149+
VisitDefault(node);
150+
}
151+
148152
public override void VisitMarkupElement(MarkupElementIntermediateNode node)
149153
{
150154
RemoveContiguousWhitespace(node.Children, TraversalDirection.Forwards);

src/Razor/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/ComponentCodeGenerationTestBase.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4685,6 +4685,35 @@ public void WhiteSpace_InsideAttribute_InMarkupBlock()
46854685
CompileToAssembly(generated);
46864686
}
46874687

4688+
[Fact]
4689+
public void WhiteSpace_InMarkupInFunctionsBlock()
4690+
{
4691+
// Arrange
4692+
4693+
// Act
4694+
var generated = CompileToCSharp(@"
4695+
@using Microsoft.AspNetCore.Components.Rendering
4696+
@code {
4697+
void MyMethod(RenderTreeBuilder __builder)
4698+
{
4699+
<ul>
4700+
@for (var i = 0; i < 100; i++)
4701+
{
4702+
<li>
4703+
@i
4704+
</li>
4705+
}
4706+
</ul>
4707+
}
4708+
}
4709+
");
4710+
4711+
// Assert
4712+
AssertDocumentNodeMatchesBaseline(generated.CodeDocument);
4713+
AssertCSharpDocumentMatchesBaseline(generated.CodeDocument);
4714+
CompileToAssembly(generated);
4715+
}
4716+
46884717
[Fact]
46894718
public void WhiteSpace_WithPreserveWhitespace()
46904719
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// <auto-generated/>
2+
#pragma warning disable 1591
3+
namespace Test
4+
{
5+
#line hidden
6+
using System;
7+
using System.Collections.Generic;
8+
using System.Linq;
9+
using System.Threading.Tasks;
10+
using Microsoft.AspNetCore.Components;
11+
#nullable restore
12+
#line 1 "x:\dir\subdir\Test\TestComponent.cshtml"
13+
using Microsoft.AspNetCore.Components.Rendering;
14+
15+
#line default
16+
#line hidden
17+
#nullable disable
18+
public partial class TestComponent : Microsoft.AspNetCore.Components.ComponentBase
19+
{
20+
#pragma warning disable 219
21+
private void __RazorDirectiveTokenHelpers__() {
22+
}
23+
#pragma warning restore 219
24+
#pragma warning disable 0414
25+
private static System.Object __o = null;
26+
#pragma warning restore 0414
27+
#pragma warning disable 1998
28+
protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder)
29+
{
30+
}
31+
#pragma warning restore 1998
32+
#nullable restore
33+
#line 2 "x:\dir\subdir\Test\TestComponent.cshtml"
34+
35+
void MyMethod(RenderTreeBuilder __builder)
36+
{
37+
38+
39+
#line default
40+
#line hidden
41+
#nullable disable
42+
#nullable restore
43+
#line 6 "x:\dir\subdir\Test\TestComponent.cshtml"
44+
for (var i = 0; i < 100; i++)
45+
{
46+
47+
48+
#line default
49+
#line hidden
50+
#nullable disable
51+
#nullable restore
52+
#line 9 "x:\dir\subdir\Test\TestComponent.cshtml"
53+
__o = i;
54+
55+
#line default
56+
#line hidden
57+
#nullable disable
58+
#nullable restore
59+
#line 10 "x:\dir\subdir\Test\TestComponent.cshtml"
60+
61+
}
62+
63+
#line default
64+
#line hidden
65+
#nullable disable
66+
#nullable restore
67+
#line 12 "x:\dir\subdir\Test\TestComponent.cshtml"
68+
69+
}
70+
71+
#line default
72+
#line hidden
73+
#nullable disable
74+
}
75+
}
76+
#pragma warning restore 1591
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
Document -
2+
NamespaceDeclaration - - Test
3+
UsingDirective - (3:1,1 [12] ) - System
4+
UsingDirective - (18:2,1 [32] ) - System.Collections.Generic
5+
UsingDirective - (53:3,1 [17] ) - System.Linq
6+
UsingDirective - (73:4,1 [28] ) - System.Threading.Tasks
7+
UsingDirective - (104:5,1 [37] ) - Microsoft.AspNetCore.Components
8+
UsingDirective - (1:0,1 [47] x:\dir\subdir\Test\TestComponent.cshtml) - Microsoft.AspNetCore.Components.Rendering
9+
ClassDeclaration - - public partial - TestComponent - Microsoft.AspNetCore.Components.ComponentBase -
10+
DesignTimeDirective -
11+
CSharpCode -
12+
IntermediateToken - - CSharp - #pragma warning disable 0414
13+
CSharpCode -
14+
IntermediateToken - - CSharp - private static System.Object __o = null;
15+
CSharpCode -
16+
IntermediateToken - - CSharp - #pragma warning restore 0414
17+
MethodDeclaration - - protected override - void - BuildRenderTree
18+
HtmlContent - (48:0,48 [2] x:\dir\subdir\Test\TestComponent.cshtml)
19+
LazyIntermediateToken - (48:0,48 [2] x:\dir\subdir\Test\TestComponent.cshtml) - Html - \n
20+
HtmlContent - (294:13,1 [2] x:\dir\subdir\Test\TestComponent.cshtml)
21+
LazyIntermediateToken - (294:13,1 [2] x:\dir\subdir\Test\TestComponent.cshtml) - Html - \n
22+
CSharpCode - (57:1,7 [65] x:\dir\subdir\Test\TestComponent.cshtml)
23+
LazyIntermediateToken - (57:1,7 [65] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - \n void MyMethod(RenderTreeBuilder __builder)\n {\n
24+
MarkupElement - (122:4,8 [162] x:\dir\subdir\Test\TestComponent.cshtml) - ul
25+
HtmlContent - (126:4,12 [14] x:\dir\subdir\Test\TestComponent.cshtml)
26+
LazyIntermediateToken - (126:4,12 [14] x:\dir\subdir\Test\TestComponent.cshtml) - Html - \n
27+
CSharpCode - (141:5,13 [62] x:\dir\subdir\Test\TestComponent.cshtml)
28+
LazyIntermediateToken - (141:5,13 [62] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - for (var i = 0; i < 100; i++)\n {\n
29+
MarkupElement - (203:7,16 [51] x:\dir\subdir\Test\TestComponent.cshtml) - li
30+
HtmlContent - (207:7,20 [22] x:\dir\subdir\Test\TestComponent.cshtml)
31+
LazyIntermediateToken - (207:7,20 [22] x:\dir\subdir\Test\TestComponent.cshtml) - Html - \n
32+
CSharpExpression - (230:8,21 [1] x:\dir\subdir\Test\TestComponent.cshtml)
33+
LazyIntermediateToken - (230:8,21 [1] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - i
34+
HtmlContent - (231:8,22 [18] x:\dir\subdir\Test\TestComponent.cshtml)
35+
LazyIntermediateToken - (231:8,22 [18] x:\dir\subdir\Test\TestComponent.cshtml) - Html - \n
36+
CSharpCode - (254:9,21 [15] x:\dir\subdir\Test\TestComponent.cshtml)
37+
LazyIntermediateToken - (254:9,21 [15] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - \n }
38+
HtmlContent - (269:10,13 [10] x:\dir\subdir\Test\TestComponent.cshtml)
39+
LazyIntermediateToken - (269:10,13 [10] x:\dir\subdir\Test\TestComponent.cshtml) - Html - \n
40+
CSharpCode - (284:11,13 [9] x:\dir\subdir\Test\TestComponent.cshtml)
41+
LazyIntermediateToken - (284:11,13 [9] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - \n }\n
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
Source Location: (1:0,1 [47] x:\dir\subdir\Test\TestComponent.cshtml)
2+
|using Microsoft.AspNetCore.Components.Rendering|
3+
Generated Location: (320:12,0 [47] )
4+
|using Microsoft.AspNetCore.Components.Rendering|
5+
6+
Source Location: (57:1,7 [65] x:\dir\subdir\Test\TestComponent.cshtml)
7+
|
8+
void MyMethod(RenderTreeBuilder __builder)
9+
{
10+
|
11+
Generated Location: (1078:33,7 [65] )
12+
|
13+
void MyMethod(RenderTreeBuilder __builder)
14+
{
15+
|
16+
17+
Source Location: (141:5,13 [62] x:\dir\subdir\Test\TestComponent.cshtml)
18+
|for (var i = 0; i < 100; i++)
19+
{
20+
|
21+
Generated Location: (1278:43,13 [62] )
22+
|for (var i = 0; i < 100; i++)
23+
{
24+
|
25+
26+
Source Location: (230:8,21 [1] x:\dir\subdir\Test\TestComponent.cshtml)
27+
|i|
28+
Generated Location: (1483:52,21 [1] )
29+
|i|
30+
31+
Source Location: (254:9,21 [15] x:\dir\subdir\Test\TestComponent.cshtml)
32+
|
33+
}|
34+
Generated Location: (1629:59,21 [15] )
35+
|
36+
}|
37+
38+
Source Location: (284:11,13 [9] x:\dir\subdir\Test\TestComponent.cshtml)
39+
|
40+
}
41+
|
42+
Generated Location: (1780:67,13 [9] )
43+
|
44+
}
45+
|
46+

src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_InFunctionsDirective/TestComponent.codegen.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,8 @@ void RenderChildComponent(RenderTreeBuilder __builder)
3838
#line default
3939
#line hidden
4040
#nullable disable
41-
__builder.AddContent(0, " ");
42-
__builder.OpenComponent<Test.MyComponent>(1);
41+
__builder.OpenComponent<Test.MyComponent>(0);
4342
__builder.CloseComponent();
44-
__builder.AddMarkupContent(2, "\r\n");
4543
#nullable restore
4644
#line 9 "x:\dir\subdir\Test\TestComponent.cshtml"
4745
}

src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_InFunctionsDirective/TestComponent.ir.txt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@ Document -
1212
LazyIntermediateToken - (55:2,2 [34] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - RenderChildComponent(__builder);
1313
CSharpCode - (101:4,7 [69] x:\dir\subdir\Test\TestComponent.cshtml)
1414
LazyIntermediateToken - (101:4,7 [69] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - \n void RenderChildComponent(RenderTreeBuilder __builder)\n {\n
15-
HtmlContent - (170:7,0 [8] x:\dir\subdir\Test\TestComponent.cshtml)
16-
LazyIntermediateToken - (170:7,0 [8] x:\dir\subdir\Test\TestComponent.cshtml) - Html -
1715
Component - (178:7,8 [15] x:\dir\subdir\Test\TestComponent.cshtml) - MyComponent
18-
HtmlContent - (193:7,23 [2] x:\dir\subdir\Test\TestComponent.cshtml)
19-
LazyIntermediateToken - (193:7,23 [2] x:\dir\subdir\Test\TestComponent.cshtml) - Html - \n
2016
CSharpCode - (195:8,0 [7] x:\dir\subdir\Test\TestComponent.cshtml)
2117
LazyIntermediateToken - (195:8,0 [7] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - }\n

src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/ChildComponent_InFunctionsDirective/TestComponent.mappings.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Generated Location: (968:33,7 [69] )
1717
Source Location: (195:8,0 [7] x:\dir\subdir\Test\TestComponent.cshtml)
1818
| }
1919
|
20-
Generated Location: (1343:46,0 [7] )
20+
Generated Location: (1249:44,0 [7] )
2121
| }
2222
|
2323

src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/SingleLineControlFlowStatements_InCodeDirective/TestComponent.codegen.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,9 @@ void RenderChildComponent(RenderTreeBuilder __builder)
3434
#line default
3535
#line hidden
3636
#nullable disable
37-
__builder.AddContent(0, " ");
38-
__builder.OpenElement(1, "p");
39-
__builder.AddContent(2, "Output: ");
40-
__builder.AddContent(3,
37+
__builder.OpenElement(0, "p");
38+
__builder.AddContent(1, "Output: ");
39+
__builder.AddContent(2,
4140
#nullable restore
4241
#line 9 "x:\dir\subdir\Test\TestComponent.cshtml"
4342
output
@@ -47,7 +46,6 @@ void RenderChildComponent(RenderTreeBuilder __builder)
4746
#nullable disable
4847
);
4948
__builder.CloseElement();
50-
__builder.AddMarkupContent(4, "\r\n");
5149
#nullable restore
5250
#line 10 "x:\dir\subdir\Test\TestComponent.cshtml"
5351
}

src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/SingleLineControlFlowStatements_InCodeDirective/TestComponent.ir.txt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,10 @@ Document -
1010
MethodDeclaration - - protected override - void - BuildRenderTree
1111
CSharpCode - (60:2,7 [213] x:\dir\subdir\Test\TestComponent.cshtml)
1212
LazyIntermediateToken - (60:2,7 [213] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - \n void RenderChildComponent(RenderTreeBuilder __builder)\n {\n var output = string.Empty;\n if (__builder == null) output = "Builder is null!";\n else output = "Builder is not null!";\n
13-
HtmlContent - (273:8,0 [8] x:\dir\subdir\Test\TestComponent.cshtml)
14-
LazyIntermediateToken - (273:8,0 [8] x:\dir\subdir\Test\TestComponent.cshtml) - Html -
1513
MarkupElement - (281:8,8 [22] x:\dir\subdir\Test\TestComponent.cshtml) - p
1614
HtmlContent - (284:8,11 [8] x:\dir\subdir\Test\TestComponent.cshtml)
1715
LazyIntermediateToken - (284:8,11 [8] x:\dir\subdir\Test\TestComponent.cshtml) - Html - Output:
1816
CSharpExpression - (293:8,20 [6] x:\dir\subdir\Test\TestComponent.cshtml)
1917
LazyIntermediateToken - (293:8,20 [6] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - output
20-
HtmlContent - (303:8,30 [2] x:\dir\subdir\Test\TestComponent.cshtml)
21-
LazyIntermediateToken - (303:8,30 [2] x:\dir\subdir\Test\TestComponent.cshtml) - Html - \n
2218
CSharpCode - (305:9,0 [7] x:\dir\subdir\Test\TestComponent.cshtml)
2319
LazyIntermediateToken - (305:9,0 [7] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - }\n

src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/SingleLineControlFlowStatements_InCodeDirective/TestComponent.mappings.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Generated Location: (810:26,7 [213] )
1818
Source Location: (305:9,0 [7] x:\dir\subdir\Test\TestComponent.cshtml)
1919
| }
2020
|
21-
Generated Location: (1553:52,0 [7] )
21+
Generated Location: (1459:50,0 [7] )
2222
| }
2323
|
2424

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// <auto-generated/>
2+
#pragma warning disable 1591
3+
namespace Test
4+
{
5+
#line hidden
6+
using System;
7+
using System.Collections.Generic;
8+
using System.Linq;
9+
using System.Threading.Tasks;
10+
using Microsoft.AspNetCore.Components;
11+
#nullable restore
12+
#line 1 "x:\dir\subdir\Test\TestComponent.cshtml"
13+
using Microsoft.AspNetCore.Components.Rendering;
14+
15+
#line default
16+
#line hidden
17+
#nullable disable
18+
public partial class TestComponent : Microsoft.AspNetCore.Components.ComponentBase
19+
{
20+
#pragma warning disable 1998
21+
protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder)
22+
{
23+
}
24+
#pragma warning restore 1998
25+
#nullable restore
26+
#line 2 "x:\dir\subdir\Test\TestComponent.cshtml"
27+
28+
void MyMethod(RenderTreeBuilder __builder)
29+
{
30+
31+
#line default
32+
#line hidden
33+
#nullable disable
34+
__builder.OpenElement(0, "ul");
35+
#nullable restore
36+
#line 6 "x:\dir\subdir\Test\TestComponent.cshtml"
37+
for (var i = 0; i < 100; i++)
38+
{
39+
40+
#line default
41+
#line hidden
42+
#nullable disable
43+
__builder.OpenElement(1, "li");
44+
__builder.AddContent(2,
45+
#nullable restore
46+
#line 9 "x:\dir\subdir\Test\TestComponent.cshtml"
47+
i
48+
49+
#line default
50+
#line hidden
51+
#nullable disable
52+
);
53+
__builder.CloseElement();
54+
#nullable restore
55+
#line 11 "x:\dir\subdir\Test\TestComponent.cshtml"
56+
}
57+
58+
#line default
59+
#line hidden
60+
#nullable disable
61+
__builder.CloseElement();
62+
#nullable restore
63+
#line 13 "x:\dir\subdir\Test\TestComponent.cshtml"
64+
}
65+
66+
#line default
67+
#line hidden
68+
#nullable disable
69+
}
70+
}
71+
#pragma warning restore 1591

0 commit comments

Comments
 (0)