コード例 #1
0
        static bool TypeMatches(FunctionDeclaration decl, NamedTypeSpec ts, SwiftExistentialMetaType st, TypeMapper typeMap)
        {
            if (st == null)
            {
                return(false);
            }
            if (st.Protocol.Protocols.Count != 1)
            {
                return(false);
            }
            var protoClass = st.Protocol.Protocols [0];

            if (ts.Name == "Any.Type")
            {
                return(protoClass.ClassName.ToFullyQualifiedName() == "Swift.Any");
            }
            if (ts.Name == protoClass.ClassName.ToFullyQualifiedName())
            {
                return(true);
            }
            if (ts.Name.EndsWith(".Type", StringComparison.Ordinal))
            {
                var maybeClassName = ts.Name.Substring(0, ts.Name.Length - ".Type".Length);
                return(maybeClassName == protoClass.ClassName.ToFullyQualifiedName());
            }
            return(false);
        }
コード例 #2
0
        SLBaseExpr MarshalNamedTypeSpec(BaseDeclaration declContext, string name, NamedTypeSpec spec)
        {
            if (typeMapper.GetEntityForTypeSpec(spec) == null)
            {
                throw new NotImplementedException($"Unknown type {name}:{spec.ToString ()} in context {declContext.ToFullyQualifiedName (true)}");
            }
            bool isClass = NamedSpecIsClass(spec);

            if (isClass || spec.IsInOut)
            {
                imports.AddIfNotPresent("XamGlue");
                return(new SLFunctionCall("toIntPtr", false,
                                          new SLArgument(new SLIdentifier("value"), new SLIdentifier(name), true)));
            }

            if (TypeSpec.IsBuiltInValueType(spec))
            {
                return(new SLIdentifier(name));
            }

            // at this point, the value is either an enum or a struct, not passed by reference which we need to copy
            // into a local which we can then pass by reference.

            var bindingName = new SLIdentifier(MarshalEngine.Uniqueify(name, identifiersUsed));

            identifiersUsed.Add(bindingName.Name);
            var decl = new SLDeclaration(false, bindingName, typeMapper.TypeSpecMapper.MapType(declContext, imports, spec, false),
                                         new SLIdentifier(name), Visibility.None, false);
            var varBinding = new SLLine(decl);

            preMarshalCode.Add(varBinding);
            return(new SLAddressOf(bindingName, false));
        }
コード例 #3
0
        static bool TypeMatches(FunctionDeclaration decl, NamedTypeSpec ts, SwiftBuiltInType st, TypeMapper typeMap)
        {
            if (st == null)
            {
                return(false);
            }
            if (ts.IsInOut != st.IsReference)
            {
                return(false);
            }
            switch (st.BuiltInType)
            {
            case CoreBuiltInType.Bool:
                return(ts.Name == "Swift.Bool");

            case CoreBuiltInType.Double:
                return(ts.Name == "Swift.Double");

            case CoreBuiltInType.Float:
                return(ts.Name == "Swift.Float");

            case CoreBuiltInType.Int:
                return(ts.Name == "Swift.Int");

            case CoreBuiltInType.UInt:
                return(ts.Name == "Swift.UInt");

            default:
                throw new ArgumentOutOfRangeException("st");
            }
        }
コード例 #4
0
        static bool TypeMatches(FunctionDeclaration decl, NamedTypeSpec ts, SwiftType st, TypeMapper typeMap)
        {
            switch (st.Type)
            {
            case CoreCompoundType.Scalar:
                return(TypeMatches(decl, ts, st as SwiftBuiltInType, typeMap));

            case CoreCompoundType.Class:
                return(TypeMatches(decl, ts, st as SwiftClassType, typeMap));

            case CoreCompoundType.MetaClass:
                if (st is SwiftExistentialMetaType exist)
                {
                    return(TypeMatches(decl, ts, exist, typeMap));
                }
                else
                {
                    return(TypeMatches(decl, ts, st as SwiftMetaClassType, typeMap));
                }

            case CoreCompoundType.BoundGeneric:
                return(TypeMatches(decl, ts, st as SwiftBoundGenericType, typeMap));

            case CoreCompoundType.ProtocolList:
                return(TypeMatches(decl, ts, st as SwiftProtocolListType, typeMap));

            case CoreCompoundType.GenericReference:
                return(TypeMatches(decl, ts, st as SwiftGenericArgReferenceType, typeMap));

            case CoreCompoundType.Struct:
            default:
                return(false);
            }
        }
