Skip to content

Commit e1453f5

Browse files
authored
Update binder gen emitted-interceptor nullability to match framework impl (#91180)
1 parent 3a1570f commit e1453f5

35 files changed

+722
-609
lines changed

src/libraries/Microsoft.Extensions.Configuration.Binder/gen/ConfigurationBindingGenerator.Emitter.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,19 +96,19 @@ private void EmitBindCoreCall(
9696
EmitBindCoreCall(memberAccessExpr, initKind);
9797
}
9898

99-
void EmitBindCoreCall(string objExpression, InitializationKind initKind)
99+
void EmitBindCoreCall(string instanceExpr, InitializationKind initKind)
100100
{
101-
string bindCoreCall = $@"{nameof(MethodsToGen_CoreBindingHelper.BindCore)}({configArgExpr}, ref {objExpression}, {Identifier.binderOptions});";
102-
EmitObjectInit(objExpression, initKind);
101+
string bindCoreCall = $@"{nameof(MethodsToGen_CoreBindingHelper.BindCore)}({configArgExpr}, ref {instanceExpr}, {Identifier.binderOptions});";
102+
EmitObjectInit(instanceExpr, initKind);
103103
_writer.WriteLine(bindCoreCall);
104-
writeOnSuccess?.Invoke(objExpression);
104+
writeOnSuccess?.Invoke(instanceExpr);
105105
}
106106

107-
void EmitObjectInit(string objExpression, InitializationKind initKind)
107+
void EmitObjectInit(string instanceExpr, InitializationKind initKind)
108108
{
109109
if (initKind is not InitializationKind.None)
110110
{
111-
this.EmitObjectInit(type, objExpression, initKind, configArgExpr);
111+
this.EmitObjectInit(type, instanceExpr, initKind, configArgExpr);
112112
}
113113
}
114114
}

src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Helpers/Emitter/ConfigurationBinder.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using System.Collections.Generic;
5-
using SourceGenerators;
65

76
namespace Microsoft.Extensions.Configuration.Binder.SourceGeneration
87
{
@@ -101,13 +100,13 @@ private void EmitBindMethods_ConfigurationBinder()
101100
return;
102101
}
103102

104-
string objParamExpr = $"object? {Identifier.obj}";
103+
string instanceParamExpr = $"object? {Identifier.instance}";
105104

106105
if (ShouldEmitMethods(MethodsToGen_ConfigurationBinder.Bind_instance))
107106
{
108107
EmitMethods(
109108
MethodsToGen_ConfigurationBinder.Bind_instance,
110-
additionalParams: objParamExpr,
109+
additionalParams: instanceParamExpr,
111110
configExpression: Identifier.configuration,
112111
configureOptions: false);
113112
}
@@ -116,7 +115,7 @@ private void EmitBindMethods_ConfigurationBinder()
116115
{
117116
EmitMethods(
118117
MethodsToGen_ConfigurationBinder.Bind_instance_BinderOptions,
119-
additionalParams: $"{objParamExpr}, {TypeDisplayString.NullableActionOfBinderOptions} {Identifier.configureOptions}",
118+
additionalParams: $"{instanceParamExpr}, {TypeDisplayString.NullableActionOfBinderOptions} {Identifier.configureOptions}",
120119
configExpression: Identifier.configuration,
121120
configureOptions: true);
122121
}
@@ -125,7 +124,7 @@ private void EmitBindMethods_ConfigurationBinder()
125124
{
126125
EmitMethods(
127126
MethodsToGen_ConfigurationBinder.Bind_key_instance,
128-
additionalParams: $"string {Identifier.key}, {objParamExpr}",
127+
additionalParams: $"string {Identifier.key}, {instanceParamExpr}",
129128
configExpression: $"{Expression.configurationGetSection}({Identifier.key})",
130129
configureOptions: false);
131130
}
@@ -141,17 +140,17 @@ void EmitMethods(MethodsToGen_ConfigurationBinder method, string additionalParam
141140
EmitInterceptsLocationAnnotations(interceptorInfoList);
142141
EmitStartBlock($"public static void {Identifier.Bind}_{type.DisplayString.ToIdentifierSubstring()}(this {Identifier.IConfiguration} {Identifier.configuration}, {additionalParams})");
143142

144-
if (!EmitInitException(type) && type.NeedsMemberBinding)
143+
if (type.NeedsMemberBinding)
145144
{
146145
string binderOptionsArg = configureOptions ? $"{Identifier.GetBinderOptions}({Identifier.configureOptions})" : $"{Identifier.binderOptions}: null";
147146

148147
EmitCheckForNullArgument_WithBlankLine(Identifier.configuration);
149148
if (!type.IsValueType)
150149
{
151-
EmitCheckForNullArgument_WithBlankLine(Identifier.obj);
150+
EmitCheckForNullArgument_WithBlankLine(Identifier.instance, voidReturn: true);
152151
}
153152
_writer.WriteLine($$"""
154-
var {{Identifier.typedObj}} = ({{type.EffectiveType.DisplayString}}){{Identifier.obj}};
153+
var {{Identifier.typedObj}} = ({{type.EffectiveType.DisplayString}}){{Identifier.instance}};
155154
{{nameof(MethodsToGen_CoreBindingHelper.BindCore)}}({{configExpression}}, ref {{Identifier.typedObj}}, {{binderOptionsArg}});
156155
""");
157156
}

src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Helpers/Emitter/CoreBindingHelpers.cs

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ private void EmitGetCoreMethod()
101101
}
102102
else if (!EmitInitException(effectiveType))
103103
{
104-
EmitBindCoreCall(effectiveType, Identifier.obj, Identifier.configuration, InitializationKind.Declaration);
105-
_writer.WriteLine($"return {Identifier.obj};");
104+
EmitBindCoreCall(effectiveType, Identifier.instance, Identifier.configuration, InitializationKind.Declaration);
105+
_writer.WriteLine($"return {Identifier.instance};");
106106
}
107107

