private TFSyntax.Forest TranslateForest(TFSemantics.Forest f, String Comment, Dictionary <Object, Object> Positions) { var MultiNodesList = new List <TFSyntax.MultiNodes>(); if (Comment != "") { var mlc = new TFSyntax.MultiLineComment { SingleLineComment = TreeFormat.Optional <TFSyntax.SingleLineComment> .Empty, Content = new TFSyntax.FreeContent { Text = Comment }, EndDirective = TreeFormat.Optional <TFSyntax.EndDirective> .Empty }; MultiNodesList.Add(TFSyntax.MultiNodes.CreateNode(TFSyntax.Node.CreateMultiLineComment(mlc))); } foreach (var n in f.Nodes) { MultiNodesList.AddRange(TranslateNode(n, Positions)); } return(new TFSyntax.Forest { MultiNodesList = MultiNodesList }); }
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 }); }