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;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
| } |