108108
EmitEndBlock();
@@ -168,9 +168,8 @@ private void EmitBindCoreMainMethod()
168168
}
169169

170170
EmitBlankLineIfRequired();
171-
EmitStartBlock($"public static void {nameof(MethodsToGen_CoreBindingHelper.BindCoreMain)}({Identifier.IConfiguration} {Identifier.configuration}, object {Identifier.obj}, Type {Identifier.type}, {TypeDisplayString.NullableActionOfBinderOptions} {Identifier.configureOptions})");
172-
EmitCheckForNullArgument_WithBlankLine(Identifier.configuration);
173-
EmitCheckForNullArgument_WithBlankLine(Identifier.obj);
171+
EmitStartBlock($"public static void {nameof(MethodsToGen_CoreBindingHelper.BindCoreMain)}({Identifier.IConfiguration} {Identifier.configuration}, object {Identifier.instance}, Type {Identifier.type}, {TypeDisplayString.NullableActionOfBinderOptions} {Identifier.configureOptions})");
172+
EmitCheckForNullArgument_WithBlankLine(Identifier.instance, voidReturn: true);
174173
EmitIConfigurationHasValueOrChildrenCheck(voidReturn: true);
175174
_writer.WriteLine($"{Identifier.BinderOptions}? {Identifier.binderOptions} = {Identifier.GetBinderOptions}({Identifier.configureOptions});");
176175
_writer.WriteLine();
@@ -184,7 +183,7 @@ private void EmitBindCoreMainMethod()
184183
EmitStartBlock($"{conditionKindExpr} ({Identifier.type} == typeof({type.DisplayString}))");
185184
if (!EmitInitException(effectiveType))
186185
{
187-
_writer.WriteLine($"var {Identifier.temp} = ({effectiveType.DisplayString}){Identifier.obj};");
186+
_writer.WriteLine($"var {Identifier.temp} = ({effectiveType.DisplayString}){Identifier.instance};");
188187
EmitBindCoreCall(type, Identifier.temp, Identifier.configuration, InitializationKind.None);
189188
_writer.WriteLine($"return;");
190189
}
@@ -213,9 +212,7 @@ private void EmitBindCoreMethods()
213212

