public IEnumerable <String> JsonTranslator_TaggedUnion(TaggedUnionDef tu, String NamespaceName) { foreach (var _Line in Combine(Begin(), JsonTranslator_TaggedUnion(tu.GetTypeSpec().SimpleName(NamespaceName), GetTypeString(tu.GetTypeSpec(), NamespaceName), tu.Alternatives, NamespaceName))) { yield return(_Line); } }
public IEnumerable <String> TaggedUnionTag(TaggedUnionDef tu) { var TagName = GetEscapedIdentifier(GetSuffixedTypeName(tu.Name, tu.Version, "Tag", tu.NamespaceName())); foreach (var _Line in Combine(Combine(Begin(), "public final class "), TagName)) { yield return(_Line); } yield return("{"); var k = 0; foreach (var a in tu.Alternatives) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), "public static final int "), GetEscapedIdentifier(a.Name)), " = "), k), ";")) { yield return(_Line == "" ? "" : " " + _Line); } k += 1; } yield return("}"); }
public void FillTranslatorTaggedUnionTo(Dictionary <String, TypeDef> VersionedNameToType, TaggedUnionDef tu, List <String> l, String NamespaceName) { var Name = tu.FullName(); TaggedUnionDef tuHead = null; if (VersionedNameToType.ContainsKey(Name)) { var tHead = VersionedNameToType[Name]; if (tHead.OnTaggedUnion) { tuHead = tHead.TaggedUnion; } } var VersionedSimpleName = tu.GetTypeSpec().SimpleName(NamespaceName); var TypeString = GetTypeString(Nonversioned(tu.GetTypeSpec()), NamespaceName); var VersionedTypeString = GetTypeString(tu.GetTypeSpec(), NamespaceName); if (tuHead == null) { FillTranslatorTaggedUnionTo(VersionedSimpleName, TypeString, VersionedTypeString, tu.Alternatives, new List <VariableDef> { }, l, true, NamespaceName); } else { FillTranslatorTaggedUnionTo(VersionedSimpleName, TypeString, VersionedTypeString, tu.Alternatives, tuHead.Alternatives, l, false, NamespaceName); } }
public IEnumerable <String> BinaryTranslator_TaggedUnion(TaggedUnionDef tu, String NamespaceName) { foreach (var _Line in Combine(Begin(), BinaryTranslator_TaggedUnion(tu.GetTypeSpec().SimpleName(NamespaceName), GetTypeString(tu.GetTypeSpec(), NamespaceName), GetSuffixedTypeName(tu.Name, tu.Version, "Tag", NamespaceName), GetSuffixedTypeString(tu.Name, tu.Version, "Tag", NamespaceName), tu.Alternatives, NamespaceName))) { yield return(_Line); } }
public IEnumerable <String> TaggedUnion(TaggedUnionDef tu) { var TagTypeString = GetSuffixedTypeString(tu.Name, tu.Version, "Tag", tu.NamespaceName()); foreach (var _Line in Combine(Begin(), TaggedUnion(tu, TagTypeString))) { yield return(_Line); } }
public IEnumerable <String> GetTypePredefinition(TypeDef t) { var Name = t.DefinitionName(); var GenericParameterLine = GetGenericParameterLine(t.GenericParameters()); String MetaType = "class"; if (t.OnPrimitive) { return(new List <String> { }); } else if (t.OnAlias || t.OnRecord || t.OnTaggedUnion || t.OnClientCommand || t.OnServerCommand) { MetaType = "class"; } else if (t.OnEnum) { return(new List <String> { }); } if (t.OnClientCommand) { var c = t.ClientCommand; var RequestRef = GetSuffixedTypeRef(c.Name, c.Version, "Request"); var ReplyRef = GetSuffixedTypeRef(c.Name, c.Version, "Reply"); var Request = new RecordDef { Name = RequestRef.Name, Version = RequestRef.Version, GenericParameters = new List <VariableDef> { }, Fields = c.OutParameters, Attributes = c.Attributes, Description = c.Description }; var Reply = new TaggedUnionDef { Name = ReplyRef.Name, Version = ReplyRef.Version, GenericParameters = new List <VariableDef> { }, Alternatives = c.InParameters, Attributes = c.Attributes, Description = c.Description }; return(TypePredefinition(Request.DefinitionName(), MetaType, t.GenericParameters()).Concat(TypePredefinition(Reply.DefinitionName(), MetaType, t.GenericParameters()))); } else if (t.OnServerCommand) { var c = t.ServerCommand; var EventRef = GetSuffixedTypeRef(c.Name, c.Version, "Event"); var Event = new RecordDef { Name = EventRef.Name, Version = EventRef.Version, GenericParameters = new List <VariableDef> { }, Fields = c.OutParameters, Attributes = c.Attributes, Description = c.Description }; return(TypePredefinition(Event.DefinitionName(), MetaType, t.GenericParameters())); } else { return(TypePredefinition(Name, MetaType, t.GenericParameters())); } }
public IEnumerable <String> TaggedUnion(TaggedUnionDef tu) { var Name = GetEscapedIdentifier(tu.DefinitionName()) + GetGenericParameters(tu.GenericParameters); foreach (var _Line in Combine(Begin(), GetXmlComment(tu.Description))) { yield return(_Line); } foreach (var _Line in Combine(Combine(Begin(), "enum "), Name)) { yield return(_Line); } yield return("{"); foreach (var a in tu.Alternatives) { if (a.Type.OnTypeRef && a.Type.TypeRef.NameMatches("Unit")) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Begin(), GetEscapedIdentifier(LowercaseCamelize(a.Name))), ";")) { yield return(_Line == "" ? "" : " " + _Line); } } else { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Begin(), GetEscapedIdentifier(LowercaseCamelize(a.Name))), "(v : "), GetTypeString(a.Type, tu.NamespaceName())), ");")) { yield return(_Line == "" ? "" : " " + _Line); } } } yield return("}"); }
public IEnumerable <String> ClientCommand(ClientCommandDef c) { var RequestRef = GetSuffixedTypeRef(c.Name, c.Version, "Request"); var ReplyRef = GetSuffixedTypeRef(c.Name, c.Version, "Reply"); var Request = new RecordDef { Name = RequestRef.Name, Version = RequestRef.Version, GenericParameters = new List <VariableDef> { }, Fields = c.OutParameters, Attributes = c.Attributes, Description = c.Description }; var Reply = new TaggedUnionDef { Name = ReplyRef.Name, Version = ReplyRef.Version, GenericParameters = new List <VariableDef> { }, Alternatives = c.InParameters, Attributes = c.Attributes, Description = c.Description }; foreach (var _Line in Combine(Begin(), Record(Request))) { yield return(_Line); } foreach (var _Line in Combine(Begin(), TaggedUnion(Reply))) { yield return(_Line); } }
public IEnumerable <String> TaggedUnion(TaggedUnionDef tu) { var Name = GetEscapedIdentifier(tu.TypeFriendlyName()) + GetGenericParameters(tu.GenericParameters); var TagName = GetEscapedIdentifier(tu.TypeFriendlyName() + "Tag"); foreach (var _Line in Combine(Combine(Begin(), "public enum "), TagName)) { yield return(_Line); } yield return("{"); var k = 0; foreach (var a in tu.Alternatives) { if (k == tu.Alternatives.Count - 1) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Begin(), GetEscapedIdentifier(a.Name)), " = "), k)) { yield return(_Line == "" ? "" : " " + _Line); } } else { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Begin(), GetEscapedIdentifier(a.Name)), " = "), k), ",")) { yield return(_Line == "" ? "" : " " + _Line); } } k += 1; } yield return("}"); foreach (var _Line in Combine(Begin(), GetXmlComment(tu.Description))) { yield return(_Line); } yield return("[TaggedUnion]"); foreach (var _Line in Combine(Combine(Begin(), "public sealed class "), Name)) { yield return(_Line); } yield return("{"); foreach (var _Line in Combine(Combine(Combine(Begin(), " [Tag] public "), TagName), " _Tag;")) { yield return(_Line); } yield return(""); foreach (var a in tu.Alternatives) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), "public "), GetTypeString(a.Type)), " "), GetEscapedIdentifier(a.Name)), ";")) { yield return(_Line == "" ? "" : " " + _Line); } } yield return(""); foreach (var a in tu.Alternatives) { if (a.Type.OnTypeRef && (a.Type.TypeRef.Name.Count == 1) && (a.Type.TypeRef.Name.Single() == "Unit") && (a.Type.TypeRef.Version == "")) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Begin(), "public static "), Name), " "), GetEscapedIdentifier(Combine(Combine(Begin(), "Create"), a.Name))), "() { return new "), Name), " { _Tag = "), TagName), "."), GetEscapedIdentifier(a.Name)), ", "), GetEscapedIdentifier(a.Name)), " = default(Unit) }; }")) { yield return(_Line == "" ? "" : " " + _Line); } } else { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Begin(), "public static "), Name), " "), GetEscapedIdentifier(Combine(Combine(Begin(), "Create"), a.Name))), "("), GetTypeString(a.Type)), " Value) { return new "), Name), " { _Tag = "), TagName), "."), GetEscapedIdentifier(a.Name)), ", "), GetEscapedIdentifier(a.Name)), " = Value }; }")) { yield return(_Line == "" ? "" : " " + _Line); } } } yield return(""); foreach (var a in tu.Alternatives) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Combine(Combine(Begin(), "public Boolean "), GetEscapedIdentifier(Combine(Combine(Begin(), "On"), a.Name))), " { get { return _Tag == "), TagName), "."), GetEscapedIdentifier(a.Name)), "; } }")) { yield return(_Line == "" ? "" : " " + _Line); } } yield return("}"); }
public IEnumerable <String> TaggedUnion(TaggedUnionDef tu, String TagTypeString) { var Name = GetEscapedIdentifier(tu.DefinitionName()) + GetGenericParameters(tu.GenericParameters); foreach (var _Line in Combine(Begin(), GetXmlComment(tu.Description))) { yield return(_Line); } yield return("@TaggedUnion"); foreach (var _Line in Combine(Combine(Begin(), "public final class "), Name)) { yield return(_Line); } yield return("{"); yield return(" @Tag public int _Tag;"); yield return(""); foreach (var a in tu.Alternatives) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description, a.Type))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), "public "), GetTypeString(a.Type, tu.NamespaceName())), " "), GetEscapedIdentifier(a.Name)), ";")) { yield return(_Line == "" ? "" : " " + _Line); } } yield return(""); foreach (var a in tu.Alternatives) { if (a.Type.OnTypeRef && a.Type.TypeRef.NameMatches("Unit")) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), "public static "), Name), " "), GetEscapedIdentifier(Combine(Combine(Begin(), "Create"), a.Name))), "()")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + "{"); foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), " "), Name), " r = new "), Name), "();")) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), " r._Tag = "), TagTypeString), "."), GetEscapedIdentifier(a.Name)), ";")) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Begin(), " r."), GetEscapedIdentifier(a.Name)), " = Unit.Value;")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + " return r;"); yield return(" " + "}"); } else { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Combine(Combine(Begin(), "public static "), Name), " "), GetEscapedIdentifier(Combine(Combine(Begin(), "Create"), a.Name))), "("), GetTypeString(a.Type, tu.NamespaceName())), " Value)")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + "{"); foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), " "), Name), " r = new "), Name), "();")) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), " r._Tag = "), TagTypeString), "."), GetEscapedIdentifier(a.Name)), ";")) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Begin(), " r."), GetEscapedIdentifier(a.Name)), " = Value;")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + " return r;"); yield return(" " + "}"); } } yield return(""); foreach (var a in tu.Alternatives) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Combine(Combine(Begin(), "public boolean "), GetEscapedIdentifier(Combine(Combine(Begin(), "On"), a.Name))), "() { return _Tag == "), TagTypeString), "."), GetEscapedIdentifier(a.Name)), "; }")) { yield return(_Line == "" ? "" : " " + _Line); } } yield return("}"); }
public List <String> GetBinaryTranslatorSerializers(Schema Schema, String NamespaceName) { var l = new List <String>(); var PrimitiveTranslators = new Dictionary <String, Func <IEnumerable <String> > > { { "Unit", BinaryTranslator_Primitive_Unit }, { "Boolean", BinaryTranslator_Primitive_Boolean }, { "String", BinaryTranslator_Primitive_String }, { "Int", BinaryTranslator_Primitive_Int }, { "Real", BinaryTranslator_Primitive_Real }, { "Byte", BinaryTranslator_Primitive_Byte }, { "UInt8", BinaryTranslator_Primitive_UInt8 }, { "UInt16", BinaryTranslator_Primitive_UInt16 }, { "UInt32", BinaryTranslator_Primitive_UInt32 }, { "UInt64", BinaryTranslator_Primitive_UInt64 }, { "Int8", BinaryTranslator_Primitive_Int8 }, { "Int16", BinaryTranslator_Primitive_Int16 }, { "Int32", BinaryTranslator_Primitive_Int32 }, { "Int64", BinaryTranslator_Primitive_Int64 }, { "Float32", BinaryTranslator_Primitive_Float32 }, { "Float64", BinaryTranslator_Primitive_Float64 }, { "Type", BinaryTranslator_Primitive_Type } }; foreach (var c in Schema.TypeRefs.Concat(Schema.Types)) { if (c.GenericParameters().Count() != 0) { continue; } if (c.OnPrimitive) { if (PrimitiveTranslators.ContainsKey(c.Primitive.VersionedName())) { l.AddRange(PrimitiveTranslators[c.Primitive.VersionedName()]()); } else { throw new InvalidOperationException(); } } else if (c.OnAlias) { l.AddRange(BinaryTranslator_Alias(c.Alias, NamespaceName)); } else if (c.OnRecord) { l.AddRange(BinaryTranslator_Record(c.Record, NamespaceName)); } else if (c.OnTaggedUnion) { l.AddRange(BinaryTranslator_TaggedUnion(c.TaggedUnion, NamespaceName)); } else if (c.OnEnum) { l.AddRange(BinaryTranslator_Enum(c.Enum, NamespaceName)); } else if (c.OnClientCommand) { } else if (c.OnServerCommand) { } else { throw new InvalidOperationException(); } l.Add(""); } var scg = Schema.GetSchemaClosureGenerator(); var sc = scg.GetClosure(Schema.TypeRefs.Concat(Schema.Types), new List <TypeSpec> { }); var Tuples = sc.TypeSpecs.Where(t => t.OnTuple).ToList(); var GenericTypeSpecs = sc.TypeSpecs.Where(t => t.OnGenericTypeSpec).ToList(); foreach (var t in Tuples) { l.AddRange(BinaryTranslator_Tuple(t, NamespaceName)); l.Add(""); } var GenericOptionalTypes = Schema.TypeRefs.Concat(Schema.Types).Where(t => t.NameMatches("Optional")).ToList(); TaggedUnionDef GenericOptionalType = null; if (GenericOptionalTypes.Count > 0) { GenericOptionalType = new TaggedUnionDef { Name = new List <String> { "TaggedUnion" }, Version = "", GenericParameters = new List <VariableDef> { new VariableDef { Name = "T", Type = TypeSpec.CreateTypeRef(new TypeRef { Name = new List <String> { "Type" }, Version = "" }), Attributes = new List <KeyValuePair <String, List <String> > > { }, Description = "" } }, Alternatives = new List <VariableDef> { new VariableDef { Name = "None", Type = TypeSpec.CreateTypeRef(new TypeRef { Name = new List <String> { "Unit" }, Version = "" }), Attributes = new List <KeyValuePair <String, List <String> > > { }, Description = "" }, new VariableDef { Name = "Some", Type = TypeSpec.CreateGenericParameterRef("T"), Attributes = new List <KeyValuePair <String, List <String> > > { }, Description = "" } }, Attributes = new List <KeyValuePair <String, List <String> > > { }, Description = "" }; } foreach (var gts in GenericTypeSpecs) { if (gts.GenericTypeSpec.TypeSpec.OnTypeRef && gts.GenericTypeSpec.TypeSpec.TypeRef.NameMatches("Optional") && gts.GenericTypeSpec.ParameterValues.Count == 1) { l.AddRange(BinaryTranslator_Optional(gts, GenericOptionalType, NamespaceName)); l.Add(""); } else if (gts.GenericTypeSpec.TypeSpec.OnTypeRef && gts.GenericTypeSpec.TypeSpec.TypeRef.NameMatches("List") && gts.GenericTypeSpec.ParameterValues.Count == 1) { l.AddRange(BinaryTranslator_List(gts, NamespaceName)); l.Add(""); } else if (gts.GenericTypeSpec.TypeSpec.OnTypeRef && gts.GenericTypeSpec.TypeSpec.TypeRef.NameMatches("Set") && gts.GenericTypeSpec.ParameterValues.Count == 1) { l.AddRange(BinaryTranslator_Set(gts, NamespaceName)); l.Add(""); } else if (gts.GenericTypeSpec.TypeSpec.OnTypeRef && gts.GenericTypeSpec.TypeSpec.TypeRef.NameMatches("Map") && gts.GenericTypeSpec.ParameterValues.Count == 2) { l.AddRange(BinaryTranslator_Map(gts, NamespaceName)); l.Add(""); } else { throw new InvalidOperationException(String.Format("GenericTypeNotSupported: {0}", gts.GenericTypeSpec.TypeSpec.TypeRef.VersionedName())); } } if (l.Count > 0) { l = l.Take(l.Count - 1).ToList(); } return(l); }
public Dictionary <String, IEnumerable <String> > GetPackageFiles(Schema Schema, String NamespaceName) { var NamespaceToClasses = new Dictionary <String, List <KeyValuePair <String, List <String> > > >(); void AddClass(String ClassNamespaceName, String ClassName, IEnumerable <String> ClassContent) { if (!NamespaceToClasses.ContainsKey(ClassNamespaceName)) { NamespaceToClasses.Add(ClassNamespaceName, new List <KeyValuePair <String, List <String> > >()); } NamespaceToClasses[ClassNamespaceName].Add(new KeyValuePair <String, List <String> >(ClassName, ClassContent.ToList())); } foreach (var c in Schema.Types) { if (c.OnPrimitive) { if (c.VersionedName() == "Unit") { AddClass(c.NamespaceName(), "Unit", Primitive_Unit()); } else if (c.VersionedName() == "Set") { AddClass(c.NamespaceName(), "Set", Primitive_Set()); } else { var p = c.Primitive; if (PrimitiveMapping.ContainsKey(p.VersionedName())) { var Name = p.VersionedName(); var PlatformName = PrimitiveMapping[Name]; if (Name != PlatformName && p.GenericParameters.Count() == 0 && PlatformName != "Error") { AddClass(c.NamespaceName(), Name, Primitive(Name, PlatformName)); } else { continue; } } } } else if (c.OnAlias) { AddClass(c.NamespaceName(), c.DefinitionName(), Alias(c.Alias)); } else if (c.OnRecord) { AddClass(c.NamespaceName(), c.DefinitionName(), Record(c.Record)); } else if (c.OnTaggedUnion) { AddClass(c.NamespaceName(), c.DefinitionName(), TaggedUnion(c.TaggedUnion)); } else if (c.OnEnum) { AddClass(c.NamespaceName(), c.DefinitionName(), Enum(c.Enum)); } else if (c.OnClientCommand) { var tc = c.ClientCommand; var RequestRef = GetSuffixedTypeRef(tc.Name, tc.Version, "Request"); var Request = new RecordDef { Name = RequestRef.Name, Version = RequestRef.Version, GenericParameters = new List <VariableDef> { }, Fields = tc.OutParameters, Attributes = tc.Attributes, Description = tc.Description }; var ReplyRef = GetSuffixedTypeRef(tc.Name, tc.Version, "Reply"); var Reply = new TaggedUnionDef { Name = ReplyRef.Name, Version = ReplyRef.Version, GenericParameters = new List <VariableDef> { }, Alternatives = tc.InParameters, Attributes = tc.Attributes, Description = tc.Description }; AddClass(c.NamespaceName(), Request.DefinitionName(), Record(Request)); AddClass(c.NamespaceName(), Reply.DefinitionName(), TaggedUnion(Reply)); } else if (c.OnServerCommand) { var tc = c.ServerCommand; var EventRef = GetSuffixedTypeRef(tc.Name, tc.Version, "Event"); var Event = new RecordDef { Name = EventRef.Name, Version = EventRef.Version, GenericParameters = new List <VariableDef> { }, Fields = tc.OutParameters, Attributes = tc.Attributes, Description = tc.Description }; AddClass(c.NamespaceName(), Event.DefinitionName(), Record(Event)); } else { throw new InvalidOperationException(); } } var scg = Schema.GetSchemaClosureGenerator(); var sc = scg.GetClosure(Schema.TypeRefs.Concat(Schema.Types), new List <TypeSpec> { }); var Tuples = sc.TypeSpecs.Where(t => t.OnTuple).ToList(); foreach (var t in Tuples) { AddClass(NamespaceName, t.SimpleName(NamespaceName), Tuple(t, NamespaceName)); } var Commands = Schema.Types.Where(t => t.OnClientCommand || t.OnServerCommand).Where(t => t.Version() == "").ToList(); if (Commands.Count > 0) { AddClass(NamespaceName, "IApplicationClient", IApplicationClient(Commands, NamespaceName)); } return(NamespaceToClasses.SelectMany(p => p.Value.Select(v => new KeyValuePair <String, IEnumerable <String> >(String.Join("/", p.Key.Split('.').Where(NamespacePart => NamespacePart != "").Select(NamespacePart => LowercaseCamelize(NamespacePart)).Concat(new String[] { v.Key })), WrapModule(p.Key, Schema.Imports, v.Value)))).ToDictionary(p => p.Key, p => p.Value)); }
public IEnumerable <String> TaggedUnion(TaggedUnionDef tu) { var Name = GetEscapedIdentifier(tu.DefinitionName()); var TagName = GetEscapedIdentifier(GetSuffixedTypeName(tu.Name, tu.Version, "Tag", tu.NamespaceName())); foreach (var _Line in Combine(Combine(Begin(), "enum class "), TagName)) { yield return(_Line); } yield return("{"); var k = 0; foreach (var a in tu.Alternatives) { if (k == tu.Alternatives.Count - 1) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Begin(), GetEscapedIdentifier(a.Name)), " = "), k)) { yield return(_Line == "" ? "" : " " + _Line); } } else { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Begin(), GetEscapedIdentifier(a.Name)), " = "), k), ",")) { yield return(_Line == "" ? "" : " " + _Line); } } k += 1; } yield return("};"); foreach (var _Line in Combine(Begin(), GetXmlComment(tu.Description))) { yield return(_Line); } yield return("/* TaggedUnion */"); foreach (var _Line in Combine(Begin(), GetGenericParameterLine(tu.GenericParameters))) { yield return(_Line); } foreach (var _Line in Combine(Combine(Combine(Begin(), "class "), Name), " final")) { yield return(_Line); } yield return("{"); yield return("public:"); foreach (var _Line in Combine(Combine(Combine(Begin(), " /* Tag */ "), TagName), " _Tag;")) { yield return(_Line); } yield return(""); foreach (var a in tu.Alternatives) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Begin(), GetTypeString(a.Type, tu.NamespaceName())), " "), GetEscapedIdentifier(a.Name)), ";")) { yield return(_Line == "" ? "" : " " + _Line); } } yield return(""); foreach (var a in tu.Alternatives) { if (a.Type.OnTypeRef && a.Type.TypeRef.NameMatches("Unit")) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), "static std::shared_ptr<class "), Name), "> "), GetEscapedIdentifier(Combine(Combine(Begin(), "Create"), a.Name))), "()")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + "{"); foreach (var _Line in Combine(Combine(Combine(Begin(), " auto r = std::make_shared<"), Name), ">();")) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), " r->_Tag = "), TagName), "::"), GetEscapedIdentifier(a.Name)), ";")) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Begin(), " r->"), GetEscapedIdentifier(a.Name)), " = Unit();")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + " return r;"); yield return(" " + "}"); } else { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Combine(Combine(Begin(), "static std::shared_ptr<class "), Name), "> "), GetEscapedIdentifier(Combine(Combine(Begin(), "Create"), a.Name))), "("), GetTypeString(a.Type, tu.NamespaceName())), " Value)")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + "{"); foreach (var _Line in Combine(Combine(Combine(Begin(), " auto r = std::make_shared<"), Name), ">();")) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), " r->_Tag = "), TagName), "::"), GetEscapedIdentifier(a.Name)), ";")) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Begin(), " r->"), GetEscapedIdentifier(a.Name)), " = Value;")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + " return r;"); yield return(" " + "}"); } } yield return(""); foreach (var a in tu.Alternatives) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Begin(), "Boolean "), GetEscapedIdentifier(Combine(Combine(Begin(), "On"), a.Name))), "() const")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + "{"); foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), " return _Tag == "), TagName), "::"), GetEscapedIdentifier(a.Name)), ";")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + "}"); } yield return("};"); }
public IEnumerable <String> TaggedUnion(TaggedUnionDef tu) { var Name = GetEscapedIdentifier(tu.DefinitionName()) + GetGenericParameters(tu.GenericParameters); var TagName = GetEscapedIdentifier(GetSuffixedTypeName(tu.Name, tu.Version, "Tag", tu.NamespaceName())); foreach (var _Line in Combine(Combine(Begin(), "Public Enum "), TagName)) { yield return(_Line); } var k = 0; foreach (var a in tu.Alternatives) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Begin(), GetEscapedIdentifier(a.Name)), " = "), k)) { yield return(_Line == "" ? "" : " " + _Line); } k += 1; } yield return("End Enum"); foreach (var _Line in Combine(Begin(), GetXmlComment(tu.Description))) { yield return(_Line); } yield return("<TaggedUnion()>"); foreach (var _Line in Combine(Combine(Begin(), "Public NotInheritable Class "), Name)) { yield return(_Line); } foreach (var _Line in Combine(Combine(Begin(), " <Tag()> Public _Tag As "), TagName)) { yield return(_Line); } yield return(""); foreach (var a in tu.Alternatives) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Begin(), "Public "), GetEscapedIdentifier(a.Name)), " As "), GetTypeString(a.Type, tu.NamespaceName()))) { yield return(_Line == "" ? "" : " " + _Line); } } yield return(""); foreach (var a in tu.Alternatives) { if (a.Type.OnTypeRef && a.Type.TypeRef.NameMatches("Unit")) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Begin(), "Public Shared Function "), GetEscapedIdentifier(Combine(Combine(Begin(), "Create"), a.Name))), "() As "), Name)) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Begin(), " Return New "), Name), " With {._Tag = "), TagName), "."), GetEscapedIdentifier(a.Name)), ", ."), GetEscapedIdentifier(a.Name)), " = Nothing}")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + "End Function"); } else { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Combine(Begin(), "Public Shared Function "), GetEscapedIdentifier(Combine(Combine(Begin(), "Create"), a.Name))), "(Value As "), GetTypeString(a.Type, tu.NamespaceName())), ") As "), Name)) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Combine(Begin(), " Return New "), Name), " With {._Tag = "), TagName), "."), GetEscapedIdentifier(a.Name)), ", ."), GetEscapedIdentifier(a.Name)), " = Value}")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + "End Function"); } } yield return(""); foreach (var a in tu.Alternatives) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Begin(), "Public Readonly Property "), GetEscapedIdentifier(Combine(Combine(Begin(), "On"), a.Name))), " As Boolean")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + " Get"); foreach (var _Line in Combine(Combine(Combine(Combine(Begin(), " Return _Tag = "), TagName), "."), GetEscapedIdentifier(a.Name))) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + " End Get"); yield return(" " + "End Property"); } yield return("End Class"); }
public IEnumerable <String> BinaryTranslator_Optional(TypeSpec o, TaggedUnionDef GenericOptionalType, String NamespaceName) { var ElementType = o.GenericTypeSpec.ParameterValues.Single(); var Alternatives = GenericOptionalType.Alternatives.Select(a => new VariableDef { Name = a.Name, Type = a.Type.OnGenericParameterRef ? ElementType : a.Type, Attributes = a.Attributes, Description = a.Description }).ToList(); var SimpleName = o.SimpleName(NamespaceName); var TypeString = GetTypeString(o, NamespaceName); foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), "public static "), TypeString), " "), GetEscapedIdentifier(Combine(Combine(Begin(), SimpleName), "FromBinary"))), "(IReadableStream s)")) { yield return(_Line); } yield return("{"); foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), " "), TypeString), " o = new "), TypeString), "();")) { yield return(_Line); } yield return(" o._Tag = OptionalTagFromBinary(s);"); foreach (var a in Alternatives) { foreach (var _Line in Combine(Combine(Combine(Begin(), "if (o._Tag == OptionalTag."), GetEscapedIdentifier(a.Name)), ")")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + "{"); foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), " o."), GetEscapedIdentifier(a.Name)), " = "), GetEscapedIdentifier(Combine(Combine(Begin(), a.Type.SimpleName(NamespaceName)), "FromBinary"))), "(s);")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + " return o;"); yield return(" " + "}"); } yield return(" throw new RuntimeException(\"InvalidOperation\");"); yield return("}"); foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), "public static void "), GetEscapedIdentifier(Combine(Combine(Begin(), SimpleName), "ToBinary"))), "(IWritableStream s, "), TypeString), " o)")) { yield return(_Line); } yield return("{"); yield return(" OptionalTagToBinary(s, o._Tag);"); foreach (var a in Alternatives) { foreach (var _Line in Combine(Combine(Combine(Begin(), "if (o._Tag == OptionalTag."), GetEscapedIdentifier(a.Name)), ")")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + "{"); foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), " "), GetEscapedIdentifier(Combine(Combine(Begin(), a.Type.SimpleName(NamespaceName)), "ToBinary"))), "(s, o."), GetEscapedIdentifier(a.Name)), ");")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + " return;"); yield return(" " + "}"); } yield return(" throw new RuntimeException(\"InvalidOperation\");"); yield return("}"); }
public IEnumerable <String> TaggedUnion(TaggedUnionDef tu) { var Name = GetEscapedIdentifier(tu.DefinitionName()) + GetGenericParameters(tu.GenericParameters); var TagName = GetEscapedIdentifier(GetSuffixedTypeName(tu.Name, tu.Version, "Tag", tu.NamespaceName())); foreach (var _Line in Combine(Combine(Combine(Begin(), "class "), TagName), "(IntEnum):")) { yield return(_Line); } var k = 0; foreach (var a in tu.Alternatives) { foreach (var _Line in Combine(Begin(), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Begin(), GetEscapedIdentifier(a.Name)), " = "), k)) { yield return(_Line == "" ? "" : " " + _Line); } k += 1; } if (tu.Alternatives.Count == 0) { yield return(" " + "pass"); } yield return("#TaggedUnion"); foreach (var _Line in Combine(Combine(Combine(Begin(), "class "), Name), "(NamedTuple):")) { yield return(_Line); } foreach (var _Line in Combine(Combine(Begin(), " "), GetXmlComment(tu.Description))) { yield return(_Line); } yield return(""); foreach (var _Line in Combine(Combine(Begin(), " Tag_: "), TagName)) { yield return(_Line); } yield return(" Value_: Any"); yield return(""); foreach (var a in tu.Alternatives) { foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), "def "), GetEscapedIdentifier(a.Name)), "(self) -> "), GetTypeString(a.Type, tu.NamespaceName())), ":")) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Begin(), " "), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), " if self.Tag_ != "), TagName), "."), GetEscapedIdentifier(a.Name)), ":")) { yield return(_Line == "" ? "" : " " + _Line); } yield return(" " + " raise TypeError('TagMismatch')"); yield return(" " + " return self.Value_"); } yield return(""); foreach (var a in tu.Alternatives) { if (a.Type.OnTypeRef && a.Type.TypeRef.NameMatches("Unit")) { yield return(" " + "@staticmethod"); foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Begin(), "def "), GetEscapedIdentifier(Combine(Combine(Begin(), "Create"), a.Name))), "() -> '"), Name), "':")) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Begin(), " "), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Combine(Combine(Begin(), " return "), Name), "("), TagName), "."), GetEscapedIdentifier(a.Name)), ", None)")) { yield return(_Line == "" ? "" : " " + _Line); } } else { yield return(" " + "@staticmethod"); foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Combine(Combine(Begin(), "def "), GetEscapedIdentifier(Combine(Combine(Begin(), "Create"), a.Name))), "(Value: "), GetTypeString(a.Type, tu.NamespaceName())), ") -> '"), Name), "':")) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Begin(), " "), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Combine(Combine(Combine(Begin(), " return "), Name), "("), TagName), "."), GetEscapedIdentifier(a.Name)), ", Value)")) { yield return(_Line == "" ? "" : " " + _Line); } } } yield return(""); foreach (var a in tu.Alternatives) { foreach (var _Line in Combine(Combine(Combine(Begin(), "def "), GetEscapedIdentifier(Combine(Combine(Begin(), "On"), a.Name))), "(self) -> bool:")) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Begin(), " "), GetXmlComment(a.Description))) { yield return(_Line == "" ? "" : " " + _Line); } foreach (var _Line in Combine(Combine(Combine(Combine(Begin(), " return self.Tag_ == "), TagName), "."), GetEscapedIdentifier(a.Name))) { yield return(_Line == "" ? "" : " " + _Line); } } }
public Dictionary <String, IEnumerable <String> > GetPackageFiles(Schema Schema, String NamespaceName) { var NamespaceToClasses = new Dictionary <String, List <KeyValuePair <String, List <String> > > >(); void AddClass(String ClassNamespaceName, String ClassName, IEnumerable <String> ClassContent) { if (!NamespaceToClasses.ContainsKey(ClassNamespaceName)) { NamespaceToClasses.Add(ClassNamespaceName, new List <KeyValuePair <String, List <String> > >()); } NamespaceToClasses[ClassNamespaceName].Add(new KeyValuePair <String, List <String> >(ClassName, ClassContent.ToList())); } AddClass("niveum.lang", "Record", Attribute_Record()); AddClass("niveum.lang", "Alias", Attribute_Alias()); AddClass("niveum.lang", "TaggedUnion", Attribute_TaggedUnion()); AddClass("niveum.lang", "Tag", Attribute_Tag()); AddClass("niveum.lang", "Tuple", Attribute_Tuple()); AddClass("niveum.lang", "Unit", Primitive_Unit()); foreach (var c in Schema.Types) { if (c.OnPrimitive) { continue; } else if (c.OnAlias) { AddClass(c.NamespaceName(), c.DefinitionName(), Alias(c.Alias)); } else if (c.OnRecord) { AddClass(c.NamespaceName(), c.DefinitionName(), Record(c.Record)); } else if (c.OnTaggedUnion) { var tu = c.TaggedUnion; var TagName = GetSuffixedTypeName(tu.Name, tu.Version, "Tag", tu.NamespaceName()); AddClass(c.NamespaceName(), TagName, TaggedUnionTag(c.TaggedUnion)); AddClass(c.NamespaceName(), c.DefinitionName(), TaggedUnion(c.TaggedUnion)); } else if (c.OnEnum) { AddClass(c.NamespaceName(), c.DefinitionName(), Enum(c.Enum)); } else if (c.OnClientCommand) { var tc = c.ClientCommand; var RequestRef = GetSuffixedTypeRef(tc.Name, tc.Version, "Request"); var Request = new RecordDef { Name = RequestRef.Name, Version = RequestRef.Version, GenericParameters = new List <VariableDef> { }, Fields = tc.OutParameters, Attributes = tc.Attributes, Description = tc.Description }; var ReplyRef = GetSuffixedTypeRef(tc.Name, tc.Version, "Reply"); var Reply = new TaggedUnionDef { Name = ReplyRef.Name, Version = ReplyRef.Version, GenericParameters = new List <VariableDef> { }, Alternatives = tc.InParameters, Attributes = tc.Attributes, Description = tc.Description }; var ReplyTagName = GetSuffixedTypeName(Reply.Name, Reply.Version, "Tag", tc.NamespaceName()); AddClass(c.NamespaceName(), Request.DefinitionName(), Record(Request)); AddClass(c.NamespaceName(), ReplyTagName, TaggedUnionTag(Reply)); AddClass(c.NamespaceName(), Reply.DefinitionName(), TaggedUnion(Reply)); } else if (c.OnServerCommand) { var tc = c.ServerCommand; var EventRef = GetSuffixedTypeRef(tc.Name, tc.Version, "Event"); var Event = new RecordDef { Name = EventRef.Name, Version = EventRef.Version, GenericParameters = new List <VariableDef> { }, Fields = tc.OutParameters, Attributes = tc.Attributes, Description = tc.Description }; AddClass(c.NamespaceName(), Event.DefinitionName(), Record(Event)); } else { throw new InvalidOperationException(); } } var scg = Schema.GetSchemaClosureGenerator(); var sc = scg.GetClosure(Schema.TypeRefs.Concat(Schema.Types), new List <TypeSpec> { }); var Tuples = sc.TypeSpecs.Where(t => t.OnTuple).ToList(); var GenericTypeSpecs = sc.TypeSpecs.Where(t => t.OnGenericTypeSpec).ToList(); foreach (var t in Tuples) { AddClass(NamespaceName, t.SimpleName(NamespaceName), Tuple(t, NamespaceName)); } var GenericOptionalTypes = Schema.TypeRefs.Concat(Schema.Types).Where(t => t.NameMatches("Optional")).ToList(); if (GenericOptionalTypes.Count > 0) { var GenericOptionalType = new TaggedUnionDef { Name = new List <String> { "Optional" }, Version = "", GenericParameters = new List <VariableDef> { new VariableDef { Name = "T", Type = TypeSpec.CreateTypeRef(new TypeRef { Name = new List <String> { "Type" }, Version = "" }), Attributes = new List <KeyValuePair <String, List <String> > > { }, Description = "" } }, Alternatives = new List <VariableDef> { new VariableDef { Name = "None", Type = TypeSpec.CreateTypeRef(new TypeRef { Name = new List <String> { "Unit" }, Version = "" }), Attributes = new List <KeyValuePair <String, List <String> > > { }, Description = "" }, new VariableDef { Name = "Some", Type = TypeSpec.CreateGenericParameterRef("T"), Attributes = new List <KeyValuePair <String, List <String> > > { }, Description = "" } }, Attributes = new List <KeyValuePair <String, List <String> > > { }, Description = "" }; { var TagName = GetSuffixedTypeName(GenericOptionalType.Name, GenericOptionalType.Version, "Tag", GenericOptionalType.NamespaceName()); AddClass(NamespaceName, TagName, TaggedUnionTag(GenericOptionalType)); } foreach (var gts in GenericTypeSpecs) { if (gts.GenericTypeSpec.TypeSpec.OnTypeRef && gts.GenericTypeSpec.TypeSpec.TypeRef.NameMatches("Optional") && gts.GenericTypeSpec.ParameterValues.Count == 1) { var ElementType = gts.GenericTypeSpec.ParameterValues.Single(); var Name = "Opt" + ElementType.SimpleName(NamespaceName); var Alternatives = GenericOptionalType.Alternatives.Select(a => new VariableDef { Name = a.Name, Type = a.Type.OnGenericParameterRef ? ElementType : a.Type, Attributes = a.Attributes, Description = a.Description }).ToList(); var tu = new TaggedUnionDef { Name = new List <String> { Name }, Version = "", GenericParameters = new List <VariableDef> { }, Alternatives = Alternatives, Attributes = GenericOptionalType.Attributes, Description = GenericOptionalType.Description }; AddClass(NamespaceName, Name, TaggedUnion(tu, "OptionalTag")); } } } return(NamespaceToClasses.SelectMany(p => p.Value.Select(v => new KeyValuePair <String, IEnumerable <String> >(String.Join("/", p.Key.Split('.').Where(NamespacePart => NamespacePart != "").Select(NamespacePart => LowercaseCamelize(NamespacePart)).Concat(new String[] { v.Key })), WrapModule(p.Key, Schema.Imports, v.Value)))).ToDictionary(p => p.Key, p => p.Value)); }