Browse Source

Add an option to not transform `Activator.CreateInstance<T>()` to `new T()`

pull/3497/head
DoctorKrolic 4 days ago
parent
commit
caea72824d
  1. 2
      ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj
  2. 17
      ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.Expected.cs
  3. 15
      ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.cs
  4. 108
      ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.il
  5. 186
      ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.net40.roslyn.il
  6. 96
      ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.opt.il
  7. 167
      ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.opt.net40.roslyn.il
  8. 79
      ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.opt.roslyn.il
  9. 92
      ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.roslyn.il
  10. 6
      ICSharpCode.Decompiler.Tests/UglyTestRunner.cs
  11. 5
      ICSharpCode.Decompiler/CSharp/Transforms/ReplaceMethodCallsWithOperators.cs
  12. 23
      ICSharpCode.Decompiler/DecompilerSettings.cs

2
ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj

@ -145,6 +145,8 @@ @@ -145,6 +145,8 @@
<Compile Include="TestCases\Pretty\Issue3442.cs" />
<Compile Include="TestCases\Pretty\Issue3483.cs" />
<Compile Include="TestCases\Pretty\PointerArithmetic.cs" />
<Compile Include="TestCases\Ugly\NoGenericTypeInstantiation.cs" />
<None Include="TestCases\Ugly\NoGenericTypeInstantiation.Expected.cs" />
<None Include="TestCases\VBPretty\VBAutomaticEvents.vb" />
<Compile Include="TestCases\VBPretty\VBAutomaticEvents.cs" />
<Compile Include="TestCases\VBPretty\VBNonGenericForEach.cs" />

17
ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.Expected.cs

@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
using System;
namespace ICSharpCode.Decompiler.Tests.TestCases.Ugly
{
internal class NoGenericTypeInstantiation<TOnType> where TOnType : new()
{
public static TOnType CreateTOnType()
{
return Activator.CreateInstance<TOnType>();
}
public static TOnMethod CreateTOnMethod<TOnMethod>() where TOnMethod : new()
{
return Activator.CreateInstance<TOnMethod>();
}
}
}

15
ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.cs

@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
namespace ICSharpCode.Decompiler.Tests.TestCases.Ugly
{
internal class NoGenericTypeInstantiation<TOnType> where TOnType : new()
{
public static TOnType CreateTOnType()
{
return new TOnType();
}
public static TOnMethod CreateTOnMethod<TOnMethod>() where TOnMethod : new()
{
return new TOnMethod();
}
}
}

108
ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.il

