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)); } }
public SwiftProtocolAttribute(string libraryPath, string module, string name) : this(libraryPath, SwiftType.Mangle(module, name)) { }
// FIXME: Does this belong somewhere else? public ProtocolDescriptor *GetProtocol(string module, string name) => (ProtocolDescriptor *)RequireSymbol("$s" + SwiftType.Mangle(module, name) + "Mp");