From 61a712d6e63e45536c795a313243b9f1ec3b8360 Mon Sep 17 00:00:00 2001 From: Jeremy Pritts Date: Sun, 27 Mar 2022 01:46:12 -0400 Subject: [PATCH 1/3] use an instantiator for creating the reference importer --- .../Cloning/CloneContextAwareReferenceImporter.cs | 7 +++++-- src/AsmResolver.DotNet/Cloning/MemberCloneContext.cs | 8 +++++--- src/AsmResolver.DotNet/Cloning/MemberCloner.cs | 8 ++++++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/AsmResolver.DotNet/Cloning/CloneContextAwareReferenceImporter.cs b/src/AsmResolver.DotNet/Cloning/CloneContextAwareReferenceImporter.cs index 4fd836cfe..235f5a277 100644 --- a/src/AsmResolver.DotNet/Cloning/CloneContextAwareReferenceImporter.cs +++ b/src/AsmResolver.DotNet/Cloning/CloneContextAwareReferenceImporter.cs @@ -5,7 +5,10 @@ namespace AsmResolver.DotNet.Cloning /// public class CloneContextAwareReferenceImporter : ReferenceImporter { - private readonly MemberCloneContext _context; + /// + /// The working space for this member cloning procedure. + /// + protected readonly MemberCloneContext _context; /// /// Creates a new instance of the class. @@ -41,4 +44,4 @@ public override IMethodDefOrRef ImportMethod(IMethodDefOrRef method) : base.ImportMethod(method); } } -} \ No newline at end of file +} diff --git a/src/AsmResolver.DotNet/Cloning/MemberCloneContext.cs b/src/AsmResolver.DotNet/Cloning/MemberCloneContext.cs index 5f6fa56e9..43092c939 100644 --- a/src/AsmResolver.DotNet/Cloning/MemberCloneContext.cs +++ b/src/AsmResolver.DotNet/Cloning/MemberCloneContext.cs @@ -12,10 +12,12 @@ public class MemberCloneContext /// Creates a new instance of the class. /// /// The target module to copy the cloned members into. - public MemberCloneContext(ModuleDefinition module) + /// The instantiator for creating the reference importer + public MemberCloneContext(ModuleDefinition module, + Func? importerInstantiator = null) { Module = module ?? throw new ArgumentNullException(nameof(module)); - Importer = new CloneContextAwareReferenceImporter(this); + Importer = importerInstantiator?.Invoke(this) ?? new CloneContextAwareReferenceImporter(this); } /// @@ -42,4 +44,4 @@ public IDictionary ClonedMembers get; } = new Dictionary(); } -} \ No newline at end of file +} diff --git a/src/AsmResolver.DotNet/Cloning/MemberCloner.cs b/src/AsmResolver.DotNet/Cloning/MemberCloner.cs index eae611adb..2d1a6022b 100644 --- a/src/AsmResolver.DotNet/Cloning/MemberCloner.cs +++ b/src/AsmResolver.DotNet/Cloning/MemberCloner.cs @@ -17,6 +17,7 @@ namespace AsmResolver.DotNet.Cloning /// public partial class MemberCloner { + private readonly Func? _importerInstantiator; private readonly ModuleDefinition _targetModule; private readonly HashSet _typesToClone = new(); @@ -29,9 +30,12 @@ public partial class MemberCloner /// Creates a new instance of the class. /// /// The target module to copy the members into. - public MemberCloner(ModuleDefinition targetModule) + /// The instantiator for creating the reference importer + public MemberCloner(ModuleDefinition targetModule, + Func? importerInstantiator = null) { _targetModule = targetModule ?? throw new ArgumentNullException(nameof(targetModule)); + _importerInstantiator = importerInstantiator; } /// @@ -220,7 +224,7 @@ public MemberCloner Include(EventDefinition @event) /// An object representing the result of the cloning process. public MemberCloneResult Clone() { - var context = new MemberCloneContext(_targetModule); + var context = new MemberCloneContext(_targetModule, _importerInstantiator); CreateMemberStubs(context); DeepCopyMembers(context); From bc688fd43cbfddd9e010adea933a7d081fce1e60 Mon Sep 17 00:00:00 2001 From: Jeremy Pritts Date: Mon, 28 Mar 2022 13:42:14 -0400 Subject: [PATCH 2/3] fix constructors for better binary compatibility --- src/AsmResolver.DotNet/Cloning/MemberCloneContext.cs | 8 +++++++- src/AsmResolver.DotNet/Cloning/MemberCloner.cs | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/AsmResolver.DotNet/Cloning/MemberCloneContext.cs b/src/AsmResolver.DotNet/Cloning/MemberCloneContext.cs index 43092c939..4bcf5894b 100644 --- a/src/AsmResolver.DotNet/Cloning/MemberCloneContext.cs +++ b/src/AsmResolver.DotNet/Cloning/MemberCloneContext.cs @@ -8,13 +8,19 @@ namespace AsmResolver.DotNet.Cloning /// public class MemberCloneContext { + /// + /// Creates a new instance of the class. + /// + /// The target module to copy the cloned members into. + public MemberCloneContext(ModuleDefinition module) : this(module, null) { } + /// /// Creates a new instance of the class. /// /// The target module to copy the cloned members into. /// The instantiator for creating the reference importer public MemberCloneContext(ModuleDefinition module, - Func? importerInstantiator = null) + Func? importerInstantiator) { Module = module ?? throw new ArgumentNullException(nameof(module)); Importer = importerInstantiator?.Invoke(this) ?? new CloneContextAwareReferenceImporter(this); diff --git a/src/AsmResolver.DotNet/Cloning/MemberCloner.cs b/src/AsmResolver.DotNet/Cloning/MemberCloner.cs index 2d1a6022b..acd0d1811 100644 --- a/src/AsmResolver.DotNet/Cloning/MemberCloner.cs +++ b/src/AsmResolver.DotNet/Cloning/MemberCloner.cs @@ -26,13 +26,19 @@ public partial class MemberCloner private readonly HashSet _propertiesToClone = new(); private readonly HashSet _eventsToClone = new(); + /// + /// Creates a new instance of the class. + /// + /// The target module to copy the members into. + public MemberCloner(ModuleDefinition targetModule) : this(targetModule, null) { } + /// /// Creates a new instance of the class. /// /// The target module to copy the members into. /// The instantiator for creating the reference importer public MemberCloner(ModuleDefinition targetModule, - Func? importerInstantiator = null) + Func? importerInstantiator) { _targetModule = targetModule ?? throw new ArgumentNullException(nameof(targetModule)); _importerInstantiator = importerInstantiator; From b5ac4462a109d3b98330ee61a71f19c57e467a2e Mon Sep 17 00:00:00 2001 From: Jeremy Pritts Date: Wed, 30 Mar 2022 09:39:14 -0400 Subject: [PATCH 3/3] name changes and context property in the cloning reference importer --- .../Cloning/CloneContextAwareReferenceImporter.cs | 10 ++++++---- src/AsmResolver.DotNet/Cloning/MemberCloneContext.cs | 6 +++--- src/AsmResolver.DotNet/Cloning/MemberCloner.cs | 10 +++++----- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/AsmResolver.DotNet/Cloning/CloneContextAwareReferenceImporter.cs b/src/AsmResolver.DotNet/Cloning/CloneContextAwareReferenceImporter.cs index 235f5a277..0382fb8a9 100644 --- a/src/AsmResolver.DotNet/Cloning/CloneContextAwareReferenceImporter.cs +++ b/src/AsmResolver.DotNet/Cloning/CloneContextAwareReferenceImporter.cs @@ -5,10 +5,7 @@ namespace AsmResolver.DotNet.Cloning /// public class CloneContextAwareReferenceImporter : ReferenceImporter { - /// - /// The working space for this member cloning procedure. - /// - protected readonly MemberCloneContext _context; + private readonly MemberCloneContext _context; /// /// Creates a new instance of the class. @@ -20,6 +17,11 @@ public CloneContextAwareReferenceImporter(MemberCloneContext context) _context = context; } + /// + /// The working space for this member cloning procedure. + /// + protected MemberCloneContext Context => _context; + /// protected override ITypeDefOrRef ImportType(TypeDefinition type) { diff --git a/src/AsmResolver.DotNet/Cloning/MemberCloneContext.cs b/src/AsmResolver.DotNet/Cloning/MemberCloneContext.cs index 4bcf5894b..78c52c8c3 100644 --- a/src/AsmResolver.DotNet/Cloning/MemberCloneContext.cs +++ b/src/AsmResolver.DotNet/Cloning/MemberCloneContext.cs @@ -18,12 +18,12 @@ public MemberCloneContext(ModuleDefinition module) : this(module, null) { } /// Creates a new instance of the class. /// /// The target module to copy the cloned members into. - /// The instantiator for creating the reference importer + /// The factory for creating the reference importer public MemberCloneContext(ModuleDefinition module, - Func? importerInstantiator) + Func? importerFactory) { Module = module ?? throw new ArgumentNullException(nameof(module)); - Importer = importerInstantiator?.Invoke(this) ?? new CloneContextAwareReferenceImporter(this); + Importer = importerFactory?.Invoke(this) ?? new CloneContextAwareReferenceImporter(this); } /// diff --git a/src/AsmResolver.DotNet/Cloning/MemberCloner.cs b/src/AsmResolver.DotNet/Cloning/MemberCloner.cs index acd0d1811..1580d1efa 100644 --- a/src/AsmResolver.DotNet/Cloning/MemberCloner.cs +++ b/src/AsmResolver.DotNet/Cloning/MemberCloner.cs @@ -17,7 +17,7 @@ namespace AsmResolver.DotNet.Cloning /// public partial class MemberCloner { - private readonly Func? _importerInstantiator; + private readonly Func? _importerFactory; private readonly ModuleDefinition _targetModule; private readonly HashSet _typesToClone = new(); @@ -36,12 +36,12 @@ public MemberCloner(ModuleDefinition targetModule) : this(targetModule, null) { /// Creates a new instance of the class. /// /// The target module to copy the members into. - /// The instantiator for creating the reference importer + /// The factory for creating the reference importer public MemberCloner(ModuleDefinition targetModule, - Func? importerInstantiator) + Func? importerFactory) { _targetModule = targetModule ?? throw new ArgumentNullException(nameof(targetModule)); - _importerInstantiator = importerInstantiator; + _importerFactory = importerFactory; } /// @@ -230,7 +230,7 @@ public MemberCloner Include(EventDefinition @event) /// An object representing the result of the cloning process. public MemberCloneResult Clone() { - var context = new MemberCloneContext(_targetModule, _importerInstantiator); + var context = new MemberCloneContext(_targetModule, _importerFactory); CreateMemberStubs(context); DeepCopyMembers(context);