示例#1
0
 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);
     }
 }
示例#2
0
        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("}");
        }
示例#3
0
        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);
            }
        }
示例#4
0
 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);
     }
 }
示例#5
0
        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);
            }
        }
示例#6
0
文件: Cpp.cs 项目: blockspacer/niveum
        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()));
            }
        }
示例#7
0
        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("}");
        }
示例#8
0
        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);
            }
        }
示例#9
0
        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("}");
        }
示例#10
0
        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("}");
        }
示例#11
0
        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);
        }
示例#12
0
        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));
        }
示例#13
0
        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("};");
        }
示例#14
0
        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");
        }
示例#15
0
        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("}");
        }
示例#16
0
        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);
                }
            }
        }
示例#17
0
        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));
        }