Пример #1
0
        protected internal unsafe override SwiftType GetSwiftType(Type attributedType, SwiftType []?typeArgs)
        {
            if (mangledName is null)
            {
                mangledName = SwiftType.Mangle(attributedType);
            }
            if (typeArgs is null)
            {
                return(new SwiftType(lib, mangledName, attributedType));
            }

            // If this is generic, then it might be a couple different things.
            if (!mangledName.StartsWith("$s", StringComparison.Ordinal))
            {
                mangledName = "$s" + mangledName;
            }
            if (mangledName.EndsWith("MQ", StringComparison.Ordinal))
            {
                // opaque type
                var args = stackalloc void * [typeArgs.Length];
                for (var i = 0; i < typeArgs.Length; i++)
                {
                    args [i] = typeArgs [i].Metadata;
                }
                return(new SwiftType(lib, SwiftCoreLib.GetOpaqueTypeMetadata(0, args, lib.RequireSymbol(mangledName), 0)));
            }
            else
            {
                // get type from metadata accessor function
                if (!mangledName.EndsWith("Mp", StringComparison.Ordinal))
                {
                    mangledName += "Ma";
                }

                var ftnPtr = lib.RequireSymbol(mangledName);
                var args   = new List <object> (typeArgs.Length * 2);
                args.Add((long)0);                  // metadataReq arg

                // determine how many additional arguments based on number of generic parameters and constraints
                var tparams = attributedType.GetGenericTypeDefinition().GetGenericArguments();
                for (var i = 0; i < typeArgs.Length; i++)
                {
                    args.Add((IntPtr)typeArgs [i].Metadata);
                    // also add any constraints
                    var constraints = tparams [i].GetGenericParameterConstraints();
                    foreach (var constr in constraints)
                    {
                        var attr = constr.GetCustomAttribute <SwiftProtocolAttribute> (inherit: false);
                        if (attr != null)
                        {
                            args.Add((IntPtr)typeArgs [i].GetProtocolConformance(attr.Descriptor));
                        }
                    }
                }
                var del = MetadataReq.MakeDelegate(args.Count - 1, ftnPtr);
                return(new SwiftType(lib, (IntPtr)del.DynamicInvoke(args.ToArray()), null, attributedType, typeArgs));
            }
        }
Пример #2
0
 public SwiftProtocolAttribute(string libraryPath, string module, string name)
     : this(libraryPath, SwiftType.Mangle(module, name))
 {
 }
Пример #3
0
 // FIXME: Does this belong somewhere else?
 public ProtocolDescriptor *GetProtocol(string module, string name)
 => (ProtocolDescriptor *)RequireSymbol("$s" + SwiftType.Mangle(module, name) + "Mp");