using MonoFN.Cecil; using System; namespace FishNet.CodeGenerating.Helping.Extension { internal static class ParameterDefinitionExtensions { private static IGenericParameterProvider GetSafeContext(CodegenSession session, IGenericParameterProvider context) { return context != null && context.Module == session.Module ? context : null; } /// /// Returns if parameterDef is Type. /// /// /// /// public static bool Is(this ParameterDefinition parameterDef, Type type) { return parameterDef.ParameterType.FullName == type.FullName; } /// /// Clones a parameter into the current session module. /// public static ParameterDefinition CloneImported(this ParameterDefinition parameterDef, CodegenSession session, IGenericParameterProvider context = null, string nameOverride = null) { IGenericParameterProvider safeContext = GetSafeContext(session, context); TypeReference parameterTypeRef = safeContext == null ? session.ImportReference(parameterDef.ParameterType) : session.ImportReference(parameterDef.ParameterType, safeContext); ParameterDefinition result = new(nameOverride ?? parameterDef.Name, parameterDef.Attributes, parameterTypeRef) { Constant = parameterDef.Constant, IsReturnValue = parameterDef.IsReturnValue, IsOut = parameterDef.IsOut, IsIn = parameterDef.IsIn, IsLcid = parameterDef.IsLcid, IsOptional = parameterDef.IsOptional, HasConstant = parameterDef.HasConstant, HasDefault = parameterDef.HasDefault, HasFieldMarshal = parameterDef.HasFieldMarshal }; if (parameterDef.HasMarshalInfo) result.MarshalInfo = parameterDef.MarshalInfo; foreach (CustomAttribute item in parameterDef.CustomAttributes) result.CustomAttributes.Add(item.CloneImported(session, safeContext)); return result; } } }