Skip to content

Commit 94fc3bd

Browse files
authored
Allow render mode attribute to be null (#9400)
* Allow render mode attribute to be null * Fix nullability in test shim * PR Feedback
1 parent cc26732 commit 94fc3bd

File tree

51 files changed

+607
-65
lines changed

Some content is hidden

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

51 files changed

+607
-65
lines changed

src/Compiler/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentDesignTimeNodeWriter.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1272,15 +1272,18 @@ public override void WriteRenderMode(CodeRenderingContext context, RenderModeInt
12721272
// __o = (global::Microsoft.AspNetCore.Components.IComponentRenderMode)(expression);
12731273
WriteCSharpCode(context, new CSharpCodeIntermediateNode
12741274
{
1275-
Source = node.Source,
12761275
Children =
12771276
{
12781277
new IntermediateToken
12791278
{
12801279
Kind = TokenKind.CSharp,
12811280
Content = $"{DesignTimeVariable} = (global::{ComponentsApi.IComponentRenderMode.FullTypeName})("
12821281
},
1283-
node.Children[0],
1282+
new CSharpCodeIntermediateNode
1283+
{
1284+
Source = node.Source,
1285+
Children = { node.Children[0] }
1286+
},
12841287
new IntermediateToken
12851288
{
12861289
Kind = TokenKind.CSharp,

src/Compiler/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentRuntimeNodeWriter.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1010,15 +1010,18 @@ public override void WriteRenderMode(CodeRenderingContext context, RenderModeInt
10101010
// global::Microsoft.AspNetCore.Components.IComponentRenderMode __renderMode0 = expression;
10111011
WriteCSharpCode(context, new CSharpCodeIntermediateNode
10121012
{
1013-
Source = node.Source,
10141013
Children =
10151014
{
10161015
new IntermediateToken
10171016
{
10181017
Kind = TokenKind.CSharp,
10191018
Content = $"global::{ComponentsApi.IComponentRenderMode.FullTypeName} {_scopeStack.RenderModeVarName} = "
10201019
},
1021-
node.Children[0],
1020+
new CSharpCodeIntermediateNode
1021+
{
1022+
Source = node.Source,
1023+
Children = { node.Children[0] }
1024+
},
10221025
new IntermediateToken
10231026
{
10241027
Kind = TokenKind.CSharp,

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

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10315,6 +10315,60 @@ public void RenderMode_With_Ternary()
1031510315
CompileToAssembly(generated, throwOnFailure: true);
1031610316
}
1031710317

10318+
[Fact, WorkItem("https://github.com/dotnet/razor/issues/9343")]
10319+
public void RenderMode_With_Null_Nullable_Disabled()
10320+
{
10321+
var generated = CompileToCSharp($$"""
10322+
<{{ComponentName}} @rendermode="null" />
10323+
""", throwOnFailure: true, nullableEnable: false);
10324+
10325+
// Assert
10326+
AssertDocumentNodeMatchesBaseline(generated.CodeDocument);
10327+
AssertCSharpDocumentMatchesBaseline(generated.CodeDocument);
10328+
CompileToAssembly(generated, throwOnFailure: true);
10329+
}
10330+
10331+
[Fact, WorkItem("https://github.com/dotnet/razor/issues/9343")]
10332+
public void RenderMode_With_Null_Nullable_Enabled()
10333+
{
10334+
var generated = CompileToCSharp($$"""
10335+
<{{ComponentName}} @rendermode="null" />
10336+
""", throwOnFailure: true, nullableEnable: true);
10337+
10338+
// Assert
10339+
AssertDocumentNodeMatchesBaseline(generated.CodeDocument);
10340+
AssertCSharpDocumentMatchesBaseline(generated.CodeDocument);
10341+
CompileToAssembly(generated, throwOnFailure: true);
10342+
}
10343+
10344+
[Fact, WorkItem("https://github.com/dotnet/razor/issues/9343")]
10345+
public void RenderMode_With_Nullable_Receiver()
10346+
{
10347+
var generated = CompileToCSharp($$"""
10348+
@code
10349+
{
10350+
public class RenderModeContainer
10351+
{
10352+
public Microsoft.AspNetCore.Components.IComponentRenderMode RenderMode => Microsoft.AspNetCore.Components.Web.RenderMode.Server;
10353+
}
10354+
10355+
RenderModeContainer? Container => null;
10356+
}
10357+
<{{ComponentName}} @rendermode="@(Container.RenderMode)" />
10358+
""", throwOnFailure: true, nullableEnable: true);
10359+
10360+
// Assert
10361+
AssertDocumentNodeMatchesBaseline(generated.CodeDocument);
10362+
AssertCSharpDocumentMatchesBaseline(generated.CodeDocument);
10363+
var result = CompileToAssembly(generated, throwOnFailure: false);
10364+
10365+
result.Diagnostics.Verify(
10366+
// x:\dir\subdir\Test\TestComponent.cshtml(10,29): warning CS8602: Dereference of a possibly null reference.
10367+
// Container.RenderMode
10368+
Diagnostic(ErrorCode.WRN_NullReferenceReceiver, "Container").WithLocation(10, 29)
10369+
);
10370+
}
10371+
1031810372
#endregion
1031910373

1032010374
#region FormName

src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/Duplicate_RenderMode/TestComponent.codegen.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@ private void __RazorDirectiveTokenHelpers__() {
2020
#pragma warning disable 1998
2121
protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder)
2222
{
23+
__o = (global::Microsoft.AspNetCore.Components.IComponentRenderMode)(
2324
#nullable restore
2425
#line 1 "x:\dir\subdir\Test\TestComponent.cshtml"
25-
__o = (global::Microsoft.AspNetCore.Components.IComponentRenderMode)(Microsoft.AspNetCore.Components.Web.RenderMode.Server);
26+
Microsoft.AspNetCore.Components.Web.RenderMode.Server
2627

2728
#line default
2829
#line hidden
2930
#nullable disable
31+
);
3032
__o = "";
3133
__builder.AddAttribute(-1, "ChildContent", (global::Microsoft.AspNetCore.Components.RenderFragment)((__builder2) => {
3234
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Source Location: (28:0,28 [53] x:\dir\subdir\Test\TestComponent.cshtml)
22
|Microsoft.AspNetCore.Components.Web.RenderMode.Server|
3-
Generated Location: (998:24,97 [53] )
3+
Generated Location: (1012:25,28 [53] )
44
|Microsoft.AspNetCore.Components.Web.RenderMode.Server|
55

src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Attribute_With_Existing_Attributes/TestComponent.codegen.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,15 @@ private void __RazorDirectiveTokenHelpers__() {
2121
protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder)
2222
{
2323
__o = "";
24+
__o = (global::Microsoft.AspNetCore.Components.IComponentRenderMode)(
2425
#nullable restore
2526
#line 1 "x:\dir\subdir\Test\TestComponent.cshtml"
26-
__o = (global::Microsoft.AspNetCore.Components.IComponentRenderMode)(Microsoft.AspNetCore.Components.Web.RenderMode.Server);
27+
Microsoft.AspNetCore.Components.Web.RenderMode.Server
2728

2829
#line default
2930
#line hidden
3031
#nullable disable
32+
);
3133
__o = "";
3234
__builder.AddAttribute(-1, "ChildContent", (global::Microsoft.AspNetCore.Components.RenderFragment)((__builder2) => {
3335
}

src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Attribute_With_Existing_Attributes/TestComponent.mappings.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
Source Location: (37:0,37 [53] x:\dir\subdir\Test\TestComponent.cshtml)
22
|Microsoft.AspNetCore.Components.Web.RenderMode.Server|
3-
Generated Location: (1030:25,106 [53] )
3+
Generated Location: (1044:26,37 [53] )
44
|Microsoft.AspNetCore.Components.Web.RenderMode.Server|
55

66
Source Location: (15:0,15 [2] x:\dir\subdir\Test\TestComponent.cshtml)
77
|P2|
8-
Generated Location: (1504:38,15 [2] )
8+
Generated Location: (1532:40,15 [2] )
99
|P2|
1010

1111
Source Location: (92:0,92 [2] x:\dir\subdir\Test\TestComponent.cshtml)
1212
|P1|
13-
Generated Location: (1797:47,92 [2] )
13+
Generated Location: (1825:49,92 [2] )
1414
|P1|
1515

1616
Source Location: (115:3,1 [94] x:\dir\subdir\Test\TestComponent.cshtml)
@@ -19,7 +19,7 @@ Source Location: (115:3,1 [94] x:\dir\subdir\Test\TestComponent.cshtml)
1919

2020
[Parameter]public string P2 {get; set;}
2121
|
22-
Generated Location: (2203:65,1 [94] )
22+
Generated Location: (2231:67,1 [94] )
2323
|
2424
[Parameter]public string P1 {get; set;}
2525

src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Attribute_With_Expression/TestComponent.codegen.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@ private void __RazorDirectiveTokenHelpers__() {
2020
#pragma warning disable 1998
2121
protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder)
2222
{
23+
__o = (global::Microsoft.AspNetCore.Components.IComponentRenderMode)(
2324
#nullable restore
2425
#line 1 "x:\dir\subdir\Test\TestComponent.cshtml"
25-
__o = (global::Microsoft.AspNetCore.Components.IComponentRenderMode)(new MyRenderMode() { Extra = "Hello" });
26+
new MyRenderMode() { Extra = "Hello" }
2627

2728
#line default
2829
#line hidden
2930
#nullable disable
31+
);
3032
__builder.AddAttribute(-1, "ChildContent", (global::Microsoft.AspNetCore.Components.RenderFragment)((__builder2) => {
3133
}
3234
));

src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Attribute_With_Expression/TestComponent.mappings.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Source Location: (30:0,30 [38] x:\dir\subdir\Test\TestComponent.cshtml)
22
|new MyRenderMode() { Extra = "Hello" }|
3-
Generated Location: (998:24,97 [38] )
3+
Generated Location: (1012:25,28 [38] )
44
|new MyRenderMode() { Extra = "Hello" }|
55

66
Source Location: (83:2,1 [135] x:\dir\subdir\Test\TestComponent.cshtml)
@@ -10,7 +10,7 @@ Source Location: (83:2,1 [135] x:\dir\subdir\Test\TestComponent.cshtml)
1010
public string Extra {get;set;}
1111
}
1212
|
13-
Generated Location: (1536:43,1 [135] )
13+
Generated Location: (1564:45,1 [135] )
1414
|
1515
class MyRenderMode : Microsoft.AspNetCore.Components.IComponentRenderMode
1616
{

src/Compiler/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/RenderMode_Attribute_With_SimpleIdentifier/TestComponent.codegen.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@ private void __RazorDirectiveTokenHelpers__() {
2020
#pragma warning disable 1998
2121
protected override void BuildRenderTree(global::Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder)
2222
{
23+
__o = (global::Microsoft.AspNetCore.Components.IComponentRenderMode)(
2324
#nullable restore
2425
#line 1 "x:\dir\subdir\Test\TestComponent.cshtml"
25-
__o = (global::Microsoft.AspNetCore.Components.IComponentRenderMode)(Microsoft.AspNetCore.Components.Web.RenderMode.Server);
26+
Microsoft.AspNetCore.Components.Web.RenderMode.Server
2627

2728
#line default
2829
#line hidden
2930
#nullable disable
31+
);
3032
__builder.AddAttribute(-1, "ChildContent", (global::Microsoft.AspNetCore.Components.RenderFragment)((__builder2) => {
3133
}
3234
));

0 commit comments

Comments
 (0)