@ -0,0 +1,108 @@ @@ -0,0 +1,108 @@
// .NET IL Disassembler. Version 9.0.4
// Metadata version: v4.0.30319
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
.assembly tmppi3wbt
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
.permissionset reqmin
= {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}}
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module tmppi3wbt.tmp
// MVID: {4130db71-37be-40af-9724-d988f7189866}
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// =============== CLASS MEMBERS DECLARATION ===================
.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1<.ctor TOnType>
extends [mscorlib]System.Object
{
.method public hidebysig static !TOnType
CreateTOnType() cil managed
{
// Code size 39 (0x27)
.maxstack 1
.locals init (!TOnType V_0,
!TOnType V_1)
IL_0000: nop
IL_0001: ldloca.s V_1
IL_0003: initobj !TOnType
IL_0009: ldloc.1
IL_000a: box !TOnType
IL_000f: brfalse.s IL_001c
IL_0011: ldloca.s V_1
IL_0013: initobj !TOnType
IL_0019: ldloc.1
IL_001a: br.s IL_0021
IL_001c: call !!0 [mscorlib]System.Activator::CreateInstance<!TOnType>()
IL_0021: nop
IL_0022: stloc.0
IL_0023: br.s IL_0025
IL_0025: ldloc.0
IL_0026: ret
} // end of method NoGenericTypeInstantiation`1::CreateTOnType
.method public hidebysig static !!TOnMethod
CreateTOnMethod<.ctor TOnMethod>() cil managed
{
// Code size 39 (0x27)
.maxstack 1
.locals init (!!TOnMethod V_0,
!!TOnMethod V_1)
IL_0000: nop
IL_0001: ldloca.s V_1
IL_0003: initobj !!TOnMethod
IL_0009: ldloc.1
IL_000a: box !!TOnMethod
IL_000f: brfalse.s IL_001c
IL_0011: ldloca.s V_1
IL_0013: initobj !!TOnMethod
IL_0019: ldloc.1
IL_001a: br.s IL_0021
IL_001c: call !!0 [mscorlib]System.Activator::CreateInstance<!!0>()
IL_0021: nop
IL_0022: stloc.0
IL_0023: br.s IL_0025
IL_0025: ldloc.0
IL_0026: ret
} // end of method NoGenericTypeInstantiation`1::CreateTOnMethod
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method NoGenericTypeInstantiation`1::.ctor
} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1
// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************

186
ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.net40.roslyn.il

@ -0,0 +1,186 @@ @@ -0,0 +1,186 @@
// .NET IL Disassembler. Version 9.0.4
// Metadata version: v4.0.30319
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
.assembly tmphku2gd
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 07 01 00 00 00 00 )
.permissionset reqmin
= {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}}
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module tmphku2gd.tmp
// MVID: {1307db53-f6c4-45d3-a995-8cb116ea8821}
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void System.Runtime.CompilerServices.RefSafetyRulesAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 )
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// =============== CLASS MEMBERS DECLARATION ===================
.class private auto ansi sealed beforefieldinit Microsoft.CodeAnalysis.EmbeddedAttribute
extends [mscorlib]System.Attribute
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void Microsoft.CodeAnalysis.EmbeddedAttribute::.ctor() = ( 01 00 00 00 )
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Attribute::.ctor()
IL_0006: nop
IL_0007: ret
} // end of method EmbeddedAttribute::.ctor
} // end of class Microsoft.CodeAnalysis.EmbeddedAttribute
.class private auto ansi sealed beforefieldinit System.Runtime.CompilerServices.RefSafetyRulesAttribute
extends [mscorlib]System.Attribute
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void Microsoft.CodeAnalysis.EmbeddedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [mscorlib]System.AttributeUsageAttribute::.ctor(valuetype [mscorlib]System.AttributeTargets) = ( 01 00 02 00 00 00 02 00 54 02 0D 41 6C 6C 6F 77 // ........T..Allow
4D 75 6C 74 69 70 6C 65 00 54 02 09 49 6E 68 65 // Multiple.T..Inhe
72 69 74 65 64 00 ) // rited.
.field public initonly int32 Version
.method public hidebysig specialname rtspecialname
instance void .ctor(int32 A_1) cil managed
{
// Code size 15 (0xf)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Attribute::.ctor()
IL_0006: nop
IL_0007: ldarg.0
IL_0008: ldarg.1
IL_0009: stfld int32 System.Runtime.CompilerServices.RefSafetyRulesAttribute::Version
IL_000e: ret
} // end of method RefSafetyRulesAttribute::.ctor
} // end of class System.Runtime.CompilerServices.RefSafetyRulesAttribute
.class private auto ansi sealed beforefieldinit System.Runtime.CompilerServices.CompilerFeatureRequiredAttribute
extends [mscorlib]System.Attribute
{
.custom instance void [mscorlib]System.AttributeUsageAttribute::.ctor(valuetype [mscorlib]System.AttributeTargets) = ( 01 00 FF 7F 00 00 02 00 54 02 0D 41 6C 6C 6F 77 // ........T..Allow
4D 75 6C 74 69 70 6C 65 01 54 02 09 49 6E 68 65 // Multiple.T..Inhe
72 69 74 65 64 00 ) // rited.
.method public hidebysig specialname rtspecialname
instance void .ctor(string featureName) cil managed
{
// Code size 9 (0x9)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Attribute::.ctor()
IL_0006: nop
IL_0007: nop
IL_0008: ret
} // end of method CompilerFeatureRequiredAttribute::.ctor
} // end of class System.Runtime.CompilerServices.CompilerFeatureRequiredAttribute
.class private auto ansi beforefieldinit System.Runtime.CompilerServices.IsExternalInit
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: nop
IL_0007: ret
} // end of method IsExternalInit::.ctor
} // end of class System.Runtime.CompilerServices.IsExternalInit
.class private auto ansi sealed beforefieldinit System.Runtime.CompilerServices.RequiredMemberAttribute
extends [mscorlib]System.Attribute
{
.custom instance void [mscorlib]System.AttributeUsageAttribute::.ctor(valuetype [mscorlib]System.AttributeTargets) = ( 01 00 8C 01 00 00 02 00 54 02 0D 41 6C 6C 6F 77 // ........T..Allow
4D 75 6C 74 69 70 6C 65 00 54 02 09 49 6E 68 65 // Multiple.T..Inhe
72 69 74 65 64 00 ) // rited.
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Attribute::.ctor()
IL_0006: nop
IL_0007: ret
} // end of method RequiredMemberAttribute::.ctor
} // end of class System.Runtime.CompilerServices.RequiredMemberAttribute
.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1<.ctor TOnType>
extends [mscorlib]System.Object
{
.method public hidebysig static !TOnType
CreateTOnType() cil managed
{
// Code size 11 (0xb)
.maxstack 1
.locals init (!TOnType V_0)
IL_0000: nop
IL_0001: call !!0 [mscorlib]System.Activator::CreateInstance<!TOnType>()
IL_0006: stloc.0
IL_0007: br.s IL_0009
IL_0009: ldloc.0
IL_000a: ret
} // end of method NoGenericTypeInstantiation`1::CreateTOnType
.method public hidebysig static !!TOnMethod
CreateTOnMethod<.ctor TOnMethod>() cil managed
{
// Code size 11 (0xb)
.maxstack 1
.locals init (!!TOnMethod V_0)
IL_0000: nop
IL_0001: call !!0 [mscorlib]System.Activator::CreateInstance<!!0>()
IL_0006: stloc.0
IL_0007: br.s IL_0009
IL_0009: ldloc.0
IL_000a: ret
} // end of method NoGenericTypeInstantiation`1::CreateTOnMethod
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: nop
IL_0007: ret
} // end of method NoGenericTypeInstantiation`1::.ctor
} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1
// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************

