191 lines
6.7 KiB
C#
191 lines
6.7 KiB
C#
using FishNet.CodeGenerating.Helping.Extension;
|
|
using MonoFN.Cecil;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace FishNet.CodeGenerating.Helping
|
|
{
|
|
internal static class Constructors
|
|
{
|
|
|
|
/// <summary>
|
|
/// Gets the first constructor that optionally has, or doesn't have parameters.
|
|
/// </summary>
|
|
/// <param name="typeRef"></param>
|
|
/// <returns></returns>
|
|
public static MethodDefinition GetFirstConstructor(this TypeReference typeRef, CodegenSession session, bool requireParameters)
|
|
{
|
|
return typeRef.CachedResolve(session).GetFirstConstructor(requireParameters);
|
|
}
|
|
/// <summary>
|
|
/// Gets the first constructor that optionally has, or doesn't have parameters.
|
|
/// </summary>
|
|
/// <param name="typeRef"></param>
|
|
/// <returns></returns>
|
|
public static MethodDefinition GetFirstConstructor(this TypeDefinition typeDef, bool requireParameters)
|
|
{
|
|
|
|
foreach (MethodDefinition methodDef in typeDef.Methods)
|
|
{
|
|
if (methodDef.IsConstructor && methodDef.IsPublic)
|
|
{
|
|
if (requireParameters && methodDef.Parameters.Count > 0)
|
|
return methodDef;
|
|
else if (!requireParameters && methodDef.Parameters.Count == 0)
|
|
return methodDef;
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the first public constructor with no parameters.
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public static MethodDefinition GetConstructor(this TypeReference typeRef, CodegenSession session)
|
|
{
|
|
return typeRef.CachedResolve(session).GetConstructor();
|
|
}
|
|
/// <summary>
|
|
/// Gets the first public constructor with no parameters.
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public static MethodDefinition GetConstructor(this TypeDefinition typeDef)
|
|
{
|
|
foreach (MethodDefinition methodDef in typeDef.Methods)
|
|
{
|
|
if (methodDef.IsConstructor && methodDef.IsPublic && methodDef.Parameters.Count == 0)
|
|
return methodDef;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets all constructors on typeDef.
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public static List<MethodDefinition> GetConstructors(this TypeDefinition typeDef)
|
|
{
|
|
List<MethodDefinition> lst = new List<MethodDefinition>();
|
|
foreach (MethodDefinition methodDef in typeDef.Methods)
|
|
{
|
|
if (methodDef.IsConstructor)
|
|
lst.Add(methodDef);
|
|
}
|
|
|
|
return lst;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Gets constructor which has arguments.
|
|
/// </summary>
|
|
/// <param name="typeRef"></param>
|
|
/// <returns></returns>
|
|
public static MethodDefinition GetConstructor(this TypeReference typeRef, CodegenSession session, Type[] arguments)
|
|
{
|
|
return typeRef.CachedResolve(session).GetConstructor(arguments);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets constructor which has arguments.
|
|
/// </summary>
|
|
/// <param name="typeDef"></param>
|
|
/// <returns></returns>
|
|
public static MethodDefinition GetConstructor(this TypeDefinition typeDef, Type[] arguments)
|
|
{
|
|
Type[] argsCopy = (arguments == null) ? new Type[0] : arguments;
|
|
foreach (MethodDefinition methodDef in typeDef.Methods)
|
|
{
|
|
if (methodDef.IsConstructor && methodDef.IsPublic && methodDef.Parameters.Count == argsCopy.Length)
|
|
{
|
|
bool match = true;
|
|
for (int i = 0; i < argsCopy.Length; i++)
|
|
{
|
|
if (methodDef.Parameters[0].ParameterType.FullName != argsCopy[i].FullName)
|
|
{
|
|
match = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (match)
|
|
return methodDef;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Gets constructor which has arguments.
|
|
/// </summary>
|
|
/// <param name="typeRef"></param>
|
|
/// <returns></returns>
|
|
public static MethodDefinition GetConstructor(this TypeReference typeRef, CodegenSession session, TypeReference[] arguments)
|
|
{
|
|
return typeRef.CachedResolve(session).GetConstructor(arguments);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets constructor which has arguments.
|
|
/// </summary>
|
|
/// <param name="typeDef"></param>
|
|
/// <returns></returns>
|
|
public static MethodDefinition GetConstructor(this TypeDefinition typeDef, TypeReference[] arguments)
|
|
{
|
|
TypeReference[] argsCopy = (arguments == null) ? new TypeReference[0] : arguments;
|
|
foreach (MethodDefinition methodDef in typeDef.Methods)
|
|
{
|
|
if (methodDef.IsConstructor && methodDef.IsPublic && methodDef.Parameters.Count == argsCopy.Length)
|
|
{
|
|
bool match = true;
|
|
for (int i = 0; i < argsCopy.Length; i++)
|
|
{
|
|
if (methodDef.Parameters[0].ParameterType.FullName != argsCopy[i].FullName)
|
|
{
|
|
match = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (match)
|
|
return methodDef;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Resolves the constructor with parameterCount for typeRef.
|
|
/// </summary>
|
|
/// <param name="typeRef"></param>
|
|
/// <returns></returns>
|
|
public static MethodDefinition GetConstructor(this TypeReference typeRef, CodegenSession session, int parameterCount)
|
|
{
|
|
return typeRef.CachedResolve(session).GetConstructor(parameterCount);
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Resolves the constructor with parameterCount for typeRef.
|
|
/// </summary>
|
|
/// <param name="typeDef"></param>
|
|
/// <returns></returns>
|
|
public static MethodDefinition GetConstructor(this TypeDefinition typeDef, int parameterCount)
|
|
{
|
|
foreach (MethodDefinition methodDef in typeDef.Methods)
|
|
{
|
|
if (methodDef.IsConstructor && methodDef.IsPublic && methodDef.Parameters.Count == parameterCount)
|
|
return methodDef;
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
} |