public void TestEmptyTuple()
        {
            TupleTypeSpec tuple = TypeSpecParser.Parse("()") as TupleTypeSpec;

            Assert.IsNotNull(tuple);
            Assert.AreEqual(0, tuple.Elements.Count);
        }
 void GetUniqueGenericTypeNamesFor(TupleTypeSpec candidate, HashSet <string> result)
 {
     foreach (var element in candidate.Elements)
     {
         GetUniqueGenericTypeNamesFor(element, result);
     }
 }
        public void TestFuncVoidVoid()
        {
            ClosureTypeSpec close = TypeSpecParser.Parse("() -> ()") as ClosureTypeSpec;

            Assert.NotNull(close);
            TupleTypeSpec ts = close.Arguments as TupleTypeSpec;

            Assert.NotNull(ts);
            Assert.AreEqual(0, ts.Elements.Count);
            ts = close.ReturnType as TupleTypeSpec;
            Assert.NotNull(ts);
            Assert.AreEqual(0, ts.Elements.Count);
        }
        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);
        }
        public void TestWithAttributes()
        {
            TupleTypeSpec tupled = TypeSpecParser.Parse("(Builtin.RawPointer, (@convention[thin] (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout SomeModule.Foo, @thick SomeModule.Foo.Type) -> ())?)")
                                   as TupleTypeSpec;

            Assert.NotNull(tupled);
            var ns = tupled.Elements [1] as NamedTypeSpec;

            Assert.IsTrue(ns.ContainsGenericParameters);
            Assert.AreEqual("Swift.Optional", ns.Name);
            var close = ns.GenericParameters[0] as ClosureTypeSpec;

            Assert.AreEqual(1, close.Attributes.Count);
        }
 bool TupleTypesMatch(FunctionDeclaration protoFunc, TupleTypeSpec protoType, FunctionDeclaration classFunc, TupleTypeSpec classType)
 {
     if (protoType.Elements.Count != classType.Elements.Count)
     {
         return(false);
     }
     for (int i = 0; i < protoType.Elements.Count; i++)
     {
         if (!TypesMatch(protoFunc, protoType.Elements [i], classFunc, classType.Elements [i]))
         {
             return(false);
         }
     }
     return(true);
 }
        static bool TypeMatches(FunctionDeclaration decl, TupleTypeSpec ts, SwiftType st, TypeMapper typeMap)
        {
            var tuple = st as SwiftTupleType;

            if (tuple == null || tuple.Contents.Count != ts.Elements.Count)
            {
                return(false);
            }
            for (int i = 0; i < ts.Elements.Count; i++)
            {
                if (!TypeMatches(decl, ts.Elements [i], tuple.Contents [i], typeMap))
                {
                    return(false);
                }
            }
            return(true);
        }
        TypeSpec RebuildTypeWithGenericType(TupleTypeSpec type, out bool changed)
        {
            changed = false;
            var newTupleElems = new TypeSpec [type.Elements.Count];

            for (int i = 0; i < type.Elements.Count; i++)
            {
                bool elemChanged;
                newTupleElems [i] = RebuildTypeWithGenericType(type.Elements [i], out elemChanged);
                changed           = changed || elemChanged;
            }

            if (changed)
            {
                return(new TupleTypeSpec(newTupleElems));
            }
            return(type);
        }
        SLBaseExpr MarshalTupleTypeSpec(BaseDeclaration declContext, string name, TupleTypeSpec tuple)
        {
            var bindingName = new SLIdentifier(MarshalEngine.Uniqueify(name, identifiersUsed));
            var argType     = typeMapper.TypeSpecMapper.MapType(declContext, imports, tuple, false);
            var ptrType     = new SLBoundGenericType("UnsafeMutablePointer", argType);

            identifiersUsed.Add(bindingName.Name);
            var decl = new SLDeclaration(true, bindingName, ptrType,
                                         new SLFunctionCall(ptrType + ".allocate", false, new SLArgument(new SLIdentifier("capacity"), SLConstant.Val(1), true)),
                                         Visibility.None, false);
            var varBinding = new SLLine(decl);

            preMarshalCode.Add(varBinding);
            var initCall = SLFunctionCall.FunctionCallLine(bindingName.Name + ".initialize",
                                                           new SLArgument(new SLIdentifier("to"), new SLIdentifier(name), true));

            preMarshalCode.Add(initCall);
            imports.AddIfNotPresent("XamGlue");
            if (tuple.IsInOut)
            {
                postMarshalCode.Add(new SLLine(new SLBinding(name, bindingName.Dot(new SLIdentifier("pointee")))));
            }
            return(new SLFunctionCall("toIntPtr", false, new SLArgument(new SLIdentifier("value"), bindingName, true)));
        }
예제 #10
0
 SLType MapType(BaseDeclaration declContext, SLImportModules modules, TupleTypeSpec spec)
 {
     return(new SLTupleType(spec.Elements.Select(p => new SLNameTypePair((string)null, MapType(declContext, modules, p, false))).ToList()));
 }