Skip to content

Commit 52ab133

Browse files
Add E&C tests at the compiler layer for auto-props with field keyword
1 parent 2bbb5b5 commit 52ab133

File tree

1 file changed

+266
-11
lines changed

1 file changed

+266
-11
lines changed

src/Compilers/CSharp/Test/Emit2/Emit/EditAndContinue/EditAndContinueTests.cs

Lines changed: 266 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4128,6 +4128,7 @@ class C
41284128
validator: g =>
41294129
{
41304130
g.VerifyTypeDefNames("<Module>", "C");
4131+
g.VerifyFieldDefNames();
41314132
g.VerifyMethodDefNames("get_P", "set_P", ".ctor");
41324133
})
41334134

@@ -4137,15 +4138,16 @@ class C
41374138
{
41384139
}
41394140
""",
4140-
edits: new[]
4141-
{
4141+
edits:
4142+
[
41424143
Edit(SemanticEditKind.Delete, c => c.GetMember("C.get_P"), newSymbolProvider: c => c.GetMember("C")),
41434144
Edit(SemanticEditKind.Delete, c => c.GetMember("C.set_P"), newSymbolProvider: c => c.GetMember("C")),
41444145
Edit(SemanticEditKind.Delete, c => c.GetMember("C.P"), newSymbolProvider: c => c.GetMember("C")),
4145-
},
4146+
],
41464147
validator: g =>
41474148
{
41484149
g.VerifyTypeDefNames("HotReloadException");
4150+
g.VerifyFieldDefNames("Code");
41494151
g.VerifyMethodDefNames("get_P", "set_P", ".ctor");
41504152

41514153
// Set the property name to "_deleted"
@@ -4202,16 +4204,17 @@ class C
42024204
public string P { get; set; }
42034205
}
42044206
""",
4205-
edits: new[] {
4207+
edits: [
42064208
Edit(SemanticEditKind.Insert, symbolProvider: c => c.GetMember("C.P")),
4207-
},
4209+
],
42084210
validator: g =>
42094211
{
42104212
g.VerifyTypeDefNames();
4213+
g.VerifyFieldDefNames("<P>k__BackingField");
42114214
g.VerifyMethodDefNames("get_P", "set_P");
42124215
g.VerifyMemberRefNames(".ctor", ".ctor");
4213-
g.VerifyEncLogDefinitions(new[]
4214-
{
4216+
g.VerifyEncLogDefinitions(
4217+
[
42154218
Row(2, TableIndex.TypeDef, EditAndContinueOperation.AddField),
42164219
Row(2, TableIndex.Field, EditAndContinueOperation.Default),
42174220
Row(1, TableIndex.MethodDef, EditAndContinueOperation.Default),
@@ -4224,9 +4227,9 @@ class C
42244227
Row(8, TableIndex.CustomAttribute, EditAndContinueOperation.Default),
42254228
Row(3, TableIndex.MethodSemantics, EditAndContinueOperation.Default),
42264229
Row(4, TableIndex.MethodSemantics, EditAndContinueOperation.Default)
4227-
});
4228-
g.VerifyEncMapDefinitions(new[]
4229-
{
4230+
]);
4231+
g.VerifyEncMapDefinitions(
4232+
[
42304233
Handle(2, TableIndex.Field),
42314234
Handle(1, TableIndex.MethodDef),
42324235
Handle(2, TableIndex.MethodDef),
@@ -4238,7 +4241,7 @@ class C
42384241
Handle(1, TableIndex.Property),
42394242
Handle(3, TableIndex.MethodSemantics),
42404243
Handle(4, TableIndex.MethodSemantics)
4241-
});
4244+
]);
42424245

42434246
var expectedIL = """
42444247
{
@@ -4539,6 +4542,258 @@ .maxstack 8
45394542
.Verify();
45404543
}
45414544

4545+
[Fact]
4546+
public void Property_ChangeToAutoProp()
4547+
{
4548+
using var _ = new EditAndContinueTest()
4549+
.AddBaseline(
4550+
source: $$"""
4551+
class C
4552+
{
4553+
public string P { get { return "1"; } set { } }
4554+
}
4555+
""",
4556+
validator: g =>
4557+
{
4558+
g.VerifyTypeDefNames("<Module>", "C");
4559+
g.VerifyFieldDefNames();
4560+
g.VerifyMethodDefNames("get_P", "set_P", ".ctor");
4561+
})
4562+
4563+
.AddGeneration(
4564+
source: """
4565+
class C
4566+
{
4567+
public string P { get; set; }
4568+
}
4569+
""",
4570+
edits: [
4571+
Edit(SemanticEditKind.Insert, symbolProvider: c => c.GetMember("C.P")),
4572+
],
4573+
validator: g =>
4574+
{
4575+
g.VerifyTypeDefNames();
4576+
g.VerifyFieldDefNames("<P>k__BackingField");
4577+
g.VerifyMethodDefNames("get_P", "set_P");
4578+
g.VerifyMemberRefNames(".ctor", ".ctor");
4579+
g.VerifyEncLogDefinitions(
4580+
[
4581+
Row(2, TableIndex.TypeDef, EditAndContinueOperation.AddField),
4582+
Row(1, TableIndex.Field, EditAndContinueOperation.Default),
4583+
Row(1, TableIndex.MethodDef, EditAndContinueOperation.Default),
4584+
Row(2, TableIndex.MethodDef, EditAndContinueOperation.Default),
4585+
Row(1, TableIndex.Property, EditAndContinueOperation.Default),
4586+
Row(1, TableIndex.Param, EditAndContinueOperation.Default),
4587+
Row(4, TableIndex.CustomAttribute, EditAndContinueOperation.Default),
4588+
Row(5, TableIndex.CustomAttribute, EditAndContinueOperation.Default),
4589+
Row(6, TableIndex.CustomAttribute, EditAndContinueOperation.Default),
4590+
Row(7, TableIndex.CustomAttribute, EditAndContinueOperation.Default),
4591+
Row(3, TableIndex.MethodSemantics, EditAndContinueOperation.Default),
4592+
Row(4, TableIndex.MethodSemantics, EditAndContinueOperation.Default)
4593+
]);
4594+
g.VerifyEncMapDefinitions(
4595+
[
4596+
Handle(1, TableIndex.Field),
4597+
Handle(1, TableIndex.MethodDef),
4598+
Handle(2, TableIndex.MethodDef),
4599+
Handle(1, TableIndex.Param),
4600+
Handle(4, TableIndex.CustomAttribute),
4601+
Handle(5, TableIndex.CustomAttribute),
4602+
Handle(6, TableIndex.CustomAttribute),
4603+
Handle(7, TableIndex.CustomAttribute),
4604+
Handle(1, TableIndex.Property),
4605+
Handle(3, TableIndex.MethodSemantics),
4606+
Handle(4, TableIndex.MethodSemantics)
4607+
]);
4608+
4609+
var expectedIL = """
4610+
{
4611+
// Code size 7 (0x7)
4612+
.maxstack 8
4613+
IL_0000: ldarg.0
4614+
IL_0001: ldfld 0x04000001
4615+
IL_0006: ret
4616+
}
4617+
{
4618+
// Code size 8 (0x8)
4619+
.maxstack 8
4620+
IL_0000: ldarg.0
4621+
IL_0001: ldarg.1
4622+
IL_0002: stfld 0x04000001
4623+
IL_0007: ret
4624+
}
4625+
""";
4626+
4627+
g.VerifyIL(expectedIL);
4628+
})
4629+
.Verify();
4630+
}
4631+
4632+
[Fact]
4633+
public void Property_ChangeToAutoProp_FieldAccess()
4634+
{
4635+
using var _ = new EditAndContinueTest(parseOptions: TestOptions.RegularPreview.WithNoRefSafetyRulesAttribute())
4636+
.AddBaseline(
4637+
source: $$"""
4638+
class C
4639+
{
4640+
public string P { get { return "1"; } set { } }
4641+
}
4642+
""",
4643+
validator: g =>
4644+
{
4645+
g.VerifyTypeDefNames("<Module>", "C");
4646+
g.VerifyFieldDefNames();
4647+
g.VerifyMethodDefNames("get_P", "set_P", ".ctor");
4648+
})
4649+
4650+
.AddGeneration(
4651+
source: """
4652+
class C
4653+
{
4654+
public string P { get; set => field = value; }
4655+
}
4656+
""",
4657+
edits: [
4658+
Edit(SemanticEditKind.Insert, symbolProvider: c => c.GetMember("C.P")),
4659+
],
4660+
validator: g =>
4661+
{
4662+
g.VerifyTypeDefNames();
4663+
g.VerifyFieldDefNames("<P>k__BackingField");
4664+
g.VerifyMethodDefNames("get_P", "set_P");
4665+
g.VerifyMemberRefNames(".ctor", ".ctor");
4666+
g.VerifyEncLogDefinitions(
4667+
[
4668+
Row(2, TableIndex.TypeDef, EditAndContinueOperation.AddField),
4669+
Row(1, TableIndex.Field, EditAndContinueOperation.Default),
4670+
Row(1, TableIndex.MethodDef, EditAndContinueOperation.Default),
4671+
Row(2, TableIndex.MethodDef, EditAndContinueOperation.Default),
4672+
Row(1, TableIndex.Property, EditAndContinueOperation.Default),
4673+
Row(1, TableIndex.Param, EditAndContinueOperation.Default),
4674+
Row(4, TableIndex.CustomAttribute, EditAndContinueOperation.Default),
4675+
Row(5, TableIndex.CustomAttribute, EditAndContinueOperation.Default),
4676+
Row(6, TableIndex.CustomAttribute, EditAndContinueOperation.Default),
4677+
Row(3, TableIndex.MethodSemantics, EditAndContinueOperation.Default),
4678+
Row(4, TableIndex.MethodSemantics, EditAndContinueOperation.Default)
4679+
]);
4680+
g.VerifyEncMapDefinitions(
4681+
[
4682+
Handle(1, TableIndex.Field),
4683+
Handle(1, TableIndex.MethodDef),
4684+
Handle(2, TableIndex.MethodDef),
4685+
Handle(1, TableIndex.Param),
4686+
Handle(4, TableIndex.CustomAttribute),
4687+
Handle(5, TableIndex.CustomAttribute),
4688+
Handle(6, TableIndex.CustomAttribute),
4689+
Handle(1, TableIndex.Property),
4690+
Handle(3, TableIndex.MethodSemantics),
4691+
Handle(4, TableIndex.MethodSemantics)
4692+
]);
4693+
4694+
var expectedIL = """
4695+
{
4696+
// Code size 7 (0x7)
4697+
.maxstack 8
4698+
IL_0000: ldarg.0
4699+
IL_0001: ldfld 0x04000001
4700+
IL_0006: ret
4701+
}
4702+
{
4703+
// Code size 8 (0x8)
4704+
.maxstack 8
4705+
IL_0000: ldarg.0
4706+
IL_0001: ldarg.1
4707+
IL_0002: stfld 0x04000001
4708+
IL_0007: ret
4709+
}
4710+
""";
4711+
4712+
g.VerifyIL(expectedIL);
4713+
})
4714+
.Verify();
4715+
}
4716+
4717+
[Fact]
4718+
public void Property_AutoProp_AddFieldAccess()
4719+
{
4720+
using var _ = new EditAndContinueTest(parseOptions: TestOptions.RegularPreview.WithNoRefSafetyRulesAttribute())
4721+
.AddBaseline(
4722+
source: $$"""
4723+
class C
4724+
{
4725+
public string P { get; set; }
4726+
}
4727+
""",
4728+
validator: g =>
4729+
{
4730+
g.VerifyTypeDefNames("<Module>", "C");
4731+
g.VerifyFieldDefNames("<P>k__BackingField");
4732+
g.VerifyMethodDefNames("get_P", "set_P", ".ctor");
4733+
})
4734+
4735+
.AddGeneration(
4736+
source: """
4737+
class C
4738+
{
4739+
public string P { get; set => field = value; }
4740+
}
4741+
""",
4742+
edits: [
4743+
Edit(SemanticEditKind.Insert, symbolProvider: c => c.GetMember("C.P")),
4744+
],
4745+
validator: g =>
4746+
{
4747+
g.VerifyTypeDefNames();
4748+
g.VerifyFieldDefNames();
4749+
g.VerifyMethodDefNames("get_P", "set_P");
4750+
g.VerifyMemberRefNames(".ctor", ".ctor");
4751+
g.VerifyEncLogDefinitions(
4752+
[
4753+
Row(1, TableIndex.MethodDef, EditAndContinueOperation.Default),
4754+
Row(2, TableIndex.MethodDef, EditAndContinueOperation.Default),
4755+
Row(1, TableIndex.Property, EditAndContinueOperation.Default),
4756+
Row(1, TableIndex.Param, EditAndContinueOperation.Default),
4757+
Row(1, TableIndex.CustomAttribute, EditAndContinueOperation.Default),
4758+
Row(7, TableIndex.CustomAttribute, EditAndContinueOperation.Default),
4759+
Row(3, TableIndex.MethodSemantics, EditAndContinueOperation.Default),
4760+
Row(4, TableIndex.MethodSemantics, EditAndContinueOperation.Default)
4761+
]);
4762+
g.VerifyEncMapDefinitions(
4763+
[
4764+
Handle(1, TableIndex.MethodDef),
4765+
Handle(2, TableIndex.MethodDef),
4766+
Handle(1, TableIndex.Param),
4767+
Handle(1, TableIndex.CustomAttribute),
4768+
Handle(7, TableIndex.CustomAttribute),
4769+
Handle(1, TableIndex.Property),
4770+
Handle(3, TableIndex.MethodSemantics),
4771+
Handle(4, TableIndex.MethodSemantics)
4772+
]);
4773+
4774+
var expectedIL = """
4775+
{
4776+
// Code size 7 (0x7)
4777+
.maxstack 8
4778+
IL_0000: ldarg.0
4779+
IL_0001: ldfld 0x04000001
4780+
IL_0006: ret
4781+
}
4782+
{
4783+
// Code size 8 (0x8)
4784+
.maxstack 8
4785+
IL_0000: ldarg.0
4786+
IL_0001: ldarg.1
4787+
IL_0002: stfld 0x04000001
4788+
IL_0007: ret
4789+
}
4790+
""";
4791+
4792+
g.VerifyIL(expectedIL);
4793+
})
4794+
.Verify();
4795+
}
4796+
45424797
[Fact]
45434798
public void Property_ChangeReturnType()
45444799
{

0 commit comments

Comments
 (0)