コード例 #5
0
        SLType MapType(BaseDeclaration declContext, SLImportModules modules, NamedTypeSpec spec)
        {
            SLType retval = null;

            if (spec.HasModule)
            {
                modules.AddIfNotPresent(spec.Module);
            }
            if (declContext.IsTypeSpecGeneric(spec) && !spec.ContainsGenericParameters)
            {
                Tuple <int, int> depthIndex = declContext.GetGenericDepthAndIndex(spec);
                retval = new SLGenericReferenceType(depthIndex.Item1, depthIndex.Item2);
            }
            else if (spec.ContainsGenericParameters)
            {
                retval = new SLBoundGenericType(spec.NameWithoutModule, spec.GenericParameters.Select(p => MapType(declContext, modules, p, false)));
            }
            else
            {
                retval = new SLSimpleType(spec.Name.NameWithoutModule());
            }

            if (spec.InnerType == null)
            {
                return(retval);
            }
            else
            {
                return(new SLCompoundType(retval, MapType(declContext, modules, spec.InnerType)));
            }
        }
コード例 #6
0
        TypeSpec RebuildTypeWithGenericType(NamedTypeSpec type, out bool changed)
        {
            bool   nameChanged = false, genArgsChanged = false;
            string newName   = null;
            var    assocType = GetAssociatedTypeNamed(type.Name);

            if (assocType != null)
            {
                nameChanged = true;
                newName     = GenericTypeNameFor(assocType.Name);
            }
            TypeSpec [] newGenParms = type.GenericParameters.ToArray();
            if (type.GenericParameters != null)
            {
                newGenParms = new TypeSpec [type.GenericParameters.Count];
                for (int i = 0; i < newGenParms.Length; i++)
                {
                    bool genChanged;
                    newGenParms [i] = (RebuildTypeWithGenericType(type.GenericParameters [i], out genChanged));
                    genArgsChanged  = genArgsChanged || genChanged;
                }
            }
            changed = nameChanged || genArgsChanged;
            if (changed)
            {
                return(new NamedTypeSpec(newName, newGenParms));
            }
            return(type);
        }
コード例 #7
0
        public void TestSimpleType()
        {
            NamedTypeSpec ns = TypeSpecParser.Parse("Swift.Int") as NamedTypeSpec;

            Assert.IsNotNull(ns);
            Assert.AreEqual("Swift.Int", ns.Name);
        }
コード例 #8
0
 static bool TypeMatches(FunctionDeclaration decl, NamedTypeSpec ts, SwiftMetaClassType st, TypeMapper typeMap)
 {
     if (st == null)
     {
         return(false);
     }
     return(ts.Name == st.Class.ClassName.ToFullyQualifiedName(true));
 }
コード例 #9
0
        public void TestSingleTuple()
        {
            // single tuples get folded into their type
            NamedTypeSpec ns = TypeSpecParser.Parse("(Swift.Int)") as NamedTypeSpec;

            Assert.NotNull(ns);
            Assert.AreEqual("Swift.Int", ns.Name);
        }
コード例 #10
0
        public void TestEmbeddedClass()
        {
            NamedTypeSpec ns = TypeSpecParser.Parse("Swift.Dictionary<Swift.String, T>.Index") as NamedTypeSpec;

            Assert.IsNotNull(ns);
            Assert.IsNotNull(ns.InnerType);
            Assert.AreEqual("Index", ns.InnerType.Name);
            Assert.AreEqual("Swift.Dictionary<Swift.String, T>.Index", ns.ToString());
        }
コード例 #11
0
 static bool TypeMatches(FunctionDeclaration decl, NamedTypeSpec ts, SwiftClassType ct, TypeMapper typeMap)
 {
     if (ct == null)
     {
         return(false);
     }
     return(ts.Name == ct.ClassName.ToFullyQualifiedName(true) ||
            ts.NameWithoutModule == ct.ClassName.ToFullyQualifiedName(false));
 }
コード例 #12
0
        static bool TypeMatches(FunctionDeclaration decl, NamedTypeSpec ts, SwiftGenericArgReferenceType genArg)
        {
            if (!decl.IsTypeSpecGeneric(ts))
            {
                return(false);
            }
            var depthAndIndex = decl.GetGenericDepthAndIndex(ts.Name);

            return(genArg.Depth == depthAndIndex.Item1 && genArg.Index == depthAndIndex.Item2);
        }
コード例 #13
0
        public void TestProtocolListAlphabetical1()
        {
            var specs = new NamedTypeSpec [] {
                new NamedTypeSpec("🤡Foo"),
                new NamedTypeSpec("💩Foo"),
            };

            var protos = new ProtocolListTypeSpec(specs);

            Assert.AreEqual("💩Foo & 🤡Foo", protos.ToString(), "ToString mismatch");
        }
