Example #1
0
        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
            });
        }
Example #2
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
            });
        }