Browse Source

Fix #1279: Event fields in object initializers

pull/1285/head
Siegfried Pammer 7 years ago
parent
commit
6719dacabd
  1. 16
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.cs
  2. 56
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.il
  3. 39
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.il
  4. 40
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.roslyn.il
  5. 58
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.roslyn.il
  6. 2
      ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs

16
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.cs

@ -745,5 +745,21 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests @@ -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();
}
}
}

56
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.il

@ -2451,6 +2451,62 @@ @@ -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
{

39
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.il

@ -2102,6 +2102,45 @@ @@ -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
{

40
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.roslyn.il

@ -2192,6 +2192,42 @@ @@ -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 @@ @@ -2215,13 +2251,13 @@
.size 40
} // end of class '__StaticArrayInitTypeSize=40'
.field static assembly initonly valuetype '<PrivateImplementationDetails>'/'__StaticArrayInitTypeSize=40' E0D2592373A0C161E56E266306CD8405CD719D19 at I_00005108
.field static assembly initonly valuetype '<PrivateImplementationDetails>'/'__StaticArrayInitTypeSize=40' E0D2592373A0C161E56E266306CD8405CD719D19 at I_00005180
} // end of class '<PrivateImplementationDetails>'
// =============================================================
.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)

58
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.roslyn.il

@ -2497,6 +2497,60 @@ @@ -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 @@ @@ -2521,13 +2575,13 @@
.size 40
} // end of class '__StaticArrayInitTypeSize=40'
.field static assembly initonly valuetype '<PrivateImplementationDetails>'/'__StaticArrayInitTypeSize=40' E0D2592373A0C161E56E266306CD8405CD719D19 at I_000053BC
.field static assembly initonly valuetype '<PrivateImplementationDetails>'/'__StaticArrayInitTypeSize=40' E0D2592373A0C161E56E266306CD8405CD719D19 at I_0000545C
} // end of class '<PrivateImplementationDetails>'
// =============================================================
.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)

2
ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs

@ -338,7 +338,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -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;

Loading…
Cancel
Save