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