コード例 #14
0
 static bool TypeMatches(FunctionDeclaration decl, NamedTypeSpec ts, SwiftBoundGenericType st, TypeMapper typeMap)
 {
     if (st == null)
     {
         return(false);
     }
     if (!ts.ContainsGenericParameters)
     {
         return(false);
     }
     return(TypeMatches(decl, ts.GenericParameters, st.BoundTypes, typeMap));
 }
コード例 #15
0
        public void TestArrayOfInt()
        {
            NamedTypeSpec ns = TypeSpecParser.Parse("Swift.Array<Swift.Int>") as NamedTypeSpec;

            Assert.NotNull(ns);
            Assert.AreEqual("Swift.Array", ns.Name);
            Assert.IsTrue(ns.ContainsGenericParameters);
            Assert.AreEqual(1, ns.GenericParameters.Count);
            ns = ns.GenericParameters [0] as NamedTypeSpec;
            Assert.NotNull(ns);
            Assert.AreEqual("Swift.Int", ns.Name);
        }
コード例 #16
0
        public void TestFuncIntInt()
        {
            ClosureTypeSpec close = TypeSpecParser.Parse("Swift.Int -> Swift.Int") as ClosureTypeSpec;

            Assert.NotNull(close);
            NamedTypeSpec ns = close.Arguments as NamedTypeSpec;

            Assert.NotNull(ns);
            Assert.AreEqual("Swift.Int", ns.Name);
            ns = close.ReturnType as NamedTypeSpec;
            Assert.NotNull(ns);
            Assert.AreEqual("Swift.Int", ns.Name);
        }
コード例 #17
0
        public void TestProtocolListAlphabetical()
        {
            var specs = new NamedTypeSpec [] {
                new NamedTypeSpec("Cfoo"),
                new NamedTypeSpec("Afoo"),
                new NamedTypeSpec("Dfoo"),
                new NamedTypeSpec("Bfoo")
            };

            var protos = new ProtocolListTypeSpec(specs);

            Assert.AreEqual("Afoo & Bfoo & Cfoo & Dfoo", protos.ToString(), "ToString mismatch");
        }
コード例 #18
0
        public void TestGeneric()
        {
            NamedTypeSpec ns = TypeSpecParser.Parse("Swift.UnsafeMutablePointer<(Swift.Int, Error, Swift.Bool)>") as NamedTypeSpec;

            Assert.NotNull(ns);
            Assert.AreEqual("Swift.UnsafeMutablePointer", ns.Name);
            Assert.IsTrue(ns.ContainsGenericParameters);
            Assert.AreEqual(1, ns.GenericParameters.Count);
            var ts = ns.GenericParameters [0] as TupleTypeSpec;

            Assert.NotNull(ts);
            Assert.AreEqual(3, ts.Elements.Count);
        }
コード例 #19
0
        public void TestDoubleTuple()
        {
            TupleTypeSpec tuple = TypeSpecParser.Parse("(Swift.Int, Swift.Float)") as TupleTypeSpec;

            Assert.IsNotNull(tuple);
            Assert.AreEqual(2, tuple.Elements.Count);
            NamedTypeSpec ns = tuple.Elements [0] as NamedTypeSpec;

            Assert.NotNull(ns);
            Assert.AreEqual("Swift.Int", ns.Name);
            ns = tuple.Elements [1] as NamedTypeSpec;
            Assert.NotNull(ns);
            Assert.AreEqual("Swift.Float", ns.Name);
        }
コード例 #20
0
        public void TestDictionaryOfIntString()
        {
            NamedTypeSpec ns = TypeSpecParser.Parse("Swift.Dictionary<Swift.Int, Swift.String>") as NamedTypeSpec;

            Assert.NotNull(ns);
            Assert.AreEqual("Swift.Dictionary", ns.Name);
            Assert.IsTrue(ns.ContainsGenericParameters);
            Assert.AreEqual(2, ns.GenericParameters.Count);
            NamedTypeSpec ns1 = ns.GenericParameters [0] as NamedTypeSpec;

            Assert.NotNull(ns1);
            Assert.AreEqual("Swift.Int", ns1.Name);
            ns1 = ns.GenericParameters [1] as NamedTypeSpec;
            Assert.NotNull(ns1);
            Assert.AreEqual("Swift.String", ns1.Name);
        }
