Skip to content

Commit 4f9fbcf

Browse files
authored
Fix binder gen nullability issue wrt binding ref type members (#89900)
1 parent c416966 commit 4f9fbcf

18 files changed

+48
-48
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ private void EmitBindCoreCall(
7373
string tempIdentifier = GetIncrementalIdentifier(Identifier.temp);
7474
if (initKind is InitializationKind.AssignmentWithNullCheck)
7575
{
76-
_writer.WriteLine($"{type.MinimalDisplayString} {tempIdentifier} = {memberAccessExpr};");
76+
Debug.Assert(!type.IsValueType);
77+
_writer.WriteLine($"{type.MinimalDisplayString}? {tempIdentifier} = {memberAccessExpr};");
7778
EmitBindCoreCall(tempIdentifier, InitializationKind.AssignmentWithNullCheck);
7879
}
7980
else if (initKind is InitializationKind.None && type.IsValueType)

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -837,14 +837,14 @@ private bool EmitBindImplForMember(
837837

838838
EmitStartBlock($"if ({sectionValidationCall} is {Identifier.IConfigurationSection} {sectionIdentifier})");
839839

840-
bool success = !EmitInitException(effectiveMemberType);
841-
if (success)
840+
bool canInit = !EmitInitException(effectiveMemberType);
841+
if (canInit)
842842
{
843843
EmitBindCoreCallForMember(member, memberAccessExpr, sectionIdentifier, canSet);
844844
}
845845

846846
EmitEndBlock();
847-
return success;
847+
return canInit;
848848
}
849849

850850
private void EmitBindCoreCallForMember(
@@ -856,8 +856,6 @@ private void EmitBindCoreCallForMember(
856856

857857
TypeSpec memberType = member.Type;
858858
TypeSpec effectiveMemberType = memberType.EffectiveType;
859-
string effectiveMemberTypeDisplayString = effectiveMemberType.MinimalDisplayString;
860-
bool canGet = member.CanGet;
861859

862860
string tempIdentifier = GetIncrementalIdentifier(Identifier.temp);
863861
InitializationKind initKind;
@@ -871,6 +869,7 @@ private void EmitBindCoreCallForMember(
871869
}
872870

873871
Debug.Assert(canSet);
872+
string effectiveMemberTypeDisplayString = effectiveMemberType.MinimalDisplayString;
874873
initKind = InitializationKind.None;
875874

876875
if (memberType.SpecKind is TypeSpecKind.Nullable)
@@ -889,7 +888,7 @@ private void EmitBindCoreCallForMember(
889888

890889
targetObjAccessExpr = tempIdentifier;
891890
}
892-
else if (canGet)
891+
else if (member.CanGet)
893892
{
894893
targetObjAccessExpr = memberAccessExpr;
895894
initKind = InitializationKind.AssignmentWithNullCheck;

src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ public class QueueNamespaces
605605
{
606606
public string Namespace { get; set; }
607607

608-
public Dictionary<string, QueueProperties> Queues { get; set; } = new();
608+
public Dictionary<string, QueueProperties>? Queues { get; set; } = new();
609609
}
610610

611611
public class QueueProperties

src/libraries/Microsoft.Extensions.Configuration.Binder/tests/SourceGenerationTests/Baselines/Collections.generated.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,31 +198,31 @@ namespace Microsoft.Extensions.Configuration.Binder.SourceGeneration
198198

199199
if (AsConfigWithChildren(configuration.GetSection("CustomDictionary")) is IConfigurationSection section1)
200200
{
201-
Program.CustomDictionary<string, int> temp3 = obj.CustomDictionary;
201+
Program.CustomDictionary<string, int>? temp3 = obj.CustomDictionary;
202202
temp3 ??= new Program.CustomDictionary<string, int>();
203203
BindCore(section1, ref temp3, binderOptions);
204204
obj.CustomDictionary = temp3;
205205
}
206206

207207
if (AsConfigWithChildren(configuration.GetSection("CustomList")) is IConfigurationSection section4)
208208
{
209-
Program.CustomList temp6 = obj.CustomList;
209+
Program.CustomList? temp6 = obj.CustomList;
210210
temp6 ??= new Program.CustomList();
211211
BindCore(section4, ref temp6, binderOptions);
212212
obj.CustomList = temp6;
213213
}
214214

215215
if (AsConfigWithChildren(configuration.GetSection("IReadOnlyList")) is IConfigurationSection section7)
216216
{
217-
IReadOnlyList<int> temp9 = obj.IReadOnlyList;
217+
IReadOnlyList<int>? temp9 = obj.IReadOnlyList;
218218
temp9 = temp9 is null ? new List<int>() : new List<int>(temp9);
219219
BindCore(section7, ref temp9, binderOptions);
220220
obj.IReadOnlyList = temp9;
221221
}
222222

223223
if (AsConfigWithChildren(configuration.GetSection("IReadOnlyDictionary")) is IConfigurationSection section10)
224224
{
225-
IReadOnlyDictionary<string, int> temp12 = obj.IReadOnlyDictionary;
225+
IReadOnlyDictionary<string, int>? temp12 = obj.IReadOnlyDictionary;
226226
temp12 = temp12 is null ? new Dictionary<string, int>() : temp12.ToDictionary(pair => pair.Key, pair => pair.Value);
227227
BindCore(section10, ref temp12, binderOptions);
228228
obj.IReadOnlyDictionary = temp12;

src/libraries/Microsoft.Extensions.Configuration.Binder/tests/SourceGenerationTests/Baselines/ConfigurationBinder/Bind.generated.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,23 +97,23 @@ namespace Microsoft.Extensions.Configuration.Binder.SourceGeneration
9797

9898
if (AsConfigWithChildren(configuration.GetSection("MyList")) is IConfigurationSection section2)
9999
{
100-
List<int> temp4 = obj.MyList;
100+
List<int>? temp4 = obj.MyList;
101101
temp4 ??= new List<int>();
102102
BindCore(section2, ref temp4, binderOptions);
103103
obj.MyList = temp4;
104104
}
105105

106106
if (AsConfigWithChildren(configuration.GetSection("MyDictionary")) is IConfigurationSection section5)
107107
{
108-
Dictionary<string, string> temp7 = obj.MyDictionary;
108+
Dictionary<string, string>? temp7 = obj.MyDictionary;
109109
temp7 ??= new Dictionary<string, string>();
110110
BindCore(section5, ref temp7, binderOptions);
111111
obj.MyDictionary = temp7;
112112
}
113113

114114
if (AsConfigWithChildren(configuration.GetSection("MyComplexDictionary")) is IConfigurationSection section8)
115115
{
116-
Dictionary<string, Program.MyClass2> temp10 = obj.MyComplexDictionary;
116+
Dictionary<string, Program.MyClass2>? temp10 = obj.MyComplexDictionary;
117117
temp10 ??= new Dictionary<string, Program.MyClass2>();
118118
BindCore(section8, ref temp10, binderOptions);
119119
obj.MyComplexDictionary = temp10;

src/libraries/Microsoft.Extensions.Configuration.Binder/tests/SourceGenerationTests/Baselines/ConfigurationBinder/Bind_Instance.generated.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,23 +91,23 @@ namespace Microsoft.Extensions.Configuration.Binder.SourceGeneration
9191

9292
if (AsConfigWithChildren(configuration.GetSection("MyList")) is IConfigurationSection section2)
9393
{
94-
List<int> temp4 = obj.MyList;
94+
List<int>? temp4 = obj.MyList;
9595
temp4 ??= new List<int>();
9696
BindCore(section2, ref temp4, binderOptions);
9797
obj.MyList = temp4;
9898
}
9999

100100
if (AsConfigWithChildren(configuration.GetSection("MyDictionary")) is IConfigurationSection section5)
101101
{
102-
Dictionary<string, string> temp7 = obj.MyDictionary;
102+
Dictionary<string, string>? temp7 = obj.MyDictionary;
103103
temp7 ??= new Dictionary<string, string>();
104104
BindCore(section5, ref temp7, binderOptions);
105105
obj.MyDictionary = temp7;
106106
}
107107

108108
if (AsConfigWithChildren(configuration.GetSection("MyComplexDictionary")) is IConfigurationSection section8)
109109
{
110-
Dictionary<string, Program.MyClass2> temp10 = obj.MyComplexDictionary;
110+
Dictionary<string, Program.MyClass2>? temp10 = obj.MyComplexDictionary;
111111
temp10 ??= new Dictionary<string, Program.MyClass2>();
112112
BindCore(section8, ref temp10, binderOptions);
113113
obj.MyComplexDictionary = temp10;

src/libraries/Microsoft.Extensions.Configuration.Binder/tests/SourceGenerationTests/Baselines/ConfigurationBinder/Bind_Instance_BinderOptions.generated.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,23 +91,23 @@ namespace Microsoft.Extensions.Configuration.Binder.SourceGeneration
9191

9292
if (AsConfigWithChildren(configuration.GetSection("MyList")) is IConfigurationSection section2)
9393
{
94-
List<int> temp4 = obj.MyList;
94+
List<int>? temp4 = obj.MyList;
9595
temp4 ??= new List<int>();
9696
BindCore(section2, ref temp4, binderOptions);
9797
obj.MyList = temp4;
9898
}
9999

100100
if (AsConfigWithChildren(configuration.GetSection("MyDictionary")) is IConfigurationSection section5)
101101
{
102-
Dictionary<string, string> temp7 = obj.MyDictionary;
102+
Dictionary<string, string>? temp7 = obj.MyDictionary;
103103
temp7 ??= new Dictionary<string, string>();
104104
BindCore(section5, ref temp7, binderOptions);
105105
obj.MyDictionary = temp7;
106106
}
107107

108108
if (AsConfigWithChildren(configuration.GetSection("MyComplexDictionary")) is IConfigurationSection section8)
109109
{
110-
Dictionary<string, Program.MyClass2> temp10 = obj.MyComplexDictionary;
110+
Dictionary<string, Program.MyClass2>? temp10 = obj.MyComplexDictionary;
111111
temp10 ??= new Dictionary<string, Program.MyClass2>();
112112
BindCore(section8, ref temp10, binderOptions);
113113
obj.MyComplexDictionary = temp10;

src/libraries/Microsoft.Extensions.Configuration.Binder/tests/SourceGenerationTests/Baselines/ConfigurationBinder/Bind_Key_Instance.generated.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,23 +91,23 @@ namespace Microsoft.Extensions.Configuration.Binder.SourceGeneration
9191

9292
if (AsConfigWithChildren(configuration.GetSection("MyList")) is IConfigurationSection section2)
9393
{
94-
List<int> temp4 = obj.MyList;
94+
List<int>? temp4 = obj.MyList;
9595
temp4 ??= new List<int>();
9696
BindCore(section2, ref temp4, binderOptions);
9797
obj.MyList = temp4;
9898
}
9999

100100
if (AsConfigWithChildren(configuration.GetSection("MyDictionary")) is IConfigurationSection section5)
101101
{
102-
Dictionary<string, string> temp7 = obj.MyDictionary;
102+
Dictionary<string, string>? temp7 = obj.MyDictionary;
103103
temp7 ??= new Dictionary<string, string>();
104104
BindCore(section5, ref temp7, binderOptions);
105105
obj.MyDictionary = temp7;
106106
}
107107

108108
if (AsConfigWithChildren(configuration.GetSection("MyComplexDictionary")) is IConfigurationSection section8)
109109
{
110-
Dictionary<string, Program.MyClass2> temp10 = obj.MyComplexDictionary;
110+
Dictionary<string, Program.MyClass2>? temp10 = obj.MyComplexDictionary;
111111
temp10 ??= new Dictionary<string, Program.MyClass2>();
112112
BindCore(section8, ref temp10, binderOptions);
113113
obj.MyComplexDictionary = temp10;

src/libraries/Microsoft.Extensions.Configuration.Binder/tests/SourceGenerationTests/Baselines/ConfigurationBinder/Get.generated.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,23 +129,23 @@ namespace Microsoft.Extensions.Configuration.Binder.SourceGeneration
129129

130130
if (AsConfigWithChildren(configuration.GetSection("MyList")) is IConfigurationSection section6)
131131
{
132-
List<int> temp8 = obj.MyList;
132+
List<int>? temp8 = obj.MyList;
133133
temp8 ??= new List<int>();
134134
BindCore(section6, ref temp8, binderOptions);
135135
obj.MyList = temp8;
136136
}
137137

138138
if (AsConfigWithChildren(configuration.GetSection("MyArray")) is IConfigurationSection section9)
139139
{
140-
int[] temp11 = obj.MyArray;
140+
int[]? temp11 = obj.MyArray;
141141
temp11 ??= new int[0];
142142
BindCore(section9, ref temp11, binderOptions);
143143
obj.MyArray = temp11;
144144
}
145145

146146
if (AsConfigWithChildren(configuration.GetSection("MyDictionary")) is IConfigurationSection section12)
147147
{
148-
Dictionary<string, string> temp14 = obj.MyDictionary;
148+
Dictionary<string, string>? temp14 = obj.MyDictionary;
149149
temp14 ??= new Dictionary<string, string>();
150150
BindCore(section12, ref temp14, binderOptions);
151151
obj.MyDictionary = temp14;

src/libraries/Microsoft.Extensions.Configuration.Binder/tests/SourceGenerationTests/Baselines/ConfigurationBinder/Get_T.generated.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,23 +112,23 @@ namespace Microsoft.Extensions.Configuration.Binder.SourceGeneration
112112

113113
if (AsConfigWithChildren(configuration.GetSection("MyList")) is IConfigurationSection section5)
114114
{
115-
List<int> temp7 = obj.MyList;
115+
List<int>? temp7 = obj.MyList;
116116
temp7 ??= new List<int>();
117117
BindCore(section5, ref temp7, binderOptions);
118118
obj.MyList = temp7;
119119
}
120120

121121
if (AsConfigWithChildren(configuration.GetSection("MyArray")) is IConfigurationSection section8)
122122
{
123-
int[] temp10 = obj.MyArray;
123+
int[]? temp10 = obj.MyArray;
124124
temp10 ??= new int[0];
125125
BindCore(section8, ref temp10, binderOptions);
126126
obj.MyArray = temp10;
127127
}
128128

129129
if (AsConfigWithChildren(configuration.GetSection("MyDictionary")) is IConfigurationSection section11)
130130
{
131-
Dictionary<string, string> temp13 = obj.MyDictionary;
131+
Dictionary<string, string>? temp13 = obj.MyDictionary;
132132
temp13 ??= new Dictionary<string, string>();
133133
BindCore(section11, ref temp13, binderOptions);
134134
obj.MyDictionary = temp13;

0 commit comments

Comments
 (0)