Skip to content

Commit 6526022

Browse files
Ryan Nowakrynowak
Ryan Nowak
authored andcommitted
Blazor API Review: RenderTreeBuilder
Fixes: #12415
1 parent c76cb92 commit 6526022

21 files changed

+174
-232
lines changed

src/Components/Blazor/Build/test/ChildContentRazorIntegrationTest.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public void Render_BodyChildContent()
108108
Assert.Collection(
109109
frames,
110110
frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 0),
111-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 1),
111+
frame => AssertFrame.Attribute(frame, "ChildContent", 1),
112112
frame => AssertFrame.Markup(frame, "\n <div></div>\n", 2));
113113
}
114114

@@ -131,7 +131,7 @@ public void Render_BodyChildContent_Generic()
131131
frames,
132132
frame => AssertFrame.Component(frame, "Test.RenderChildContentString", 3, 0),
133133
frame => AssertFrame.Attribute(frame, "Value", "HI", 1),
134-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 2),
134+
frame => AssertFrame.Attribute(frame, "ChildContent", 2),
135135
frame => AssertFrame.MarkupWhitespace(frame, 3),
136136
frame => AssertFrame.Element(frame, "div", 2, 4),
137137
frame => AssertFrame.Text(frame, "hi", 5),
@@ -158,7 +158,7 @@ public void Render_ExplicitChildContent()
158158
Assert.Collection(
159159
frames,
160160
frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 0),
161-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 1),
161+
frame => AssertFrame.Attribute(frame, "ChildContent", 1),
162162
frame => AssertFrame.Markup(frame, "\n <div></div>\n ", 2));
163163
}
164164

