Skip to content

Commit c090622

Browse files
committed
Replace arrays with IEnumerable<> in InjectedMethodAnalysisContext constructor
1 parent 0b85095 commit c090622

3 files changed

Lines changed: 68 additions & 14 deletions

File tree

Cpp2IL.Core/Model/Contexts/InjectedMethodAnalysisContext.cs

Lines changed: 64 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Collections.Generic;
12
using System.Reflection;
23

34
namespace Cpp2IL.Core.Model.Contexts;
@@ -23,24 +24,76 @@ public InjectedMethodAnalysisContext(
2324
string name,
2425
TypeAnalysisContext returnType,
2526
MethodAttributes attributes,
26-
TypeAnalysisContext[] injectedParameterTypes,
27-
string[]? injectedParameterNames = null,
28-
ParameterAttributes[]? injectedParameterAttributes = null,
29-
MethodImplAttributes defaultImplAttributes = MethodImplAttributes.Managed) : base(null, parent)
27+
IEnumerable<TypeAnalysisContext> injectedParameterTypes,
28+
IEnumerable<string>? injectedParameterNames = null,
29+
IEnumerable<ParameterAttributes>? injectedParameterAttributes = null,
30+
MethodImplAttributes implAttributes = MethodImplAttributes.Managed) : this(parent, name, returnType, attributes, GetParameters(injectedParameterTypes, injectedParameterNames, injectedParameterAttributes), implAttributes)
31+
{
32+
}
33+
34+
public InjectedMethodAnalysisContext(
35+
TypeAnalysisContext parent,
36+
string name,
37+
TypeAnalysisContext returnType,
38+
MethodAttributes attributes,
39+
IEnumerable<(TypeAnalysisContext Type, string? Name, ParameterAttributes Attributes)> parameters,
40+
MethodImplAttributes implAttributes = MethodImplAttributes.Managed) : base(null, parent)
3041
{
3142
DefaultName = name;
3243
DefaultReturnType = returnType;
3344
DefaultAttributes = attributes;
3445

35-
for (var i = 0; i < injectedParameterTypes.Length; i++)
46+
var i = 0;
47+
foreach (var (parameterType, parameterName, parameterAttributes) in parameters)
3648
{
37-
var injectedParameterType = injectedParameterTypes[i];
38-
var injectedParameterName = injectedParameterNames?[i];
39-
var injectedParameterAttribute = injectedParameterAttributes?[i] ?? ParameterAttributes.None;
40-
41-
Parameters.Add(new InjectedParameterAnalysisContext(injectedParameterName, injectedParameterType, injectedParameterAttribute, i, this));
49+
Parameters.Add(new InjectedParameterAnalysisContext(parameterName, parameterType, parameterAttributes, i, this));
50+
i++;
4251
}
4352

44-
DefaultImplAttributes = defaultImplAttributes;
53+
DefaultImplAttributes = implAttributes;
54+
}
55+
56+
private static IEnumerable<(TypeAnalysisContext Type, string? Name, ParameterAttributes Attributes)> GetParameters(
57+
IEnumerable<TypeAnalysisContext> parameterTypes,
58+
IEnumerable<string>? parameterNames = null,
59+
IEnumerable<ParameterAttributes>? parameterAttributes = null)
60+
{
61+
var typeEnumerator = parameterTypes.GetEnumerator();
62+
var nameEnumerator = parameterNames?.GetEnumerator();
63+
var attributeEnumerator = parameterAttributes?.GetEnumerator();
64+
if (nameEnumerator != null)
65+
{
66+
if (attributeEnumerator != null)
67+
{
68+
while (typeEnumerator.MoveNext() && nameEnumerator.MoveNext() && attributeEnumerator.MoveNext())
69+
{
70+
yield return (typeEnumerator.Current, nameEnumerator.Current, attributeEnumerator.Current);
71+
}
72+
}
73+
else
74+
{
75+
while (typeEnumerator.MoveNext() && nameEnumerator.MoveNext())
76+
{
77+
yield return (typeEnumerator.Current, nameEnumerator.Current, ParameterAttributes.None);
78+
}
79+
}
80+
}
81+
else
82+
{
83+
if (attributeEnumerator != null)
84+
{
85+
while (typeEnumerator.MoveNext() && attributeEnumerator.MoveNext())
86+
{
87+
yield return (typeEnumerator.Current, null, attributeEnumerator.Current);
88+
}
89+
}
90+
else
91+
{
92+
while (typeEnumerator.MoveNext())
93+
{
94+
yield return (typeEnumerator.Current, null, ParameterAttributes.None);
95+
}
96+
}
97+
}
4598
}
4699
}

Cpp2IL.Core/Model/Contexts/InjectedTypeAnalysisContext.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Collections.Generic;
12
using System.Reflection;
23

34
namespace Cpp2IL.Core.Model.Contexts;
@@ -22,7 +23,7 @@ public InjectedTypeAnalysisContext(AssemblyAnalysisContext containingAssembly, s
2223
DefaultAttributes = typeAttributes;
2324
}
2425

25-
public InjectedMethodAnalysisContext InjectMethodContext(string methodName, TypeAnalysisContext returnType, MethodAttributes attributes, params TypeAnalysisContext[] args)
26+
public InjectedMethodAnalysisContext InjectMethodContext(string methodName, TypeAnalysisContext returnType, MethodAttributes attributes, params IEnumerable<TypeAnalysisContext> args)
2627
{
2728
var method = new InjectedMethodAnalysisContext(this, methodName, returnType, attributes, args);
2829
Methods.Add(method);

Cpp2IL.Core/Model/MultiAssemblyInjectedType.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ public class MultiAssemblyInjectedType(InjectedTypeAnalysisContext[] injectedTyp
99
{
1010
public InjectedTypeAnalysisContext[] InjectedTypes { get; } = injectedTypes;
1111

12-
public Dictionary<AssemblyAnalysisContext, InjectedMethodAnalysisContext> InjectMethodToAllAssemblies(string name, TypeAnalysisContext returnType, MethodAttributes attributes, params TypeAnalysisContext[] args)
12+
public Dictionary<AssemblyAnalysisContext, InjectedMethodAnalysisContext> InjectMethodToAllAssemblies(string name, TypeAnalysisContext returnType, MethodAttributes attributes, params IEnumerable<TypeAnalysisContext> args)
1313
=> InjectedTypes.ToDictionary(t => t.DeclaringAssembly, t => t.InjectMethodContext(name, returnType, attributes, args));
1414

15-
public Dictionary<AssemblyAnalysisContext, InjectedMethodAnalysisContext> InjectConstructor(bool isStatic, params TypeAnalysisContext[] args)
15+
public Dictionary<AssemblyAnalysisContext, InjectedMethodAnalysisContext> InjectConstructor(bool isStatic, params IEnumerable<TypeAnalysisContext> args)
1616
{
1717
var attributes = isStatic
1818
? MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName | MethodAttributes.HideBySig | MethodAttributes.Static

0 commit comments

Comments
 (0)