コード例 #21
0
        void GetUniqueGenericTypeNamesFor(NamedTypeSpec candidate, HashSet <string> result)
        {
            var assocType = GetAssociatedTypeNamed(candidate.Name);

            if (assocType != null)
            {
                result.Add(GenericTypeNameFor(assocType.Name));
            }
            if (candidate.GenericParameters == null)
            {
                return;
            }
            foreach (var gen in candidate.GenericParameters)
            {
                GetUniqueGenericTypeNamesFor(gen, result);
            }
        }
コード例 #22
0
        void TestFuncReturning(string declaredType, string value, string expectedType)
        {
            string            code   = String.Format("public func foo() -> {0} {{ return {1} }}", declaredType, value);
            ModuleDeclaration module = ReflectToModules(code, "SomeModule").Find(m => m.Name == "SomeModule");

            Assert.IsNotNull(module);
            Assert.AreEqual(1, module.Functions.Count());
            FunctionDeclaration func = module.Functions.First();

            Assert.IsNotNull(func);
            Assert.AreEqual(func.Name, "foo");
            Assert.AreEqual(expectedType, func.ReturnTypeName);
            Assert.AreEqual(1, func.ParameterLists.Count);
            Assert.AreEqual(0, func.ParameterLists [0].Count);
            NamedTypeSpec ns = func.ReturnTypeSpec as NamedTypeSpec;

            Assert.NotNull(ns);
            Assert.AreEqual(expectedType, ns.Name);
        }
コード例 #23
0
        SLType MapType(BaseDeclaration declContext, SLImportModules modules, NamedTypeSpec spec)
        {
            SLType retval = null;

            if (spec.HasModule(declContext, this.parent))
            {
                modules.AddIfNotPresent(spec.Module);
            }
            if (declContext.IsTypeSpecGeneric(spec) && !spec.ContainsGenericParameters)
            {
                Tuple <int, int> depthIndex = declContext.GetGenericDepthAndIndex(spec);
                retval = new SLGenericReferenceType(depthIndex.Item1, depthIndex.Item2);
            }
            else if (spec.ContainsGenericParameters)
            {
                retval = new SLBoundGenericType(spec.NameWithoutModule, spec.GenericParameters.Select(p => MapType(declContext, modules, p, false)));
            }
            else
            {
                if (declContext.IsProtocolWithAssociatedTypesFullPath(spec, parent))
                {
                    // for T.AssocType
                    var genPart    = spec.Module;
                    var depthIndex = declContext.GetGenericDepthAndIndex(genPart);
                    var newGenPart = new SLGenericReferenceType(depthIndex.Item1, depthIndex.Item2);
                    retval = new SLSimpleType($"{newGenPart}.{spec.NameWithoutModule}");
                }
                else
                {
                    retval = new SLSimpleType(spec.NameWithoutModule);
                }
            }

            if (spec.InnerType == null)
            {
                return(retval);
            }
            else
            {
                return(new SLCompoundType(retval, MapType(declContext, modules, spec.InnerType)));
            }
        }
コード例 #24
0
        public void TestProtocolListNotMatch()
        {
            var specs1 = new NamedTypeSpec [] {
                new NamedTypeSpec("Cfoo"),
                new NamedTypeSpec("Afoo"),
                new NamedTypeSpec("Dfoo"),
                new NamedTypeSpec("Bfoo")
            };

            var specs2 = new NamedTypeSpec [] {
                new NamedTypeSpec("Afoo"),
                new NamedTypeSpec("Efoo"),
                new NamedTypeSpec("Cfoo"),
                new NamedTypeSpec("Bfoo")
            };

            var protos1 = new ProtocolListTypeSpec(specs1);
            var protos2 = new ProtocolListTypeSpec(specs2);

            Assert.IsFalse(protos1.Equals(protos2), "lists match?!");
        }
コード例 #25
0
 static bool TypeMatches(FunctionDeclaration decl, NamedTypeSpec ts, SwiftGenericArgReferenceType genArg, TypeMapper typeMap)
 {
     if (genArg.HasAssociatedTypePath)
     {
         if (!decl.IsProtocolWithAssociatedTypesFullPath(ts, typeMap))
         {
             return(false);
         }
         var parts = ts.Name.Split('.');
         // parts will have the generic part at 0, genArg will not
         if (parts.Length != genArg.AssociatedTypePath.Count + 1)
         {
             return(false);
         }
         var depthAndIndex = decl.GetGenericDepthAndIndex(parts [0]);
         if (genArg.Depth != depthAndIndex.Item1 || genArg.Index != depthAndIndex.Item2)
         {
             return(false);
         }
         for (int i = 0; i < genArg.AssociatedTypePath.Count; i++)
         {
             if (genArg.AssociatedTypePath [i] != parts [i + 1])
             {
                 return(false);
             }
         }
         return(true);
     }
     else
     {
         if (!decl.IsTypeSpecGeneric(ts))
         {
             return(false);
         }
         var depthAndIndex = decl.GetGenericDepthAndIndex(ts.Name);
         return(genArg.Depth == depthAndIndex.Item1 && genArg.Index == depthAndIndex.Item2);
     }
 }
