Skip to content

Commit 6b34aa9

Browse files
authored
feat(blazorui): improve bit BlazorUI's SetParametersAsync source generator #10206 (#10207)
1 parent 38d69cc commit 6b34aa9

File tree

5 files changed

+39
-7
lines changed

5 files changed

+39
-7
lines changed

src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs

+31-2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ private static string GeneratePartialClass(INamedTypeSymbol classSymbol, List<Bl
3535
var className = GetClassName(classSymbol);
3636
var twoWayParameters = parameters.Where(p => p.IsTwoWayBound).ToArray();
3737
var isBaseTypeComponentBase = classSymbol.BaseType?.ToDisplayString() == "Microsoft.AspNetCore.Components.ComponentBase";
38+
var doesSupporteParametersViewCache = InheritsFromBitComponentBase(classSymbol);
3839

3940
StringBuilder builder = new StringBuilder($@"using System;
4041
using System.Threading.Tasks;
@@ -62,7 +63,14 @@ public override Task SetParametersAsync(ParameterView parameters)
6263
{
6364
builder.AppendLine($" {par.PropertySymbol.Name}HasBeenSet = false;");
6465
}
65-
builder.AppendLine(" var parametersDictionary = parameters.ToDictionary() as Dictionary<string, object>;");
66+
if (doesSupporteParametersViewCache)
67+
{
68+
builder.AppendLine(" var parametersDictionary = (ParametersCache ??= parameters.ToDictionary() as Dictionary<string, object>);");
69+
}
70+
else
71+
{
72+
builder.AppendLine(" var parametersDictionary = parameters.ToDictionary() as Dictionary<string, object>;");
73+
}
6674
builder.AppendLine(" foreach (var parameter in parametersDictionary!)");
6775
builder.AppendLine(" {");
6876
builder.AppendLine(" switch (parameter.Key)");
@@ -117,7 +125,14 @@ public override Task SetParametersAsync(ParameterView parameters)
117125
}
118126
else
119127
{
120-
builder.AppendLine(" return base.SetParametersAsync(ParameterView.FromDictionary(parametersDictionary as IDictionary<string, object?>));");
128+
if (doesSupporteParametersViewCache)
129+
{
130+
builder.AppendLine(" return base.SetParametersAsync(ParameterView.Empty);");
131+
}
132+
else
133+
{
134+
builder.AppendLine(" return base.SetParametersAsync(ParameterView.FromDictionary(parametersDictionary as IDictionary<string, object?>));");
135+
}
121136
}
122137
builder.AppendLine(@" }");
123138

@@ -171,4 +186,18 @@ private static string GetClassName(INamedTypeSymbol classSymbol)
171186

172187
return sbName.ToString();
173188
}
189+
190+
private static bool InheritsFromBitComponentBase(INamedTypeSymbol? typeSymbol)
191+
{
192+
if (typeSymbol is null)
193+
return false;
194+
195+
if (typeSymbol.TypeKind is not TypeKind.Class)
196+
return false;
197+
198+
if (typeSymbol.Name == "BitComponentBase")
199+
return true;
200+
201+
return InheritsFromBitComponentBase(typeSymbol.BaseType);
202+
}
174203
}

src/BlazorUI/Bit.BlazorUI/Components/BitComponentBase.cs

+5-2
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,11 @@ public BitDir? Dir
7474
[Parameter] public BitVisibility Visibility { get; set; }
7575

7676

77-
77+
internal protected Dictionary<string, object?>? ParametersCache { get; set; }
7878
public override Task SetParametersAsync(ParameterView parameters)
7979
{
8080
HtmlAttributes.Clear();
81-
var parametersDictionary = parameters.ToDictionary() as Dictionary<string, object>;
81+
var parametersDictionary = ParametersCache ?? throw new InvalidOperationException();
8282
foreach (var parameter in parametersDictionary!)
8383
{
8484
switch (parameter.Key)
@@ -140,6 +140,9 @@ public override Task SetParametersAsync(ParameterView parameters)
140140
break;
141141
}
142142
}
143+
144+
ParametersCache = null;
145+
143146
return base.SetParametersAsync(ParameterView.Empty);
144147
}
145148

src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitInputBase.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ public override Task SetParametersAsync(ParameterView parameters)
139139
{
140140
ValueHasBeenSet = false;
141141

142-
var parametersDictionary = parameters.ToDictionary() as Dictionary<string, object>;
142+
var parametersDictionary = (ParametersCache ??= parameters.ToDictionary() as Dictionary<string, object?>);
143143

144144
foreach (var parameter in parametersDictionary!)
145145
{

src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitTextInputBase.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public abstract class BitTextInputBase<TValue> : BitInputBase<TValue>
4040

4141
public override Task SetParametersAsync(ParameterView parameters)
4242
{
43-
var parametersDictionary = parameters.ToDictionary() as Dictionary<string, object>;
43+
var parametersDictionary = (ParametersCache ??= parameters.ToDictionary() as Dictionary<string, object?>); ;
4444

4545
foreach (var parameter in parametersDictionary!)
4646
{

src/BlazorUI/Bit.BlazorUI/Components/Progress/Loading/Base/BitLoadingBase.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public abstract class BitLoadingBase : BitComponentBase
5656

5757
public override Task SetParametersAsync(ParameterView parameters)
5858
{
59-
var parametersDictionary = parameters.ToDictionary() as Dictionary<string, object>;
59+
var parametersDictionary = (ParametersCache ??= parameters.ToDictionary() as Dictionary<string, object?>);
6060

6161
foreach (var parameter in parametersDictionary!)
6262
{

0 commit comments

Comments
 (0)