示例#1
0
        private Syntax.Forest WriteToForest(List <TypeDef> Types, String Comment)
        {
            var MultiNodesList = new List <Syntax.MultiNodes>();

            if (Comment != "")
            {
                var mlc = new Syntax.MultiLineComment {
                    SingleLineComment = TreeFormat.Optional <Syntax.SingleLineComment> .Empty, Content = new Syntax.FreeContent {
                        Text = Comment
                    }, EndDirective = TreeFormat.Optional <Syntax.EndDirective> .Empty
                };
                MultiNodesList.Add(Syntax.MultiNodes.CreateNode(Syntax.Node.CreateMultiLineComment(mlc)));
            }
            foreach (var t in Types)
            {
                var LineTokens = new List <List <String> >();
                if (t.OnPrimitive)
                {
                    var p = t.Primitive;
                    LineTokens.AddRange(p.GenericParameters.Select(v => WriteToTokens(v, true)));
                }
                else if (t.OnAlias)
                {
                    var a = t.Alias;
                    LineTokens.AddRange(a.GenericParameters.Select(v => WriteToTokens(v, true)));
                    LineTokens.Add(new List <String> {
                        GetTypeString(a.Type)
                    });
                }
                else if (t.OnRecord)
                {
                    var r = t.Record;
                    LineTokens.AddRange(r.GenericParameters.Select(v => WriteToTokens(v, true)));
                    LineTokens.AddRange(r.Fields.Select(v => WriteToTokens(v, false)));
                }
                else if (t.OnTaggedUnion)
                {
                    var tu = t.TaggedUnion;
                    LineTokens.AddRange(tu.GenericParameters.Select(v => WriteToTokens(v, true)));
                    LineTokens.AddRange(tu.Alternatives.Select(v => WriteToTokens(v, false)));
                }
                else if (t.OnEnum)
                {
                    var e = t.Enum;
                    LineTokens.AddRange(e.Literals.Select(l => WriteToTokens(l)));
                }
                else if (t.OnClientCommand)
                {
                    var cc = t.ClientCommand;
                    LineTokens.AddRange(cc.OutParameters.Select(v => WriteToTokens(v, false)));
                    LineTokens.Add(new List <String> {
                        ">"
                    });
                    LineTokens.AddRange(cc.InParameters.Select(v => WriteToTokens(v, false)));
                }
                else if (t.OnServerCommand)
                {
                    var sc = t.ServerCommand;
                    LineTokens.AddRange(sc.OutParameters.Select(v => WriteToTokens(v, false)));
                }
                else
                {
                    throw new InvalidOperationException();
                }
                var LineLiterals = LineTokens.Select(l => (l.Count == 1 && l.Single() == ">") ? l : l.Select(Token => TreeFormatLiteralWriter.GetLiteral(Token, true, false).SingleLine).ToList()).ToList();
                var NumColumn    = 0;
                foreach (var l in LineLiterals)
                {
                    NumColumn = Math.Max(NumColumn, l.Count);
                }
                var ColumnWidths = new List <int>();
                for (int k = 0; k <= NumColumn - 2; k += 1)
                {
                    int Width = 28;
                    foreach (var l in LineLiterals)
                    {
                        if (k < l.Count)
                        {
                            var Column = l[k];
                            Width = Math.Max(Width, CalculateCharWidth(Column).CeilToMultipleOf(4) + 4);
                        }
                    }
                    ColumnWidths.Add(Width);
                }
                var Lines = new List <Syntax.TextLine>();
                foreach (var l in LineLiterals)
                {
                    var Line = new List <String>();
                    for (int k = 0; k < l.Count; k += 1)
                    {
                        var Column = l[k];
                        if ((k != l.Count - 1) && (k < ColumnWidths.Count))
                        {
                            var Width = ColumnWidths[k];
                            Line.Add(Column + new String(' ', Width - CalculateCharWidth(Column)));
                        }
                        else
                        {
                            Line.Add(Column);
                        }
                    }
                    var LineText = String.Join("", Line.ToArray());
                    Lines.Add(new Syntax.TextLine {
                        Text = LineText, Range = new Syntax.TextRange {
                            Start = new Syntax.TextPosition {
                                Row = 1, Column = 1, CharIndex = 0
                            }, End = new Syntax.TextPosition {
                                Row = 1, Column = 1 + LineText.Length, CharIndex = LineText.Length
                            }
                        }
                    });
                }
                var fn = WriteToFunctionNodes(t._Tag.ToString(), t.VersionedName(), t.Description(), Lines);
                MultiNodesList.Add(Syntax.MultiNodes.CreateFunctionNodes(fn));
            }
            return(new Syntax.Forest {
                MultiNodesList = MultiNodesList
            });
        }
