using FishNet.CodeGenerating.ILCore;
using MonoFN.Cecil;
using System;
using System.Linq.Expressions;
using System.Reflection;
namespace FishNet.CodeGenerating.Helping.Extension
{
    public static class ModuleDefinitionExtensions
    {
        /// 
        /// Gets a class within a module.
        /// 
        /// 
        /// 
        public static TypeDefinition GetClass(this ModuleDefinition moduleDef, string className, string namespaceName = "")
        {
            if (namespaceName.Length == 0)
                namespaceName = FishNetILPP.RUNTIME_ASSEMBLY_NAME;
            
            return moduleDef.GetType(namespaceName, className);
        }
        public static MethodReference ImportReference(this ModuleDefinition moduleDef, Expression expression)
        {
            return ImportReference(moduleDef, (LambdaExpression)expression);
        }
        public static MethodReference ImportReference(this ModuleDefinition module, Expression> expression)
        {
            return ImportReference(module, (LambdaExpression)expression);
        }
        public static MethodReference ImportReference(this ModuleDefinition module, LambdaExpression expression)
        {
            if (expression.Body is MethodCallExpression outermostExpression)
            {
                MethodInfo methodInfo = outermostExpression.Method;
                return module.ImportReference(methodInfo);
            }
            if (expression.Body is NewExpression newExpression)
            {
                ConstructorInfo methodInfo = newExpression.Constructor;
                // constructor is null when creating an ArraySegment