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)); }
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)); }
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); }); }