96
ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.opt.il

@ -0,0 +1,96 @@ @@ -0,0 +1,96 @@
// .NET IL Disassembler. Version 9.0.4
// Metadata version: v4.0.30319
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
.assembly tmp4sutck
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
.permissionset reqmin
= {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}}
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module tmp4sutck.tmp
// MVID: {8529154b-7a90-417c-b54f-0d5c900533db}
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// =============== CLASS MEMBERS DECLARATION ===================
.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1<.ctor TOnType>
extends [mscorlib]System.Object
{
.method public hidebysig static !TOnType
CreateTOnType() cil managed
{
// Code size 32 (0x20)
.maxstack 1
.locals init (!TOnType V_0,
!TOnType V_1)
IL_0000: ldloca.s V_0
IL_0002: initobj !TOnType
IL_0008: ldloc.0
IL_0009: box !TOnType
IL_000e: brfalse.s IL_001a
IL_0010: ldloca.s V_1
IL_0012: initobj !TOnType
IL_0018: ldloc.1
IL_0019: ret
IL_001a: call !!0 [mscorlib]System.Activator::CreateInstance<!TOnType>()
IL_001f: ret
} // end of method NoGenericTypeInstantiation`1::CreateTOnType
.method public hidebysig static !!TOnMethod
CreateTOnMethod<.ctor TOnMethod>() cil managed
{
// Code size 32 (0x20)
.maxstack 1
.locals init (!!TOnMethod V_0,
!!TOnMethod V_1)
IL_0000: ldloca.s V_0
IL_0002: initobj !!TOnMethod
IL_0008: ldloc.0
IL_0009: box !!TOnMethod
IL_000e: brfalse.s IL_001a
IL_0010: ldloca.s V_1
IL_0012: initobj !!TOnMethod
IL_0018: ldloc.1
IL_0019: ret
IL_001a: call !!0 [mscorlib]System.Activator::CreateInstance<!!0>()
IL_001f: ret
} // end of method NoGenericTypeInstantiation`1::CreateTOnMethod
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method NoGenericTypeInstantiation`1::.ctor
} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1
// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************

167
ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.opt.net40.roslyn.il

@ -0,0 +1,167 @@ @@ -0,0 +1,167 @@
// .NET IL Disassembler. Version 9.0.4
// Metadata version: v4.0.30319
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
.assembly tmp2yw4m4
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 02 00 00 00 00 00 )
.permissionset reqmin
= {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}}
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module tmp2yw4m4.tmp
// MVID: {1cd5c846-415a-403b-98cb-2fd0dd281694}
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void System.Runtime.CompilerServices.RefSafetyRulesAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 )
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// =============== CLASS MEMBERS DECLARATION ===================
.class private auto ansi sealed beforefieldinit Microsoft.CodeAnalysis.EmbeddedAttribute
extends [mscorlib]System.Attribute
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void Microsoft.CodeAnalysis.EmbeddedAttribute::.ctor() = ( 01 00 00 00 )
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Attribute::.ctor()
IL_0006: ret
} // end of method EmbeddedAttribute::.ctor
} // end of class Microsoft.CodeAnalysis.EmbeddedAttribute
.class private auto ansi sealed beforefieldinit System.Runtime.CompilerServices.RefSafetyRulesAttribute
extends [mscorlib]System.Attribute
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void Microsoft.CodeAnalysis.EmbeddedAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [mscorlib]System.AttributeUsageAttribute::.ctor(valuetype [mscorlib]System.AttributeTargets) = ( 01 00 02 00 00 00 02 00 54 02 0D 41 6C 6C 6F 77 // ........T..Allow
4D 75 6C 74 69 70 6C 65 00 54 02 09 49 6E 68 65 // Multiple.T..Inhe
72 69 74 65 64 00 ) // rited.
.field public initonly int32 Version
.method public hidebysig specialname rtspecialname
instance void .ctor(int32 A_1) cil managed
{
// Code size 14 (0xe)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Attribute::.ctor()
IL_0006: ldarg.0
IL_0007: ldarg.1
IL_0008: stfld int32 System.Runtime.CompilerServices.RefSafetyRulesAttribute::Version
IL_000d: ret
} // end of method RefSafetyRulesAttribute::.ctor
} // end of class System.Runtime.CompilerServices.RefSafetyRulesAttribute
.class private auto ansi sealed beforefieldinit System.Runtime.CompilerServices.CompilerFeatureRequiredAttribute
extends [mscorlib]System.Attribute
{
.custom instance void [mscorlib]System.AttributeUsageAttribute::.ctor(valuetype [mscorlib]System.AttributeTargets) = ( 01 00 FF 7F 00 00 02 00 54 02 0D 41 6C 6C 6F 77 // ........T..Allow
4D 75 6C 74 69 70 6C 65 01 54 02 09 49 6E 68 65 // Multiple.T..Inhe
72 69 74 65 64 00 ) // rited.
.method public hidebysig specialname rtspecialname
instance void .ctor(string featureName) cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Attribute::.ctor()
IL_0006: ret
} // end of method CompilerFeatureRequiredAttribute::.ctor
} // end of class System.Runtime.CompilerServices.CompilerFeatureRequiredAttribute
.class private auto ansi beforefieldinit System.Runtime.CompilerServices.IsExternalInit
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method IsExternalInit::.ctor
} // end of class System.Runtime.CompilerServices.IsExternalInit
.class private auto ansi sealed beforefieldinit System.Runtime.CompilerServices.RequiredMemberAttribute
extends [mscorlib]System.Attribute
{
.custom instance void [mscorlib]System.AttributeUsageAttribute::.ctor(valuetype [mscorlib]System.AttributeTargets) = ( 01 00 8C 01 00 00 02 00 54 02 0D 41 6C 6C 6F 77 // ........T..Allow
4D 75 6C 74 69 70 6C 65 00 54 02 09 49 6E 68 65 // Multiple.T..Inhe
72 69 74 65 64 00 ) // rited.
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Attribute::.ctor()
IL_0006: ret
} // end of method RequiredMemberAttribute::.ctor
} // end of class System.Runtime.CompilerServices.RequiredMemberAttribute
.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1<.ctor TOnType>
extends [mscorlib]System.Object
{
.method public hidebysig static !TOnType
CreateTOnType() cil managed
{
// Code size 6 (0x6)
.maxstack 8
IL_0000: call !!0 [mscorlib]System.Activator::CreateInstance<!TOnType>()
IL_0005: ret
} // end of method NoGenericTypeInstantiation`1::CreateTOnType
.method public hidebysig static !!TOnMethod
CreateTOnMethod<.ctor TOnMethod>() cil managed
{
// Code size 6 (0x6)
.maxstack 8
IL_0000: call !!0 [mscorlib]System.Activator::CreateInstance<!!0>()
IL_0005: ret
} // end of method NoGenericTypeInstantiation`1::CreateTOnMethod
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method NoGenericTypeInstantiation`1::.ctor
} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1
// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************

79
ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.opt.roslyn.il

@ -0,0 +1,79 @@ @@ -0,0 +1,79 @@
// .NET IL Disassembler. Version 9.0.4
// Metadata version: v4.0.30319
.assembly extern System.Runtime
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 8:0:0:0
}
.assembly tmpbfpzzx
{
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [System.Runtime]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [System.Runtime]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 02 00 00 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 18 2E 4E 45 54 43 6F 72 65 41 70 70 2C 56 // ....NETCoreApp,V
65 72 73 69 6F 6E 3D 76 38 2E 30 01 00 54 0E 14 // ersion=v8.0..T..
46 72 61 6D 65 77 6F 72 6B 44 69 73 70 6C 61 79 // FrameworkDisplay
4E 61 6D 65 00 ) // Name.
.permissionset reqmin
= {[System.Runtime]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}}
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module tmpbfpzzx.tmp
// MVID: {5d4ee8e5-8c47-4519-bd9e-e6d2d3628bfc}
.custom instance void [System.Runtime]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.RefSafetyRulesAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 )
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// =============== CLASS MEMBERS DECLARATION ===================
.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1<.ctor TOnType>
extends [System.Runtime]System.Object
{
.method public hidebysig static !TOnType
CreateTOnType() cil managed
{
// Code size 6 (0x6)
.maxstack 8
IL_0000: call !!0 [System.Runtime]System.Activator::CreateInstance<!TOnType>()
IL_0005: ret
} // end of method NoGenericTypeInstantiation`1::CreateTOnType
.method public hidebysig static !!TOnMethod
CreateTOnMethod<.ctor TOnMethod>() cil managed
{
// Code size 6 (0x6)
.maxstack 8
IL_0000: call !!0 [System.Runtime]System.Activator::CreateInstance<!!0>()
IL_0005: ret
} // end of method NoGenericTypeInstantiation`1::CreateTOnMethod
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [System.Runtime]System.Object::.ctor()
IL_0006: ret
} // end of method NoGenericTypeInstantiation`1::.ctor
} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1
// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************