214213
private void EmitBindCoreMethod(TypeSpec type)
215214
{
216-
Debug.Assert(type.CanInitialize);
217-
218-
string objParameterExpression = $"ref {type.DisplayString} {Identifier.obj}";
215+
string objParameterExpression = $"ref {type.DisplayString} {Identifier.instance}";
219216
EmitStartBlock(@$"public static void {nameof(MethodsToGen_CoreBindingHelper.BindCore)}({Identifier.IConfiguration} {Identifier.configuration}, {objParameterExpression}, {Identifier.BinderOptions}? {Identifier.binderOptions})");
220217

221218
TypeSpec effectiveType = type.EffectiveType;
@@ -618,15 +615,15 @@ private void EmitPopulationImplForArray(EnumerableSpec type)
618615

619616
// Resize array and add binded elements.
620617
_writer.WriteLine($$"""
621-
{{Identifier.Int32}} {{Identifier.originalCount}} = {{Identifier.obj}}.{{Identifier.Length}};
622-
{{Identifier.Array}}.{{Identifier.Resize}}(ref {{Identifier.obj}}, {{Identifier.originalCount}} + {{tempIdentifier}}.{{Identifier.Count}});
623-
{{tempIdentifier}}.{{Identifier.CopyTo}}({{Identifier.obj}}, {{Identifier.originalCount}});
618+
{{Identifier.Int32}} {{Identifier.originalCount}} = {{Identifier.instance}}.{{Identifier.Length}};
619+
{{Identifier.Array}}.{{Identifier.Resize}}(ref {{Identifier.instance}}, {{Identifier.originalCount}} + {{tempIdentifier}}.{{Identifier.Count}});
620+
{{tempIdentifier}}.{{Identifier.CopyTo}}({{Identifier.instance}}, {{Identifier.originalCount}});
624621
""");
625622
}
626623

627624
private void EmitPopulationImplForEnumerableWithAdd(EnumerableSpec type)
628625
{
629-
EmitCollectionCastIfRequired(type, out string objIdentifier);
626+
EmitCollectionCastIfRequired(type, out string instanceIdentifier);
630627

631628
Emit_Foreach_Section_In_ConfigChildren_StartBlock();
632629

@@ -638,22 +635,22 @@ private void EmitPopulationImplForEnumerableWithAdd(EnumerableSpec type)
638635
stringParsableType,
639636
Expression.sectionValue,
640637
Expression.sectionPath,
641-
(parsedValueExpr) => _writer.WriteLine($"{objIdentifier}.{Identifier.Add}({parsedValueExpr});"),
638+
(parsedValueExpr) => _writer.WriteLine($"{instanceIdentifier}.{Identifier.Add}({parsedValueExpr});"),
642639
checkForNullSectionValue: true,
643640
useIncrementalStringValueIdentifier: false);
644641
}
645642
else
646643
{
647644
EmitBindCoreCall(elementType, Identifier.value, Identifier.section, InitializationKind.Declaration);
648-
_writer.WriteLine($"{objIdentifier}.{Identifier.Add}({Identifier.value});");
645+
_writer.WriteLine($"{instanceIdentifier}.{Identifier.Add}({Identifier.value});");
649646
}
650647

651648
EmitEndBlock();
652649
}
653650

654651
private void EmitBindCoreImplForDictionary(DictionarySpec type)
655652
{
656-
EmitCollectionCastIfRequired(type, out string objIdentifier);
653+
EmitCollectionCastIfRequired(type, out string instanceIdentifier);
657654

658655
Emit_Foreach_Section_In_ConfigChildren_StartBlock();
659656

@@ -677,7 +674,7 @@ void Emit_BindAndAddLogic_ForElement(string parsedKeyExpr)
677674
stringParsableElementType,
678675
Expression.sectionValue,
679676
Expression.sectionPath,
680-
writeOnSuccess: parsedValueExpr => _writer.WriteLine($"{objIdentifier}[{parsedKeyExpr}] = {parsedValueExpr};"),
677+
writeOnSuccess: parsedValueExpr => _writer.WriteLine($"{instanceIdentifier}[{parsedKeyExpr}] = {parsedValueExpr};"),
681678
checkForNullSectionValue: true,
682679
useIncrementalStringValueIdentifier: false);
683680
}
@@ -696,7 +693,7 @@ void Emit_BindAndAddLogic_ForElement(string parsedKeyExpr)
696693
string expressionForElementIsNotNull = $"{Identifier.element} is not null";
697694
string elementTypeDisplayString = elementType.DisplayString + (elementType.IsValueType ? string.Empty : "?");
698695

