in src/Refasmer/Importer/ImportLogic.cs [457:578]
public ReservedBlob<GuidHandle> Import()
{
if (_reader.IsAssembly)
{
var srcAssembly = _reader.GetAssemblyDefinition();
_builder.AddAssembly(ImportValue(srcAssembly.Name), srcAssembly.Version,
ImportValue(srcAssembly.Culture),
ImportValue(srcAssembly.PublicKey), srcAssembly.Flags, srcAssembly.HashAlgorithm);
Debug?.Invoke($"Imported assembly {_reader.ToString(srcAssembly)}");
}
var srcModule = _reader.GetModuleDefinition();
var mvidBlob = _builder.ReserveGuid();
_builder.AddModule(srcModule.Generation, ImportValue(srcModule.Name), mvidBlob.Handle,
ImportValue(srcModule.GenerationId),
ImportValue(srcModule.BaseGenerationId));
Debug?.Invoke($"Imported module {_reader.ToString(srcModule)}");
Debug?.Invoke("Importing assembly files");
foreach (var srcHandle in _reader.AssemblyFiles)
Import(srcHandle);
Debug?.Invoke("Preparing type list for import");
// 1. Process/assign numbers to the initial set of the imported types.
var internalTypesToPreserve = new HashSet<TypeDefinitionHandle>();
var initialTypeDefinitions = TypeImportPass(_reader, internalTypesToPreserve, Filter, Trace);
if (Filter?.OmitNonApiMembers == true)
{
// 2. If required, seek for the additional internal types to import.
Debug?.Invoke("Enumerating the internal types for import.");
foreach (var internalTypeHandle in CalculateInternalTypesToPreserve(initialTypeDefinitions.Keys))
{
internalTypesToPreserve.Add(internalTypeHandle);
}
// 3. Enumerate the imported types again, to assign proper final numbering.
_typeDefinitionCache = TypeImportPass(_reader, internalTypesToPreserve, Filter, Trace);
}
else
{
_typeDefinitionCache = initialTypeDefinitions;
}
Debug?.Invoke("Importing type definitions");
foreach (var srcHandle in _reader.TypeDefinitions.Where(_typeDefinitionCache.ContainsKey))
{
var shouldOmitMembers = ShouldOmitTypeMembers(srcHandle, internalTypesToPreserve);
var dstHandle = ImportTypeDefinitionSkeleton(srcHandle, shouldOmitMembers);
if (dstHandle != _typeDefinitionCache[srcHandle])
throw new Exception(
"WTF: type handle mismatch." +
$" Original type {_reader.GetFullname(srcHandle)}," +
$" already created handle {MetaUtil.RowId(srcHandle)}," +
$" new handle {MetaUtil.RowId(dstHandle)}.");
}
Debug?.Invoke("Importing type definition accessories");
foreach (var (srcHandle, dstHandle) in _typeDefinitionCache)
ImportTypeDefinitionAccessories(srcHandle, dstHandle);
Debug?.Invoke("Importing method definition accessories");
foreach (var (srcHandle, dstHandle) in _methodDefinitionCache)
ImportMethodDefinitionAccessories(srcHandle, dstHandle);
Debug?.Invoke("Importing field definition accessories");
foreach (var (srcHandle, dstHandle) in _fieldDefinitionCache)
ImportFieldDefinitionAccessories(srcHandle, dstHandle);
Debug?.Invoke("Importing nested classes");
var nestedTypes = _typeDefinitionCache
.Select(kv => Tuple.Create(kv.Value, _reader.GetTypeDefinition(kv.Key).GetNestedTypes()))
.SelectMany(x => x.Item2.Select(y => Tuple.Create(x.Item1, y, Import(y))))
.Where(x => !x.Item3.IsNil)
.OrderBy(x => RowId(x.Item3))
.ToList();
foreach (var (dstHandle, srcNested, dstNested) in nestedTypes)
{
_builder.AddNestedType(dstNested, dstHandle);
Trace?.Invoke($"Imported nested type {_reader.ToString(srcNested)} -> {RowId(dstNested)}");
}
var generic = _typeDefinitionCache
.Select(kv =>
Tuple.Create((EntityHandle)kv.Value, _reader.GetTypeDefinition(kv.Key).GetGenericParameters()))
.Concat(_methodDefinitionCache
.Select(kv => Tuple.Create((EntityHandle)kv.Value,
_reader.GetMethodDefinition(kv.Key).GetGenericParameters())))
.OrderBy(x => CodedIndex.TypeOrMethodDef(x.Item1))
.ToList();
Debug?.Invoke("Importing generic constraints");
foreach (var (dstHandle, genericParams) in generic)
ImportGenericConstraints(dstHandle, genericParams);
Debug?.Invoke("Importing custom attributes");
foreach (var src in _reader.CustomAttributes)
Import(src);
Debug?.Invoke("Importing declarative security attributes");
foreach (var src in _reader.DeclarativeSecurityAttributes)
Import(src);
Debug?.Invoke("Importing exported types");
foreach (var src in _reader.ExportedTypes)
Import(src);
if (!OmitReferenceAssemblyAttr && !MakeMock && !IsReferenceAssembly())
AddReferenceAssemblyAttribute();
if (MakeMock)
_builder.GetOrAddBlob(_ilStream);
Debug?.Invoke("Importing done");
return mvidBlob;
}