@@ -183,10 +183,10 @@ public void Render_BodyChildContent_Recursive()
183183
Assert.Collection(
184184
frames,
185185
frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 0),
186-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 1),
186+
frame => AssertFrame.Attribute(frame, "ChildContent", 1),
187187
frame => AssertFrame.MarkupWhitespace(frame, 2),
188188
frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 3),
189-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 4),
189+
frame => AssertFrame.Attribute(frame, "ChildContent", 4),
190190
frame => AssertFrame.MarkupWhitespace(frame, 6),
191191
frame => AssertFrame.Markup(frame, "\n <div></div>\n ", 5));
192192
}
@@ -208,7 +208,7 @@ public void Render_AttributeChildContent()
208208
Assert.Collection(
209209
frames,
210210
frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 2),
211-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 3),
211+
frame => AssertFrame.Attribute(frame, "ChildContent", 3),
212212
frame => AssertFrame.Element(frame, "div", 2, 0),
213213
frame => AssertFrame.Text(frame, "hi", 1));
214214
}
@@ -230,7 +230,7 @@ public void Render_AttributeChildContent_RenderFragmentOfString()
230230
Assert.Collection(
231231
frames,
232232
frame => AssertFrame.Component(frame, "Test.RenderChildContentString", 3, 2),
233-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 3),
233+
frame => AssertFrame.Attribute(frame, "ChildContent", 3),
234234
frame => AssertFrame.Attribute(frame, "Value", "HI", 4),
235235
frame => AssertFrame.Element(frame, "div", 2, 0),
236236
frame => AssertFrame.Text(frame, "hi", 1));
@@ -253,7 +253,7 @@ public void Render_AttributeChildContent_NoArgTemplate()
253253
Assert.Collection(
254254
frames,
255255
frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 2),
256-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 3),
256+
frame => AssertFrame.Attribute(frame, "ChildContent", 3),
257257
frame => AssertFrame.Element(frame, "div", 2, 0),
258258
frame => AssertFrame.Text(frame, "hi", 1));
259259
}
@@ -275,7 +275,7 @@ public void Render_AttributeChildContent_IgnoresEmptyBody()
275275
Assert.Collection(
276276
frames,
277277
frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 2),
278-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 3),
278+
frame => AssertFrame.Attribute(frame, "ChildContent", 3),
279279
frame => AssertFrame.Element(frame, "div", 2, 0),
280280
frame => AssertFrame.Text(frame, "hi", 1));
281281
}
@@ -299,7 +299,7 @@ public void Render_AttributeChildContent_IgnoresWhitespaceBody()
299299
Assert.Collection(
300300
frames,
301301
frame => AssertFrame.Component(frame, "Test.RenderChildContent", 2, 2),
302-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 3),
302+
frame => AssertFrame.Attribute(frame, "ChildContent", 3),
303303
frame => AssertFrame.Element(frame, "div", 2, 0),
304304
frame => AssertFrame.Text(frame, "hi", 1));
305305
}
@@ -327,7 +327,7 @@ public void Render_MultipleChildContent()
327327
frame => AssertFrame.Attribute(frame, "Name", "billg", 3),
328328
frame => AssertFrame.Attribute(frame, "Header", typeof(RenderFragment<string>), 4),
329329
frame => AssertFrame.Attribute(frame, "Value", "HI", 5),
330-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, typeof(RenderFragment<string>), 6),
330+
frame => AssertFrame.Attribute(frame, "ChildContent", typeof(RenderFragment<string>), 6),
331331
frame => AssertFrame.Attribute(frame, "Footer", typeof(RenderFragment), 10),
332332
frame => AssertFrame.Element(frame, "div", 2, 0),
333333
frame => AssertFrame.Text(frame, "billg", 1),
@@ -360,7 +360,7 @@ public void Render_MultipleChildContent_ContextParameterOnComponent()
360360
frame => AssertFrame.Attribute(frame, "Name", "billg", 1),
361361
frame => AssertFrame.Attribute(frame, "Value", "HI", 2),
362362
frame => AssertFrame.Attribute(frame, "Header", typeof(RenderFragment<string>), 3),
363-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, typeof(RenderFragment<string>), 6),
363+
frame => AssertFrame.Attribute(frame, "ChildContent", typeof(RenderFragment<string>), 6),
364364
frame => AssertFrame.Attribute(frame, "Footer", typeof(RenderFragment), 10),
365365
frame => AssertFrame.Element(frame, "div", 2, 4),
366366
frame => AssertFrame.Text(frame, "billg", 5),
@@ -395,7 +395,7 @@ public void Render_MultipleChildContent_ContextParameterOnComponent_SetsSameName
395395
frame => AssertFrame.Attribute(frame, "Name", "billg", 1),
396396
frame => AssertFrame.Attribute(frame, "Value", "HI", 2),
397397
frame => AssertFrame.Attribute(frame, "Header", typeof(RenderFragment<string>), 3),
398-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, typeof(RenderFragment<string>), 6),
398+
frame => AssertFrame.Attribute(frame, "ChildContent", typeof(RenderFragment<string>), 6),
399399
frame => AssertFrame.Attribute(frame, "Footer", typeof(RenderFragment), 10),
400400
frame => AssertFrame.Element(frame, "div", 2, 4),
401401
frame => AssertFrame.Text(frame, "billg", 5),

src/Components/Blazor/Build/test/ComponentRenderingRazorIntegrationTest.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ public class MyComponent : ComponentBase
345345
frames,
346346
frame => AssertFrame.Component(frame, "Test.MyComponent", 3, 0),
347347
frame => AssertFrame.Attribute(frame, "MyAttr", "abc", 1),
348-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 2));
348+
frame => AssertFrame.Attribute(frame, "ChildContent", 2));
349349

350350
// Assert: Captured ChildContent frames are correct
351351
var childFrames = GetFrames((RenderFragment)frames[2].AttributeValue);
@@ -385,7 +385,7 @@ public class MyComponent : ComponentBase
385385
Assert.Collection(
386386
frames,
387387
frame => AssertFrame.Component(frame, "Test.MyComponent", 2, 0),
388-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 1));
388+
frame => AssertFrame.Attribute(frame, "ChildContent", 1));
389389

