Skip to content

Commit

Permalink
Support properly and more field types for simple injections.
Browse files Browse the repository at this point in the history
  • Loading branch information
CptMoore committed Jan 29, 2025
1 parent 0dc0416 commit fbce9df
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 11 deletions.
2 changes: 1 addition & 1 deletion ModTekSimpleInjector/ModTekSimpleInjector.Example.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Do not rely on fields added by other mods, unless explicitly advised to do so.

<!--
AddField adds a new instance field to an existing type.
Fields can be of any types found in mscorlib.
Fields can be of any types found in mscorlib, System or System.Core.
Keywords (e.g. byte) are not supported, use the types full name (e.g. System.Byte).
-->
<AddField ToType="HBS.Logging.Logger" InAssembly="Assembly-CSharp"
Expand Down
29 changes: 19 additions & 10 deletions ModTekSimpleInjector/SimpleInjection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,22 @@ namespace ModTekSimpleInjector;

internal class SimpleInjection
{
private readonly TypeDefinition _typeDefinition;
private readonly ModuleDefinition[] _coreModules;
private readonly ModuleDefinition _moduleDefinition;
private readonly TypeDefinition _typeDefinition;
private readonly CustomAttribute _customAttribute;

public SimpleInjection(
string sourceFile,
IAssemblyResolver resolver,
Addition addition
) {
_coreModules = [
resolver.Resolve(new AssemblyNameReference("mscorlib", null)).MainModule,
resolver.Resolve(new AssemblyNameReference("System", null)).MainModule,
resolver.Resolve(new AssemblyNameReference("System.Core", null)).MainModule,
];

Console.WriteLine($"Processing {addition}");
var assemblyName = new AssemblyNameReference(addition.InAssembly, null);

Expand Down Expand Up @@ -120,7 +127,7 @@ private interface IParameterInfo
Type Type { get; }
}

private static Type ResolveType(string typeName)
private TypeReference ResolveType(string typeName)
{
var isArray = typeName.EndsWith("[]");
if (isArray)
Expand All @@ -130,14 +137,14 @@ private static Type ResolveType(string typeName)

var genericArgumentsRegex = new Regex("^(.+?)<(.+)>$");
var genericArgumentsMatch = genericArgumentsRegex.Match(typeName);
Type[] genericArgumentsTypes;
TypeReference[] genericArgumentsTypes;
if (genericArgumentsMatch.Success)
{
var genericArgumentsString = genericArgumentsMatch.Groups[2].Value;
var genericArgumentsStrings = genericArgumentsString.Split(',');
typeName = genericArgumentsMatch.Groups[1].Value;
typeName += "`" + genericArgumentsStrings.Length;
genericArgumentsTypes = new Type[genericArgumentsStrings.Length];
genericArgumentsTypes = new TypeReference[genericArgumentsStrings.Length];
for (var i = 0; i < genericArgumentsTypes.Length; i++)
{
genericArgumentsTypes[i] = ResolveType(genericArgumentsStrings[i]);
Expand All @@ -148,18 +155,20 @@ private static Type ResolveType(string typeName)
genericArgumentsTypes = null;
}

// TODO fix msbuild and unity mono supporting different classes in mscorlib!
// we only support mscorlib classes for now
var fieldType = typeof(int).Assembly.GetType(typeName);
TypeReference typeReference = _coreModules.Select(m => m.GetType(typeName)).FirstOrDefault();
if (typeReference == null)
{
throw new ArgumentException($"Unable to resolve type {typeName}");
}

if (genericArgumentsTypes != null)
{
fieldType = fieldType.MakeGenericType(genericArgumentsTypes);
typeReference = typeReference.MakeGenericInstanceType(genericArgumentsTypes);
}
if (isArray)
{
fieldType = fieldType.MakeArrayType();
typeReference = typeReference.MakeArrayType();
}
return fieldType;
return typeReference;
}
}

0 comments on commit fbce9df

Please sign in to comment.