From efdd1e70b2ef7707e97d83b63510491b570fbf22 Mon Sep 17 00:00:00 2001 From: ysmoradi Date: Sat, 8 Mar 2025 10:25:36 +0100 Subject: [PATCH 1/5] improve bit BlazorUI source generator's SetParametersAsync generator (#10206) --- .../Component/ComponentSourceGenerator.cs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs b/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs index 7a67744444..767e555425 100644 --- a/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs +++ b/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs @@ -62,10 +62,9 @@ public override Task SetParametersAsync(ParameterView parameters) { builder.AppendLine($" {par.PropertySymbol.Name}HasBeenSet = false;"); } - builder.AppendLine(" var parametersDictionary = parameters.ToDictionary() as Dictionary;"); - builder.AppendLine(" foreach (var parameter in parametersDictionary!)"); + builder.AppendLine(" foreach (var parameter in parameters)"); builder.AppendLine(" {"); - builder.AppendLine(" switch (parameter.Key)"); + builder.AppendLine(" switch (parameter.Name)"); builder.AppendLine(" {"); foreach (var par in parameters) { @@ -96,7 +95,6 @@ public override Task SetParametersAsync(ParameterView parameters) { builder.AppendLine($" if (notEquals{paramName}) {par.CallOnSetMethodName}();"); } - builder.AppendLine(" parametersDictionary.Remove(parameter.Key);"); builder.AppendLine(" break;"); if (par.IsTwoWayBound) { @@ -105,7 +103,6 @@ public override Task SetParametersAsync(ParameterView parameters) builder.AppendLine($" case nameof({paramName}):"); builder.AppendLine($" var {varName} = parameter.Value is null ? default! : (EventCallback<{sym.Type.ToDisplayString()}>)parameter.Value;"); builder.AppendLine($" {paramName} = {varName};"); - builder.AppendLine(" parametersDictionary.Remove(parameter.Key);"); builder.AppendLine(" break;"); } } @@ -117,7 +114,7 @@ public override Task SetParametersAsync(ParameterView parameters) } else { - builder.AppendLine(" return base.SetParametersAsync(ParameterView.FromDictionary(parametersDictionary as IDictionary));"); + builder.AppendLine(" return base.SetParametersAsync(parameters);"); } builder.AppendLine(@" }"); From c812d901bdb5513f47912325db7a69a1e0c99ef2 Mon Sep 17 00:00:00 2001 From: ysmoradi Date: Sat, 8 Mar 2025 10:48:49 +0100 Subject: [PATCH 2/5] fix --- .../Component/ComponentSourceGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs b/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs index 767e555425..82cba14dc1 100644 --- a/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs +++ b/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs @@ -62,7 +62,7 @@ public override Task SetParametersAsync(ParameterView parameters) { builder.AppendLine($" {par.PropertySymbol.Name}HasBeenSet = false;"); } - builder.AppendLine(" foreach (var parameter in parameters)"); + builder.AppendLine(" foreach (var parameter in parameters)"); builder.AppendLine(" {"); builder.AppendLine(" switch (parameter.Name)"); builder.AppendLine(" {"); From 4acac90d2e9371dc260bd49c38122939bfb6eb9a Mon Sep 17 00:00:00 2001 From: ysmoradi Date: Sat, 8 Mar 2025 12:16:19 +0100 Subject: [PATCH 3/5] fix --- .../Component/ComponentSourceGenerator.cs | 38 +++++++++++++++++-- .../Components/BitComponentBase.cs | 4 +- .../Components/Inputs/BitInputBase.cs | 2 +- .../Components/Inputs/BitTextInputBase.cs | 2 +- .../Progress/Loading/Base/BitLoadingBase.cs | 2 +- 5 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs b/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs index 82cba14dc1..d0e12136d2 100644 --- a/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs +++ b/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs @@ -35,6 +35,7 @@ private static string GeneratePartialClass(INamedTypeSymbol classSymbol, List p.IsTwoWayBound).ToArray(); var isBaseTypeComponentBase = classSymbol.BaseType?.ToDisplayString() == "Microsoft.AspNetCore.Components.ComponentBase"; + var doesSupporteParametersViewCache = InheritsFromBitComponentBase(classSymbol); StringBuilder builder = new StringBuilder($@"using System; using System.Threading.Tasks; @@ -62,9 +63,17 @@ public override Task SetParametersAsync(ParameterView parameters) { builder.AppendLine($" {par.PropertySymbol.Name}HasBeenSet = false;"); } - builder.AppendLine(" foreach (var parameter in parameters)"); + if (doesSupporteParametersViewCache) + { + builder.AppendLine(" var parametersDictionary = (ParametersCache ??= parameters.ToDictionary() as Dictionary);"); + } + else + { + builder.AppendLine(" var parametersDictionary = parameters.ToDictionary() as Dictionary;"); + } + builder.AppendLine(" foreach (var parameter in parametersDictionary!)"); builder.AppendLine(" {"); - builder.AppendLine(" switch (parameter.Name)"); + builder.AppendLine(" switch (parameter.Key)"); builder.AppendLine(" {"); foreach (var par in parameters) { @@ -95,6 +104,7 @@ public override Task SetParametersAsync(ParameterView parameters) { builder.AppendLine($" if (notEquals{paramName}) {par.CallOnSetMethodName}();"); } + builder.AppendLine(" parametersDictionary.Remove(parameter.Key);"); builder.AppendLine(" break;"); if (par.IsTwoWayBound) { @@ -103,6 +113,7 @@ public override Task SetParametersAsync(ParameterView parameters) builder.AppendLine($" case nameof({paramName}):"); builder.AppendLine($" var {varName} = parameter.Value is null ? default! : (EventCallback<{sym.Type.ToDisplayString()}>)parameter.Value;"); builder.AppendLine($" {paramName} = {varName};"); + builder.AppendLine(" parametersDictionary.Remove(parameter.Key);"); builder.AppendLine(" break;"); } } @@ -114,7 +125,14 @@ public override Task SetParametersAsync(ParameterView parameters) } else { - builder.AppendLine(" return base.SetParametersAsync(parameters);"); + if (doesSupporteParametersViewCache) + { + builder.AppendLine(" return base.SetParametersAsync(default);"); + } + else + { + builder.AppendLine(" return base.SetParametersAsync(ParameterView.FromDictionary(parametersDictionary as IDictionary));"); + } } builder.AppendLine(@" }"); @@ -168,4 +186,18 @@ private static string GetClassName(INamedTypeSymbol classSymbol) return sbName.ToString(); } + + private static bool InheritsFromBitComponentBase(INamedTypeSymbol? typeSymbol) + { + if (typeSymbol is null) + return false; + + if (typeSymbol.TypeKind is not TypeKind.Class) + return false; + + if (typeSymbol.Name == "BitComponentBase") + return true; + + return InheritsFromBitComponentBase(typeSymbol.BaseType); + } } diff --git a/src/BlazorUI/Bit.BlazorUI/Components/BitComponentBase.cs b/src/BlazorUI/Bit.BlazorUI/Components/BitComponentBase.cs index c83656cb16..bde6dd0710 100644 --- a/src/BlazorUI/Bit.BlazorUI/Components/BitComponentBase.cs +++ b/src/BlazorUI/Bit.BlazorUI/Components/BitComponentBase.cs @@ -74,11 +74,11 @@ public BitDir? Dir [Parameter] public BitVisibility Visibility { get; set; } - + internal protected Dictionary? ParametersCache { get; set; } public override Task SetParametersAsync(ParameterView parameters) { HtmlAttributes.Clear(); - var parametersDictionary = parameters.ToDictionary() as Dictionary; + var parametersDictionary = ParametersCache ?? throw new InvalidOperationException(); foreach (var parameter in parametersDictionary!) { switch (parameter.Key) diff --git a/src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitInputBase.cs b/src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitInputBase.cs index 0b16216f6c..4af592ff56 100644 --- a/src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitInputBase.cs +++ b/src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitInputBase.cs @@ -139,7 +139,7 @@ public override Task SetParametersAsync(ParameterView parameters) { ValueHasBeenSet = false; - var parametersDictionary = parameters.ToDictionary() as Dictionary; + var parametersDictionary = (ParametersCache ??= parameters.ToDictionary() as Dictionary); foreach (var parameter in parametersDictionary!) { diff --git a/src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitTextInputBase.cs b/src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitTextInputBase.cs index b4c4dc61b5..5874799e25 100644 --- a/src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitTextInputBase.cs +++ b/src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitTextInputBase.cs @@ -40,7 +40,7 @@ public abstract class BitTextInputBase : BitInputBase public override Task SetParametersAsync(ParameterView parameters) { - var parametersDictionary = parameters.ToDictionary() as Dictionary; + var parametersDictionary = (ParametersCache ??= parameters.ToDictionary() as Dictionary); ; foreach (var parameter in parametersDictionary!) { diff --git a/src/BlazorUI/Bit.BlazorUI/Components/Progress/Loading/Base/BitLoadingBase.cs b/src/BlazorUI/Bit.BlazorUI/Components/Progress/Loading/Base/BitLoadingBase.cs index 5b774859de..fcce59ccf0 100644 --- a/src/BlazorUI/Bit.BlazorUI/Components/Progress/Loading/Base/BitLoadingBase.cs +++ b/src/BlazorUI/Bit.BlazorUI/Components/Progress/Loading/Base/BitLoadingBase.cs @@ -56,7 +56,7 @@ public abstract class BitLoadingBase : BitComponentBase public override Task SetParametersAsync(ParameterView parameters) { - var parametersDictionary = parameters.ToDictionary() as Dictionary; + var parametersDictionary = (ParametersCache ??= parameters.ToDictionary() as Dictionary); foreach (var parameter in parametersDictionary!) { From 368a8e0709e59a78ba5dccbd440d93cb8cb1c840 Mon Sep 17 00:00:00 2001 From: ysmoradi Date: Sat, 8 Mar 2025 12:19:25 +0100 Subject: [PATCH 4/5] fix --- .../Component/ComponentSourceGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs b/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs index d0e12136d2..dd4c9f0811 100644 --- a/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs +++ b/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs @@ -127,7 +127,7 @@ public override Task SetParametersAsync(ParameterView parameters) { if (doesSupporteParametersViewCache) { - builder.AppendLine(" return base.SetParametersAsync(default);"); + builder.AppendLine(" return base.SetParametersAsync(ParameterView.Empty);"); } else { From f970a96cdab6fc323699c64b727b3a1ead350937 Mon Sep 17 00:00:00 2001 From: ysmoradi Date: Sat, 8 Mar 2025 12:39:14 +0100 Subject: [PATCH 5/5] fix --- src/BlazorUI/Bit.BlazorUI/Components/BitComponentBase.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/BlazorUI/Bit.BlazorUI/Components/BitComponentBase.cs b/src/BlazorUI/Bit.BlazorUI/Components/BitComponentBase.cs index bde6dd0710..3f496563bf 100644 --- a/src/BlazorUI/Bit.BlazorUI/Components/BitComponentBase.cs +++ b/src/BlazorUI/Bit.BlazorUI/Components/BitComponentBase.cs @@ -140,6 +140,9 @@ public override Task SetParametersAsync(ParameterView parameters) break; } } + + ParametersCache = null; + return base.SetParametersAsync(ParameterView.Empty); }