92
ICSharpCode.Decompiler.Tests/TestCases/Ugly/NoGenericTypeInstantiation.roslyn.il

@ -0,0 +1,92 @@ @@ -0,0 +1,92 @@
// .NET IL Disassembler. Version 9.0.4
// Metadata version: v4.0.30319
.assembly extern System.Runtime
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 8:0:0:0
}
.assembly tmpw4dati
{
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [System.Runtime]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [System.Runtime]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 07 01 00 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 18 2E 4E 45 54 43 6F 72 65 41 70 70 2C 56 // ....NETCoreApp,V
65 72 73 69 6F 6E 3D 76 38 2E 30 01 00 54 0E 14 // ersion=v8.0..T..
46 72 61 6D 65 77 6F 72 6B 44 69 73 70 6C 61 79 // FrameworkDisplay
4E 61 6D 65 00 ) // Name.
.permissionset reqmin
= {[System.Runtime]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}}
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module tmpw4dati.tmp
// MVID: {901dcf98-cf20-4065-abc3-85086e5af113}
.custom instance void [System.Runtime]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.custom instance void [System.Runtime]System.Runtime.CompilerServices.RefSafetyRulesAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 )
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// =============== CLASS MEMBERS DECLARATION ===================
.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1<.ctor TOnType>
extends [System.Runtime]System.Object
{
.method public hidebysig static !TOnType
CreateTOnType() cil managed
{
// Code size 11 (0xb)
.maxstack 1
.locals init (!TOnType V_0)
IL_0000: nop
IL_0001: call !!0 [System.Runtime]System.Activator::CreateInstance<!TOnType>()
IL_0006: stloc.0
IL_0007: br.s IL_0009
IL_0009: ldloc.0
IL_000a: ret
} // end of method NoGenericTypeInstantiation`1::CreateTOnType
.method public hidebysig static !!TOnMethod
CreateTOnMethod<.ctor TOnMethod>() cil managed
{
// Code size 11 (0xb)
.maxstack 1
.locals init (!!TOnMethod V_0)
IL_0000: nop
IL_0001: call !!0 [System.Runtime]System.Activator::CreateInstance<!!0>()
IL_0006: stloc.0
IL_0007: br.s IL_0009
IL_0009: ldloc.0
IL_000a: ret
} // end of method NoGenericTypeInstantiation`1::CreateTOnMethod
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [System.Runtime]System.Object::.ctor()
IL_0006: nop
IL_0007: ret
} // end of method NoGenericTypeInstantiation`1::.ctor
} // end of class ICSharpCode.Decompiler.Tests.TestCases.Ugly.NoGenericTypeInstantiation`1
// =============================================================
// *********** DISASSEMBLY COMPLETE ***********************