コード例 #26
0
        SLBaseExpr MarshalGenericTypeSpec(BaseDeclaration declContext, string name, NamedTypeSpec spec, int depth, int index)
        {
            // given Foo(T x)
            // the vtable entry should be something like
            // foo : ((@convention(c)(UnsafeRawPointer)->())
            //
            // UnsafeMutablePointer<T> xPtr = UnsafeMutablePointer<T>.alloc(1);
            // pointerToX.initialize(x)
            // vtable.foo(toIntPtr(pointerToX))
            // pointerToX.deinitialize(1)
            // pointerToX.deallocate()
            imports.AddIfNotPresent("XamGlue");
            var xPtr = new SLIdentifier(MarshalEngine.Uniqueify(name + "Ptr", identifiersUsed));

            identifiersUsed.Add(xPtr.Name);
            var xPtrDecl = new SLDeclaration(true, xPtr, null,
                                             new SLFunctionCall(String.Format("UnsafeMutablePointer<{0}>.allocate", SLGenericReferenceType.DefaultNamer(depth, index)),
                                                                false, new SLArgument(new SLIdentifier("capacity"), SLConstant.Val(1), true)),
                                             Visibility.None);
            var xPtrBinding = new SLLine(xPtrDecl);

            preMarshalCode.Add(xPtrBinding);
            var xPtrInit = SLFunctionCall.FunctionCallLine(xPtr.Name + ".initialize",
                                                           new SLArgument(new SLIdentifier("to"), new SLIdentifier(name), true));

            preMarshalCode.Add(xPtrInit);

            var xPtrDeinit = SLFunctionCall.FunctionCallLine(xPtr.Name + ".deinitialize",
                                                             new SLArgument(new SLIdentifier("count"), SLConstant.Val(1), true));

            var xPtrDalloc = SLFunctionCall.FunctionCallLine(xPtr.Name + ".deallocate");

            postMarshalCode.Add(xPtrDeinit);
            postMarshalCode.Add(xPtrDalloc);

            return(new SLFunctionCall("toIntPtr", false, new SLArgument(new SLIdentifier("value"), xPtr, true)));
        }
コード例 #27
0
        bool NamedTypesMatch(FunctionDeclaration protoFunc, NamedTypeSpec protoType, FunctionDeclaration classFunc, NamedTypeSpec classType)
        {
            if (!GenericParametersMatch(protoFunc, protoType.GenericParameters, classFunc, classType.GenericParameters))
            {
                return(false);
            }

            var assoc = protocol.AssociatedTypeDeclarationFromNamedTypeSpec(protoType);

            if (assoc != null)
            {
                if (!wrapperClass.IsTypeSpecGenericReference(classType))
                {
                    return(false);
                }
                var depthIndex = wrapperClass.GetGenericDepthAndIndex(classType);
                var assocIndex = protocol.AssociatedTypes.IndexOf(assoc);
                return(assocIndex == depthIndex.Item2);
            }
            else
            {
                return(protoType.Name == classType.Name);
            }
        }
コード例 #28
0
        static bool TypeMatches(FunctionDeclaration decl, NamedTypeSpec ts, SwiftProtocolListType protList, TypeMapper typeMap)
        {
            if (protList == null)
            {
                return(false);
            }
            if (protList.Protocols.Count == 1 && !ts.IsProtocolList)
            {
                return(TypeMatches(decl, ts, protList.Protocols [0], typeMap));
            }

            if (protList.Protocols.Count != ts.GenericParameters.Count || !ts.IsProtocolList)
            {
                return(false);
            }
            for (int i = 0; i < ts.GenericParameters.Count; i++)
            {
                if (!TypeMatches(decl, ts.GenericParameters [i], protList.Protocols [i], typeMap))
                {
                    return(false);
                }
            }
            return(true);
        }
コード例 #29
0
 bool NamedSpecIsClass(NamedTypeSpec spec)
 {
     return(spec != null && typeMapper.GetEntityTypeForSwiftClassName(spec.Name) == EntityType.Class);
 }