private EntityHandle FindOrCreateReferenceAssemblyAttributeCtor()

in src/Refasmer/Importer/ReferenceAssemblyAttr.cs [71:107]


    private EntityHandle FindOrCreateReferenceAssemblyAttributeCtor()
    {
        var ctorHandle = FindMethod(FullNames.ReferenceAssembly, ".ctor", CheckRefAsmAttrCtorSignature);

        if (!IsNil(ctorHandle))
        {
            Trace?.Invoke($"Found {FullNames.ReferenceAssembly} constructor with void signature {_reader.ToString(ctorHandle)}");                
            return Import(ctorHandle);
        }

        Trace?.Invoke($"Not found {FullNames.ReferenceAssembly} constructor");                
        var runtimeRef = FindRuntimeReference();

        if (!IsNil(runtimeRef))
        {
            Trace?.Invoke($"Found runtime reference {_reader.ToString(runtimeRef)}");

            var referenceAssemblyAttrTypeRef = _builder.AddTypeReference(runtimeRef,
                _builder.GetOrAddString(FullNames.CompilerServices),
                _builder.GetOrAddString("ReferenceAssemblyAttribute"));

            var ctor = new BlobBuilder();

            new BlobEncoder(ctor).MethodSignature(isInstanceMethod: true).Parameters(0, t => t.Void(), p => { });

            var ctorBlob = _builder.GetOrAddBlob(ctor);

            ctorHandle = _builder.AddMemberReference(referenceAssemblyAttrTypeRef, _builder.GetOrAddString(".ctor"),
                ctorBlob);
            Trace?.Invoke($"Created ReferenceAssemblyAttribute constructor reference {RowId(ctorHandle)}");

            return ctorHandle;
        }
        Trace?.Invoke($"Not found runtime reference");

        return CreateCustomReferenceAssemblyAttributeCtor();
    }