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