Example #1
0
        public void CircularReferenceInclude()
        {
            string baseFbs  = "include \"A.fbs\"; namespace Foo; table BaseTable (PrecompiledSerializer) { OtherTable:OtherTable; }";
            var    includes = new Dictionary <string, string>
            {
                { "A.fbs", "include \"root.fbs\"; namespace Foo; table OtherTable (PrecompiledSerializer) { Foo:BaseTable; }" },
            };

            string cSharp = FlatSharpCompiler.TestHookCreateCSharp(baseFbs, includes);

            Assert.IsTrue(!string.IsNullOrEmpty(cSharp));
            Assert.IsTrue(cSharp.Contains("public static ISerializer<Foo.BaseTable> Serializer"));
            Assert.IsFalse(cSharp.Contains("public static ISerializer<Foo.OtherTable> Serializer"));

            BaseSchemaMember member = FlatSharpCompiler.TestHookParseSyntax(baseFbs, includes);

            Assert.IsTrue(member is RootNodeDefinition);
            Assert.AreEqual(1, member.Children.Count);

            NamespaceDefinition nsDef = (NamespaceDefinition)member.Children.Single().Value;

            Assert.AreEqual("Foo", nsDef.Name);

            Assert.AreEqual(2, nsDef.Children.Count);

            var basetable  = nsDef.Children["BaseTable"];
            var otherTable = nsDef.Children["OtherTable"];

            Assert.IsNotNull(basetable);
            Assert.IsNotNull(otherTable);

            Assert.AreEqual("root.fbs", Path.GetFileName(basetable.DeclaringFile));
            Assert.AreEqual("A.fbs", Path.GetFileName(otherTable.DeclaringFile));
        }
Example #2
0
        public void SimpleInclude()
        {
            string baseFbs  = "include \"OtherTable.fbs\"; namespace Foo; table BaseTable { OtherTable:OtherTable; Int:int; }";
            var    includes = new Dictionary <string, string>
            {
                { "OtherTable.fbs", "namespace Foo; table OtherTable { Foo:string; }" }
            };

            string cSharp = FlatSharpCompiler.TestHookCreateCSharp(baseFbs, includes);

            Assert.IsTrue(!string.IsNullOrEmpty(cSharp));

            BaseSchemaMember member = FlatSharpCompiler.TestHookParseSyntax(baseFbs, includes);

            Assert.IsTrue(member is RootNodeDefinition);
            Assert.AreEqual(1, member.Children.Count);

            NamespaceDefinition nsDef = (NamespaceDefinition)member.Children.Single().Value;

            Assert.AreEqual("Foo", nsDef.Name);

            Assert.AreEqual(2, nsDef.Children.Count);

            var basetable  = nsDef.Children["BaseTable"];
            var otherTable = nsDef.Children["OtherTable"];

            Assert.IsNotNull(basetable);
            Assert.IsNotNull(otherTable);

            Assert.AreEqual("root.fbs", Path.GetFileName(basetable.DeclaringFile));
            Assert.AreEqual("OtherTable.fbs", Path.GetFileName(otherTable.DeclaringFile));
        }
Example #3
0
        public void BasicEnumTest_Byte()
        {
            string           schema = @"
namespace Foo.Bar;

table Request { str:string; }
table Response { str:string; }
rpc_service Service {
    HelloUnary(Request):Response (streaming:unary);
    HelloServer(Request):Response (streaming:""server"");
    HelloClient(Request):Response (streaming:client);
    HelloBidi(Request):Response (streaming:""bidi"");
    HelloUnaryImplicit(Request):Response;
}
";
            BaseSchemaMember member = FlatSharpCompiler.TestHookParseSyntax(schema);
            var rpcDef = member.Children["Foo"].Children["Bar"].Children["Service"] as RpcDefinition;

            Assert.IsNotNull(rpcDef);

            Assert.AreEqual(5, rpcDef.Methods.Count);
            Assert.AreEqual(("Request", "Response", RpcStreamingType.Unary), rpcDef.Methods["HelloUnary"]);
            Assert.AreEqual(("Request", "Response", RpcStreamingType.Unary), rpcDef.Methods["HelloUnaryImplicit"]);
            Assert.AreEqual(("Request", "Response", RpcStreamingType.Server), rpcDef.Methods["HelloServer"]);
            Assert.AreEqual(("Request", "Response", RpcStreamingType.Client), rpcDef.Methods["HelloClient"]);
            Assert.AreEqual(("Request", "Response", RpcStreamingType.Bidirectional), rpcDef.Methods["HelloBidi"]);
        }
        public void WriteField(CodeWriter writer, BaseSchemaMember schemaDefinition)
        {
            ErrorContext.Current.WithScope(this.Name, () =>
            {
                bool isVector = this.VectorType != VectorType.None;
                EnumDefinition enumDefinition = null;

                if (schemaDefinition.TryResolveName(this.FbsFieldType, out var typeDefinition))
                {
                    enumDefinition = typeDefinition as EnumDefinition;

                    if (typeDefinition is UnionDefinition unionDef)
                    {
                        this.WriteField(writer, unionDef.ClrTypeName, null, this.Name);
                        return;
                    }
                }

                if (isVector)
                {
                    this.WriteVectorField(writer);
                    return;
                }

                string defaultValue = string.Empty;

                bool isPrimitive = SchemaDefinition.TryResolvePrimitiveType(this.FbsFieldType, out string clrType);
                if (!isPrimitive)
                {
                    clrType = typeDefinition?.GlobalName ?? this.FbsFieldType;
                }

                if (!string.IsNullOrEmpty(this.DefaultValue))
                {
                    if (isPrimitive)
                    {
                        defaultValue = CodeWriter.GetPrimitiveTypeLiteral(clrType, this.DefaultValue);
                    }
                    else if (enumDefinition != null)
                    {
                        if (enumDefinition.NameValuePairs.ContainsKey(this.DefaultValue))
                        {
                            // Referenced by name.
                            defaultValue = $"{clrType}.{this.DefaultValue}";
                        }
                        else
                        {
                            defaultValue = CodeWriter.GetPrimitiveTypeLiteral(enumDefinition.ClrUnderlyingType, this.DefaultValue);
                        }
                    }
                    else
                    {
                        ErrorContext.Current?.RegisterError($"Only primitive types and enums may have default values. Field '{this.Name}' declares a default value but has type '{this.FbsFieldType}'.");
                    }
                }

                this.WriteField(writer, clrType, defaultValue, this.Name);
            });
        }