Skip to content

Commit 4effc93

Browse files
authored
Merge pull request #712 from Sergio0694/user/sergiopedri/create-constructor-overload
Add 'CreateConstructor' overload taking just 'CorLibTypeFactory'
2 parents 23c82df + 957a54e commit 4effc93

2 files changed

Lines changed: 41 additions & 3 deletions

File tree

src/AsmResolver.DotNet/MethodDefinition.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -830,12 +830,27 @@ public static MethodDefinition CreateStaticConstructor(ModuleDefinition module)
830830
/// any of the declaring type's base classes. For an idiomatic .NET binary, this should be added.
831831
/// </remarks>
832832
public static MethodDefinition CreateConstructor(ModuleDefinition module, params TypeSignature[] parameterTypes)
833+
{
834+
return CreateConstructor(module.CorLibTypeFactory, parameterTypes);
835+
}
836+
837+
/// <summary>
838+
/// Creates a new public constructor for a type that is executed when its declaring type is loaded by the CLR.
839+
/// </summary>
840+
/// <param name="corLibTypeFactory">The <see cref="CorLibTypeFactory"/> instance to use to resolve fundamental type signatures.</param>
841+
/// <param name="parameterTypes">An ordered list of types the parameters of the constructor should have.</param>
842+
/// <returns>The constructor.</returns>
843+
/// <remarks>
844+
/// The resulting method's body will consist of a single <c>ret</c> instruction, and does not contain a call to
845+
/// any of the declaring type's base classes. For an idiomatic .NET binary, this should be added.
846+
/// </remarks>
847+
public static MethodDefinition CreateConstructor(CorLibTypeFactory corLibTypeFactory, params TypeSignature[] parameterTypes)
833848
{
834849
var ctor = new MethodDefinition(".ctor",
835850
MethodAttributes.Public
836851
| MethodAttributes.SpecialName
837852
| MethodAttributes.RuntimeSpecialName,
838-
MethodSignature.CreateInstance(module.CorLibTypeFactory.Void, parameterTypes));
853+
MethodSignature.CreateInstance(corLibTypeFactory.Void, parameterTypes));
839854

840855
for (int i = 0; i < parameterTypes.Length; i++)
841856
ctor.ParameterDefinitions.Add(new ParameterDefinition(null));

test/AsmResolver.DotNet.Tests/MethodDefinitionTest.cs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,7 @@ public void VerifyGenericParameterCount()
641641
}
642642

643643
[Fact]
644-
public void CreateParameterlessConstructor()
644+
public void CreateParameterlessConstructorFromModuleDefinition()
645645
{
646646
var module = ModuleDefinition.FromFile(typeof(Constructors).Assembly.Location, TestReaderParameters);
647647
var ctor = MethodDefinition.CreateConstructor(module);
@@ -653,7 +653,7 @@ public void CreateParameterlessConstructor()
653653
}
654654

655655
[Fact]
656-
public void CreateConstructor()
656+
public void CreateConstructorFromModuleDefinition()
657657
{
658658
var module = ModuleDefinition.FromFile(typeof(Constructors).Assembly.Location, TestReaderParameters);
659659
var factory = module.CorLibTypeFactory;
@@ -663,6 +663,29 @@ public void CreateConstructor()
663663
Assert.Equal(new[] {factory.Int32, factory.Double}, ctor.Parameters.Select(x => x.ParameterType));
664664
}
665665

666+
[Fact]
667+
public void CreateParameterlessConstructorFromCorLibTypeFactory()
668+
{
669+
var module = ModuleDefinition.FromFile(typeof(Constructors).Assembly.Location, TestReaderParameters);
670+
var ctor = MethodDefinition.CreateConstructor(module.CorLibTypeFactory);
671+
672+
Assert.True(ctor.IsConstructor);
673+
Assert.Empty(ctor.Parameters);
674+
Assert.NotNull(ctor.CilMethodBody);
675+
Assert.Equal(CilOpCodes.Ret, Assert.Single(ctor.CilMethodBody.Instructions).OpCode);
676+
}
677+
678+
[Fact]
679+
public void CreateConstructorFromCorLibTypeFactory()
680+
{
681+
var module = ModuleDefinition.FromFile(typeof(Constructors).Assembly.Location, TestReaderParameters);
682+
var factory = module.CorLibTypeFactory;
683+
var ctor = MethodDefinition.CreateConstructor(factory, factory.Int32, factory.Double);
684+
685+
Assert.True(ctor.IsConstructor);
686+
Assert.Equal(new[] { factory.Int32, factory.Double }, ctor.Parameters.Select(x => x.ParameterType));
687+
}
688+
666689
[Fact]
667690
public void BodyHasOwner()
668691
{

0 commit comments

Comments
 (0)