6
ICSharpCode.Decompiler.Tests/UglyTestRunner.cs

@ -132,6 +132,12 @@ namespace ICSharpCode.Decompiler.Tests @@ -132,6 +132,12 @@ namespace ICSharpCode.Decompiler.Tests
});
}
[Test]
public async Task NoGenericTypeInstantiation([ValueSource(nameof(roslynOnlyOptions))] CompilerOptions cscOptions)
{
await RunForLibrary(cscOptions: cscOptions, decompilerSettings: new DecompilerSettings(CSharp.LanguageVersion.CSharp1));
}
async Task RunForLibrary([CallerMemberName] string testName = null, AssemblerOptions asmOptions = AssemblerOptions.None, CompilerOptions cscOptions = CompilerOptions.None, DecompilerSettings decompilerSettings = null)
{
await Run(testName, asmOptions | AssemblerOptions.Library, cscOptions | CompilerOptions.Library, decompilerSettings);

5
ICSharpCode.Decompiler/CSharp/Transforms/ReplaceMethodCallsWithOperators.cs

@ -128,7 +128,10 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms @@ -128,7 +128,10 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
break;
*/
case "System.Activator.CreateInstance":
if (arguments.Length == 0 && method.TypeArguments.Count == 1 && IsInstantiableTypeParameter(method.TypeArguments[0]))
if (context.Settings.GenericTypeInstantiation &&
arguments.Length == 0 &&
method.TypeArguments.Count == 1 &&
IsInstantiableTypeParameter(method.TypeArguments[0]))
{
invocationExpression.ReplaceWith(new ObjectCreateExpression(context.TypeSystemAstBuilder.ConvertType(method.TypeArguments.First())));
}

23
ICSharpCode.Decompiler/DecompilerSettings.cs

@ -63,6 +63,7 @@ namespace ICSharpCode.Decompiler @@ -63,6 +63,7 @@ namespace ICSharpCode.Decompiler
liftNullables = false;
yieldReturn = false;
useImplicitMethodGroupConversion = false;
genericTypeInstantiation = false;
}
if (languageVersion < CSharp.LanguageVersion.CSharp3)
{
@ -203,7 +204,7 @@ namespace ICSharpCode.Decompiler @@ -203,7 +204,7 @@ namespace ICSharpCode.Decompiler
if (anonymousTypes || objectCollectionInitializers || automaticProperties
|| queryExpressions || expressionTrees)
return CSharp.LanguageVersion.CSharp3;
if (anonymousMethods || liftNullables || yieldReturn || useImplicitMethodGroupConversion)
if (anonymousMethods || liftNullables || yieldReturn || useImplicitMethodGroupConversion || genericTypeInstantiation)
return CSharp.LanguageVersion.CSharp2;
return CSharp.LanguageVersion.CSharp1;
}
@ -961,6 +962,26 @@ namespace ICSharpCode.Decompiler @@ -961,6 +962,26 @@ namespace ICSharpCode.Decompiler
}
}
bool genericTypeInstantiation = true;
/// <summary>
/// Gets/Sets whether to use generic type instantiation for generic types with <c>new()</c> constraint.
/// true: <c>T t = new T();</c>
/// false: <c>T t = Activator.CreateInstance&lt;T&gt;()</c>
/// </summary>
[Category("C# 2.0 / VS 2005")]
[Description("DecompilerSettings.GenericTypeInstantiation")]
public bool GenericTypeInstantiation {
get { return genericTypeInstantiation; }
set {
if (genericTypeInstantiation != value)
{
genericTypeInstantiation = value;
OnPropertyChanged();
}
}
}
bool alwaysCastTargetsOfExplicitInterfaceImplementationCalls = false;
/// <summary>

Loading…
Cancel
Save