in src/Refasmer/Importer/ImportLogic.cs [38:149]
private TypeDefinitionHandle ImportTypeDefinitionSkeleton(TypeDefinitionHandle srcHandle, bool omitMembers)
{
var src = _reader.GetTypeDefinition(srcHandle);
var dstHandle = _builder.AddTypeDefinition(src.Attributes, ImportValue(src.Namespace), ImportValue(src.Name),
Import(src.BaseType), NextFieldHandle(), NextMethodHandle());
Trace?.Invoke($"Imported {_reader.ToString(src)} -> {RowId(dstHandle)}");
if (omitMembers) return dstHandle;
using var _ = WithLogPrefix($"[{_reader.ToString(src)}]");
var isValueType = _reader.GetFullname(src.BaseType) == "System::ValueType";
var isEnum = _reader.GetFullname(src.BaseType) == "System::Enum";
var forcePreservePrivateInstanceFields = isValueType && Filter?.OmitNonApiMembers == false;
var forcePreserveAllFields = isEnum && Filter?.OmitNonApiMembers == false;
List<FieldDefinition>? importedInstanceFields = null;
List<FieldDefinition>? skippedInstanceFields = null;
if (forcePreservePrivateInstanceFields)
Trace?.Invoke($"{_reader.ToString(src)} is ValueType, all fields should be imported");
else if (forcePreserveAllFields)
Trace?.Invoke($"{_reader.ToString(src)} is an Enum, all fields should be imported.");
else
{
importedInstanceFields = [];
skippedInstanceFields = [];
}
foreach (var srcFieldHandle in src.GetFields())
{
var srcField = _reader.GetFieldDefinition(srcFieldHandle);
var isStatic = (srcField.Attributes & FieldAttributes.Static) != 0;
var isForcedToInclude =
(forcePreservePrivateInstanceFields && !isStatic)
|| forcePreserveAllFields;
if (!isForcedToInclude && Filter?.AllowImport(srcField, _reader) == false)
{
Trace?.Invoke($"Not imported {_reader.ToString(srcField)}");
if (!isStatic)
skippedInstanceFields?.Add(srcField);
continue;
}
var dstFieldHandle = _builder.AddFieldDefinition(srcField.Attributes, ImportValue(srcField.Name),
ImportSignatureWithHeader(srcField.Signature));
_fieldDefinitionCache.Add(srcFieldHandle, dstFieldHandle);
Trace?.Invoke($"Imported {_reader.ToString(srcFieldHandle)} -> {RowId(dstFieldHandle)}");
if (!isStatic)
importedInstanceFields?.Add(srcField);
}
if (!forcePreservePrivateInstanceFields && !forcePreserveAllFields)
PostProcessSkippedValueTypeFields(skippedInstanceFields!, importedInstanceFields!);
var implementations = GetAllowlistedInterfaceMethodImplementations(src);
foreach (var srcMethodHandle in src.GetMethods())
{
var srcMethod = _reader.GetMethodDefinition(srcMethodHandle);
if (!AllowImportMethod(implementations, srcMethodHandle, srcMethod))
{
Trace?.Invoke($"Not imported {_reader.ToString(srcMethod)}");
continue;
}
var dstSignature = ImportSignatureWithHeader(srcMethod.Signature);
if (dstSignature.IsNil)
{
Trace?.Invoke($"Not imported because of signature {_reader.ToString(srcMethod)}");
continue;
}
var isAbstract = srcMethod.Attributes.HasFlag(MethodAttributes.Abstract);
var bodyOffset = !isAbstract && MakeMock ? MakeMockBody(srcMethodHandle) : -1;
var dstMethodHandle = _builder.AddMethodDefinition(srcMethod.Attributes, srcMethod.ImplAttributes,
ImportValue(srcMethod.Name), dstSignature, bodyOffset, NextParameterHandle());
_methodDefinitionCache.Add(srcMethodHandle, dstMethodHandle);
Trace?.Invoke($"Imported {_reader.ToString(srcMethod)} -> {RowId(dstMethodHandle)}");
using var __ = WithLogPrefix($"[{_reader.ToString(srcMethod)}]");
foreach (var srcParameterHandle in srcMethod.GetParameters())
{
var srcParameter = _reader.GetParameter(srcParameterHandle);
var dstParameterHandle = _builder.AddParameter(srcParameter.Attributes,
ImportValue(srcParameter.Name), srcParameter.SequenceNumber);
_parameterCache.Add(srcParameterHandle, dstParameterHandle);
Trace?.Invoke($"Imported {_reader.ToString(srcParameter)} -> {RowId(dstParameterHandle)}");
var defaultValue = srcParameter.GetDefaultValue();
if (!defaultValue.IsNil)
ImportDefaultValue(defaultValue, dstParameterHandle);
if (!srcParameter.GetMarshallingDescriptor().IsNil)
{
_builder.AddMarshallingDescriptor(dstParameterHandle, ImportValue(srcParameter.GetMarshallingDescriptor()));
Trace?.Invoke($"Imported marshalling descriptor {_reader.ToString(srcParameter.GetMarshallingDescriptor())}");
}
}
}
return dstHandle;
}