390390
// Assert: first level of ChildContent is correct
391391
// Note that we don't really need the sequence numbers to continue on from the
@@ -397,7 +397,7 @@ public class MyComponent : ComponentBase
397397
Assert.Collection(
398398
innerFrames,
399399
frame => AssertFrame.Component(frame, "Test.MyComponent", 2, 2),
400-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 3));
400+
frame => AssertFrame.Attribute(frame, "ChildContent", 3));
401401

402402
// Assert: second level of ChildContent is correct
403403
Assert.Collection(
@@ -540,7 +540,7 @@ public class MyComponent : ComponentBase
540540
frame => AssertFrame.Element(frame, "body", 5, 3),
541541
frame => AssertFrame.MarkupWhitespace(frame, 4),
542542
frame => AssertFrame.Component(frame, "Test.MyComponent", 2, 5),
543-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 6),
543+
frame => AssertFrame.Attribute(frame, "ChildContent", 6),
544544
frame => AssertFrame.MarkupWhitespace(frame, 16),
545545
frame => AssertFrame.MarkupWhitespace(frame, 17));
546546

src/Components/Blazor/Build/test/GenericComponentRazorIntegrationTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ public void Render_GenericComponent_WithChildContent()
170170
frames,
171171
frame => AssertFrame.Component(frame, genericComponentType.FullName, 3, 0),
172172
frame => AssertFrame.Attribute(frame, "Items", typeof(List<int>), 1),
173-
frame => AssertFrame.Attribute(frame, RenderTreeBuilder.ChildContent, 2),
173+
frame => AssertFrame.Attribute(frame, "ChildContent", 2),
174174
frame => AssertFrame.MarkupWhitespace(frame, 3),
175175
frame => AssertFrame.Element(frame, "div", 2, 4),
176176
frame => AssertFrame.Text(frame, "0", 5),