示例#2
0
        public static void Write(StreamWriter sw, EntityMappingDiff d)
        {
            var Lines = new List <Syntax.TextLine>();
            Action <List <String> > AddLine = Tokens =>
            {
                var Text = String.Join(" ", Tokens.Select(t => t == null ? "$Empty" : TreeFormatLiteralWriter.GetLiteral(t, true, false).SingleLine));
                Lines.Add(new Syntax.TextLine {
                    Text = Text, Range = new Syntax.TextRange {
                        Start = new Syntax.TextPosition {
                            Row = 1, Column = 1, CharIndex = 0
                        }, End = new Syntax.TextPosition {
                            Row = 1, Column = 1 + Text.Length, CharIndex = Text.Length
                        }
                    }
                });
            };
            Action <List <String> > AddCommentLine = Tokens =>
            {
                var Text = "//" + String.Join(" ", Tokens.Select(t => t == null ? "$Empty" : TreeFormatLiteralWriter.GetLiteral(t, true, false).SingleLine));
                Lines.Add(new Syntax.TextLine {
                    Text = Text, Range = new Syntax.TextRange {
                        Start = new Syntax.TextPosition {
                            Row = 1, Column = 1, CharIndex = 0
                        }, End = new Syntax.TextPosition {
                            Row = 1, Column = 1 + Text.Length, CharIndex = Text.Length
                        }
                    }
                });
            };

            foreach (var m in d.Mappings)
            {
                if (m.Method.OnNew)
                {
                    AddLine(new List <String> {
                        "Entity", m.EntityName, "New"
                    });
                }
                else if (m.Method.OnCopy)
                {
                    AddLine(new List <String> {
                        "Entity", m.EntityName, "From", m.Method.Copy
                    });
                }
                else if (m.Method.OnField)
                {
                }
                else
                {
                    throw new InvalidOperationException();
                }
            }
            foreach (var m in d.Mappings)
            {
                if (m.Method.OnNew)
                {
                }
                else if (m.Method.OnCopy)
                {
                }
                else if (m.Method.OnField)
                {
                    var f = m.Method.Field;
                    if (f.Method.OnNew)
                    {
                        AddLine(new List <String> {
                            "Entity", m.EntityName, "Field", f.FieldName, "New", GetPrimitiveValString(f.Method.New)
                        });
                    }
                    else if (f.Method.OnCopy)
                    {
                        AddLine(new List <String> {
                            "Entity", m.EntityName, "Field", f.FieldName, "From", f.Method.Copy
                        });
                    }
                }
                else
                {
                    throw new InvalidOperationException();
                }
            }
            foreach (var de in d.DeletedEntities)
            {
                AddCommentLine(new List <String> {
                    "Entity", de, "Delete"
                });
            }
            foreach (var de in d.DeletedFields)
            {
                foreach (var df in de.Value)
                {
                    AddCommentLine(new List <String> {
                        "Entity", de.Key, "Field", df, "Delete"
                    });
                }
            }

            var AlterNode = Syntax.MultiNodes.CreateFunctionNodes(new Syntax.FunctionNodes {
                FunctionDirective = new Syntax.FunctionDirective {
                    Text = "Map"
                }, Parameters = new List <Syntax.Token> {
                }, Content = new Syntax.FunctionContent {
                    IndentLevel = 0, Lines = Lines
                }
            });

            TreeFile.WriteRaw(sw, new Syntax.Forest {
                MultiNodesList = new List <Syntax.MultiNodes> {
                    AlterNode
                }
            });
        }