699-
string expressionForElementExists = $"{objIdentifier}.{Identifier.TryGetValue}({parsedKeyExpr}, out {elementTypeDisplayString} {Identifier.element})";
696+
string expressionForElementExists = $"{instanceIdentifier}.{Identifier.TryGetValue}({parsedKeyExpr}, out {elementTypeDisplayString} {Identifier.element})";
700697
string conditionToUseExistingElement = expressionForElementExists;
701698

702699
// If key already exists, bind to existing element instance if not null (for ref types).
@@ -727,7 +724,7 @@ void Emit_BindAndAddLogic_ForElement(string parsedKeyExpr)
727724
}
728725

729726
EmitBindCoreCall(elementType, Identifier.element, Identifier.section, InitializationKind.None);
730-
_writer.WriteLine($"{objIdentifier}[{parsedKeyExpr}] = {Identifier.element};");
727+
_writer.WriteLine($"{instanceIdentifier}[{parsedKeyExpr}] = {Identifier.element};");
731728
}
732729
}
733730

@@ -747,7 +744,7 @@ private void EmitBindCoreImplForObject(ObjectSpec type)
747744
bool noSetter_And_IsReadonly = !property.CanSet && property.Type is CollectionSpec { InitializationStrategy: InitializationStrategy.ParameterizedConstructor };
748745
if (property.ShouldBind() && !noSetter_And_IsReadonly)
749746
{
750-
string containingTypeRef = property.IsStatic ? type.DisplayString : Identifier.obj;
747+
string containingTypeRef = property.IsStatic ? type.DisplayString : Identifier.instance;
751748
EmitBindImplForMember(
752749
property,
753750
memberAccessExpr: $"{containingTypeRef}.{property.Name}",
@@ -883,14 +880,14 @@ private void EmitBindCoreCallForMember(
883880
writeOnSuccess);
884881
}
885882

886-
private void EmitCollectionCastIfRequired(CollectionSpec type, out string objIdentifier)
883+
private void EmitCollectionCastIfRequired(CollectionSpec type, out string instanceIdentifier)
887884
{
888-
objIdentifier = Identifier.obj;
885+
instanceIdentifier = Identifier.instance;
889886
if (type.PopulationStrategy is CollectionPopulationStrategy.Cast_Then_Add)
890887
{
891-
objIdentifier = Identifier.temp;
888+
instanceIdentifier = Identifier.temp;
892889
_writer.WriteLine($$"""
893-
if ({{Identifier.obj}} is not {{type.PopulationCastType!.DisplayString}} {{objIdentifier}})
890+
if ({{Identifier.instance}} is not {{type.PopulationCastType!.DisplayString}} {{instanceIdentifier}})
894891
{
895892
return;
896893
}

src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Helpers/Emitter/Helpers.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ private static class TypeDisplayString
4545
private static class Identifier
4646
{
4747
public const string binderOptions = nameof(binderOptions);
48+
public const string config = nameof(config);
49+
public const string configureBinder = nameof(configureBinder);
4850
public const string configureOptions = nameof(configureOptions);
4951
public const string configuration = nameof(configuration);
5052
public const string configSectionPath = nameof(configSectionPath);
@@ -55,7 +57,7 @@ private static class Identifier
5557
public const string getPath = nameof(getPath);
5658
public const string key = nameof(key);
5759
public const string name = nameof(name);
58-
public const string obj = nameof(obj);
60+
public const string instance = nameof(instance);
5961
public const string optionsBuilder = nameof(optionsBuilder);
6062
public const string originalCount = nameof(originalCount);
6163
public const string section = nameof(section);
@@ -211,12 +213,16 @@ private void EmitBlankLineIfRequired()
211213
_emitBlankLineBeforeNextStatement = true;
212214
}
213215

214-
private void EmitCheckForNullArgument_WithBlankLine(string paramName)
216+
private void EmitCheckForNullArgument_WithBlankLine(string paramName, bool voidReturn = false)
215217
{
218+
string returnExpr = voidReturn
219+
? "return"
220+
: $"throw new ArgumentNullException(nameof({paramName}))";
221+
216222
_writer.WriteLine($$"""
217223
if ({{paramName}} is null)
218224
{
219-
throw new ArgumentNullException(nameof({{paramName}}));
225+
{{returnExpr}};
220226
}
221227
""");
222228

0 commit comments

Comments
 (0)