src/Components/Blazor/Build/test/RazorIntegrationTestBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ protected private RenderTreeFrame[] GetRenderTree(TestRenderer renderer, ICompon
397397

398398
protected ArrayRange<RenderTreeFrame> GetFrames(RenderFragment fragment)
399399
{
400-
var builder = new RenderTreeBuilder(new TestRenderer());
400+
var builder = new RenderTreeBuilder();
401401
fragment(builder);
402402
return builder.GetFrames();
403403
}

src/Components/Components/perf/RenderTreeDiffBuilderBenchmark.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public RenderTreeDiffBuilderBenchmark()
2424

2525
// A simple component for basic tests -- this is similar to what MVC scaffolding generates
2626
// for bootstrap3 form fields, but modified to be more Component-like.
27-
original = new RenderTreeBuilder(renderer);
27+
original = new RenderTreeBuilder();
2828
original.OpenElement(0, "div");
2929
original.AddAttribute(1, "class", "form-group");
3030

@@ -50,7 +50,7 @@ public RenderTreeDiffBuilderBenchmark()
5050
original.CloseElement();
5151

5252
// Now simulate some input
53-
modified = new RenderTreeBuilder(renderer);
53+
modified = new RenderTreeBuilder();
5454
modified.OpenElement(0, "div");
5555
modified.AddAttribute(1, "class", "form-group");
5656

src/Components/Components/ref/Microsoft.AspNetCore.Components.netstandard2.0.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -555,15 +555,12 @@ public readonly partial struct ArrayRange<T>
555555
public ArrayRange(T[] array, int count) { throw null; }
556556
public Microsoft.AspNetCore.Components.RenderTree.ArrayRange<T> Clone() { throw null; }
557557
}
558-
public partial class RenderTreeBuilder : System.IDisposable
558+
public sealed partial class RenderTreeBuilder : System.IDisposable
559559
{
560-
public const string ChildContent = "ChildContent";
561-
public RenderTreeBuilder(Microsoft.AspNetCore.Components.Rendering.Renderer renderer) { }
560+
public RenderTreeBuilder() { }
562561
public void AddAttribute(int sequence, in Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame frame) { }
563562
public void AddAttribute(int sequence, string name, Microsoft.AspNetCore.Components.EventCallback value) { }
564-
public void AddAttribute(int sequence, string name, System.Action value) { }
565563
public void AddAttribute(int sequence, string name, bool value) { }
566-
public void AddAttribute(int sequence, string name, System.Func<System.Threading.Tasks.Task> value) { }
567564
public void AddAttribute(int sequence, string name, System.MulticastDelegate value) { }
568565
public void AddAttribute(int sequence, string name, object value) { }
569566
public void AddAttribute(int sequence, string name, string value) { }

src/Components/Components/src/RenderTree/RenderTreeBuilder.cs

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using System.Collections.Generic;
66
using System.Diagnostics;
77
using System.Threading.Tasks;
8-
using Microsoft.AspNetCore.Components.Rendering;
98

109
namespace Microsoft.AspNetCore.Components.RenderTree
1110
{
@@ -17,13 +16,12 @@ namespace Microsoft.AspNetCore.Components.RenderTree
1716
/// <summary>
1817
/// Provides methods for building a collection of <see cref="RenderTreeFrame"/> entries.
1918
/// </summary>
20-
public class RenderTreeBuilder : IDisposable
19+
public sealed class RenderTreeBuilder : IDisposable
2120
{
2221
private readonly static object BoxedTrue = true;
2322
private readonly static object BoxedFalse = false;
2423
private readonly static string ComponentReferenceCaptureInvalidParentMessage = $"Component reference captures may only be added as children of frames of type {RenderTreeFrameType.Component}";
2524

26-
private readonly Renderer _renderer;
2725
private readonly ArrayBuilder<RenderTreeFrame> _entries = new ArrayBuilder<RenderTreeFrame>();
2826
private readonly Stack<int> _openElementIndices = new Stack<int>();
2927
private RenderTreeFrameType? _lastNonAttributeFrameType;
@@ -33,16 +31,7 @@ public class RenderTreeBuilder : IDisposable
3331
/// <summary>
3432
/// The reserved parameter name used for supplying child content.
3533
/// </summary>
36-
public const string ChildContent = nameof(ChildContent);
37-
38-
/// <summary>
39-
/// Constructs an instance of <see cref="RenderTreeBuilder"/>.
40-
/// </summary>
41-
/// <param name="renderer">The associated <see cref="Renderer"/>.</param>
42-
public RenderTreeBuilder(Renderer renderer)
43-
{
44-
_renderer = renderer ?? throw new ArgumentNullException(nameof(renderer));
45-
}
34+
private const string ChildContent = nameof(ChildContent);
4635

4736
/// <summary>
4837
/// Appends a frame representing an element, i.e., a container for other frames.
@@ -206,40 +195,6 @@ public void AddAttribute(int sequence, string name, string value)
206195
}
207196
}
208197

209-
/// <summary>
210-
/// <para>
211-
/// Appends a frame representing an <see cref="Action"/>-valued attribute.
212-
/// </para>
213-
/// <para>
214-
/// The attribute is associated with the most recently added element. If the value is <c>null</c> and the
215-
/// current element is not a component, the frame will be omitted.
216-
/// </para>
217-
/// </summary>
218-
/// <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
219-
/// <param name="name">The name of the attribute.</param>
220-
/// <param name="value">The value of the attribute.</param>
221-
public void AddAttribute(int sequence, string name, Action value)
222-
{
223-
AddAttribute(sequence, name, (MulticastDelegate)value);
224-
}
225-
226-
/// <summary>
227-
/// <para>
228-
/// Appends a frame representing a <see cref="Func{Task}"/>-valued attribute.
229-
/// </para>
230-
/// <para>
231-
/// The attribute is associated with the most recently added element. If the value is <c>null</c> and the
232-
/// current element is not a component, the frame will be omitted.
233-
/// </para>
234-
/// </summary>
235-
/// <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
236-
/// <param name="name">The name of the attribute.</param>
237-
/// <param name="value">The value of the attribute.</param>
238-
public void AddAttribute(int sequence, string name, Func<Task> value)
239-
{
240-
AddAttribute(sequence, name, (MulticastDelegate)value);
241-
}
242-
243198
/// <summary>
244199
/// <para>
245200
/// Appends a frame representing a delegate-valued attribute.

src/Components/Components/src/Rendering/ComponentState.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ public ComponentState(Renderer renderer, int componentId, IComponent component,
3636
Component = component ?? throw new ArgumentNullException(nameof(component));
3737
_renderer = renderer ?? throw new ArgumentNullException(nameof(renderer));
3838
_cascadingParameters = CascadingParameterState.FindCascadingParameters(this);
39-
CurrrentRenderTree = new RenderTreeBuilder(renderer);
40-
_renderTreeBuilderPrevious = new RenderTreeBuilder(renderer);
39+
CurrentRenderTree = new RenderTreeBuilder();
40+
_renderTreeBuilderPrevious = new RenderTreeBuilder();
4141

4242
if (_cascadingParameters != null)
4343
{
@@ -49,7 +49,7 @@ public ComponentState(Renderer renderer, int componentId, IComponent component,
4949
public int ComponentId { get; }
5050
public IComponent Component { get; }
5151
public ComponentState ParentComponentState { get; }
52-
public RenderTreeBuilder CurrrentRenderTree { get; private set; }
52+
public RenderTreeBuilder CurrentRenderTree { get; private set; }
5353

5454
public void RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment renderFragment)
5555
{
@@ -61,17 +61,17 @@ public void RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment rend
6161
}
6262

6363
// Swap the old and new tree builders
64-
(CurrrentRenderTree, _renderTreeBuilderPrevious) = (_renderTreeBuilderPrevious, CurrrentRenderTree);
64+
(CurrentRenderTree, _renderTreeBuilderPrevious) = (_renderTreeBuilderPrevious, CurrentRenderTree);
6565

66-
CurrrentRenderTree.Clear();
67-
renderFragment(CurrrentRenderTree);
66+
CurrentRenderTree.Clear();
67+
renderFragment(CurrentRenderTree);
6868

6969
var diff = RenderTreeDiffBuilder.ComputeDiff(
7070
_renderer,
7171
batchBuilder,
7272
ComponentId,
7373
_renderTreeBuilderPrevious.GetFrames(),
74-
CurrrentRenderTree.GetFrames());
74+
CurrentRenderTree.GetFrames());
7575
batchBuilder.UpdatedComponentDiffs.Append(diff);
7676
}
7777

@@ -85,7 +85,7 @@ public void DisposeInBatch(RenderBatchBuilder batchBuilder)
8585
disposable.Dispose();
8686
}
8787

88-
RenderTreeDiffBuilder.DisposeFrames(batchBuilder, CurrrentRenderTree.GetFrames());
88+
RenderTreeDiffBuilder.DisposeFrames(batchBuilder, CurrentRenderTree.GetFrames());
8989

9090
if (_hasAnyCascadingParameterSubscriptions)
9191
{
@@ -188,7 +188,7 @@ public void Dispose()
188188
private void DisposeBuffers()
189189
{
190190
((IDisposable)_renderTreeBuilderPrevious).Dispose();
191-
((IDisposable)CurrrentRenderTree).Dispose();
191+
((IDisposable)CurrentRenderTree).Dispose();
192192
_latestDirectParametersSnapshot?.Dispose();
193193
}
194194
}

0 commit comments

Comments
 (0)