diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.cs b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.cs index e1a6b855b..f20190a4e 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.cs +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.cs @@ -745,5 +745,21 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests Value6 = otherItem.Nullable4.ToString() }); } + + private Data Issue1279(int p) + { + if (p == 1) { + Data data = new Data(); + data.a = MyEnum.a; + data.TestEvent += Data_TestEvent; + return data; + } + return null; + } + + private void Data_TestEvent(object sender, EventArgs e) + { + throw new NotImplementedException(); + } } } \ No newline at end of file diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.il b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.il index 670e3a91f..58883c4d2 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.il @@ -2451,6 +2451,62 @@ IL_00a1: ret } // end of method TestCases::Issue1251_Test + .method private hidebysig instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data + Issue1279(int32 p) cil managed + { + // Code size 56 (0x38) + .maxstack 3 + .locals init (class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data V_0, + class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data V_1, + bool V_2) + IL_0000: nop + IL_0001: ldarg.1 + IL_0002: ldc.i4.1 + IL_0003: ceq + IL_0005: ldc.i4.0 + IL_0006: ceq + IL_0008: stloc.2 + IL_0009: ldloc.2 + IL_000a: brtrue.s IL_0032 + + IL_000c: nop + IL_000d: newobj instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data::.ctor() + IL_0012: stloc.0 + IL_0013: ldloc.0 + IL_0014: ldc.i4.0 + IL_0015: callvirt instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data::set_a(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/MyEnum) + IL_001a: nop + IL_001b: ldloc.0 + IL_001c: ldarg.0 + IL_001d: ldftn instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases::Data_TestEvent(object, + class [mscorlib]System.EventArgs) + IL_0023: newobj instance void [mscorlib]System.EventHandler::.ctor(object, + native int) + IL_0028: callvirt instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data::add_TestEvent(class [mscorlib]System.EventHandler) + IL_002d: nop + IL_002e: ldloc.0 + IL_002f: stloc.1 + IL_0030: br.s IL_0036 + + IL_0032: ldnull + IL_0033: stloc.1 + IL_0034: br.s IL_0036 + + IL_0036: ldloc.1 + IL_0037: ret + } // end of method TestCases::Issue1279 + + .method private hidebysig instance void + Data_TestEvent(object sender, + class [mscorlib]System.EventArgs e) cil managed + { + // Code size 7 (0x7) + .maxstack 8 + IL_0000: nop + IL_0001: newobj instance void [mscorlib]System.NotImplementedException::.ctor() + IL_0006: throw + } // end of method TestCases::Data_TestEvent + .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.il b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.il index 4caf6ced4..2ef6a16d9 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.il @@ -2102,6 +2102,45 @@ IL_0099: ret } // end of method TestCases::Issue1251_Test + .method private hidebysig instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data + Issue1279(int32 p) cil managed + { + // Code size 39 (0x27) + .maxstack 3 + .locals init (class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data V_0) + IL_0000: ldarg.1 + IL_0001: ldc.i4.1 + IL_0002: bne.un.s IL_0025 + + IL_0004: newobj instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data::.ctor() + IL_0009: stloc.0 + IL_000a: ldloc.0 + IL_000b: ldc.i4.0 + IL_000c: callvirt instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data::set_a(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/MyEnum) + IL_0011: ldloc.0 + IL_0012: ldarg.0 + IL_0013: ldftn instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases::Data_TestEvent(object, + class [mscorlib]System.EventArgs) + IL_0019: newobj instance void [mscorlib]System.EventHandler::.ctor(object, + native int) + IL_001e: callvirt instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data::add_TestEvent(class [mscorlib]System.EventHandler) + IL_0023: ldloc.0 + IL_0024: ret + + IL_0025: ldnull + IL_0026: ret + } // end of method TestCases::Issue1279 + + .method private hidebysig instance void + Data_TestEvent(object sender, + class [mscorlib]System.EventArgs e) cil managed + { + // Code size 6 (0x6) + .maxstack 8 + IL_0000: newobj instance void [mscorlib]System.NotImplementedException::.ctor() + IL_0005: throw + } // end of method TestCases::Data_TestEvent + .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.roslyn.il b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.roslyn.il index 4cb7f471b..c4626b3f0 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.roslyn.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.roslyn.il @@ -2192,6 +2192,42 @@ IL_0096: ret } // end of method TestCases::Issue1251_Test + .method private hidebysig instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data + Issue1279(int32 p) cil managed + { + // Code size 37 (0x25) + .maxstack 8 + IL_0000: ldarg.1 + IL_0001: ldc.i4.1 + IL_0002: bne.un.s IL_0023 + + IL_0004: newobj instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data::.ctor() + IL_0009: dup + IL_000a: ldc.i4.0 + IL_000b: callvirt instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data::set_a(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/MyEnum) + IL_0010: dup + IL_0011: ldarg.0 + IL_0012: ldftn instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases::Data_TestEvent(object, + class [mscorlib]System.EventArgs) + IL_0018: newobj instance void [mscorlib]System.EventHandler::.ctor(object, + native int) + IL_001d: callvirt instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data::add_TestEvent(class [mscorlib]System.EventHandler) + IL_0022: ret + + IL_0023: ldnull + IL_0024: ret + } // end of method TestCases::Issue1279 + + .method private hidebysig instance void + Data_TestEvent(object sender, + class [mscorlib]System.EventArgs e) cil managed + { + // Code size 6 (0x6) + .maxstack 8 + IL_0000: newobj instance void [mscorlib]System.NotImplementedException::.ctor() + IL_0005: throw + } // end of method TestCases::Data_TestEvent + .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { @@ -2215,13 +2251,13 @@ .size 40 } // end of class '__StaticArrayInitTypeSize=40' - .field static assembly initonly valuetype ''/'__StaticArrayInitTypeSize=40' E0D2592373A0C161E56E266306CD8405CD719D19 at I_00005108 + .field static assembly initonly valuetype ''/'__StaticArrayInitTypeSize=40' E0D2592373A0C161E56E266306CD8405CD719D19 at I_00005180 } // end of class '' // ============================================================= -.data cil I_00005108 = bytearray ( +.data cil I_00005180 = bytearray ( 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 00 09 00 00 00 0A 00 00 00) diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.roslyn.il b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.roslyn.il index 44fb306fe..3cbba69e2 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.roslyn.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.roslyn.il @@ -2497,6 +2497,60 @@ IL_009f: ret } // end of method TestCases::Issue1251_Test + .method private hidebysig instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data + Issue1279(int32 p) cil managed + { + // Code size 53 (0x35) + .maxstack 3 + .locals init (bool V_0, + class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data V_1, + class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data V_2) + IL_0000: nop + IL_0001: ldarg.1 + IL_0002: ldc.i4.1 + IL_0003: ceq + IL_0005: stloc.0 + IL_0006: ldloc.0 + IL_0007: brfalse.s IL_002f + + IL_0009: nop + IL_000a: newobj instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data::.ctor() + IL_000f: stloc.1 + IL_0010: ldloc.1 + IL_0011: ldc.i4.0 + IL_0012: callvirt instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data::set_a(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/MyEnum) + IL_0017: nop + IL_0018: ldloc.1 + IL_0019: ldarg.0 + IL_001a: ldftn instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases::Data_TestEvent(object, + class [mscorlib]System.EventArgs) + IL_0020: newobj instance void [mscorlib]System.EventHandler::.ctor(object, + native int) + IL_0025: callvirt instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests.TestCases/Data::add_TestEvent(class [mscorlib]System.EventHandler) + IL_002a: nop + IL_002b: ldloc.1 + IL_002c: stloc.2 + IL_002d: br.s IL_0033 + + IL_002f: ldnull + IL_0030: stloc.2 + IL_0031: br.s IL_0033 + + IL_0033: ldloc.2 + IL_0034: ret + } // end of method TestCases::Issue1279 + + .method private hidebysig instance void + Data_TestEvent(object sender, + class [mscorlib]System.EventArgs e) cil managed + { + // Code size 7 (0x7) + .maxstack 8 + IL_0000: nop + IL_0001: newobj instance void [mscorlib]System.NotImplementedException::.ctor() + IL_0006: throw + } // end of method TestCases::Data_TestEvent + .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { @@ -2521,13 +2575,13 @@ .size 40 } // end of class '__StaticArrayInitTypeSize=40' - .field static assembly initonly valuetype ''/'__StaticArrayInitTypeSize=40' E0D2592373A0C161E56E266306CD8405CD719D19 at I_000053BC + .field static assembly initonly valuetype ''/'__StaticArrayInitTypeSize=40' E0D2592373A0C161E56E266306CD8405CD719D19 at I_0000545C } // end of class '' // ============================================================= -.data cil I_000053BC = bytearray ( +.data cil I_0000545C = bytearray ( 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 00 09 00 00 00 0A 00 00 00) diff --git a/ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs b/ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs index 6fc0f22da..22f783e02 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs @@ -338,7 +338,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms { if (method.IsStatic && !method.IsExtensionMethod) return false; - if (method.IsAccessor) + if (method.AccessorOwner is IProperty) return true; if (!"Add".Equals(method.Name, StringComparison.Ordinal) || arguments.Count == 0) return false;