Exemple #1
0
 public Options WithLocationMembersPlacement(LocationMembersPlacement value)
 {
     return(value == LocationMembersPlacement ? this : new Options(this)
     {
         LocationMembersPlacement = value
     });
 }
 private Options(Options options)
 {
     IncludingLineColumn      = options.IncludingLineColumn;
     IncludingRange           = options.IncludingRange;
     LocationMembersPlacement = options.LocationMembersPlacement;
 }
            public Visitor(JsonWriter writer,
                           bool includeLineColumn, bool includeRange,
                           LocationMembersPlacement locationMembersPlacement)
            {
                _writer = writer ?? throw new ArgumentNullException(nameof(writer));
                _stack  = new ObservableStack <INode>();

                _stack.Pushed += node =>
                {
                    _writer.StartObject();

                    if ((includeLineColumn || includeRange) &&
                        locationMembersPlacement == LocationMembersPlacement.Start)
                    {
                        WriteLocationInfo(node);
                    }

                    Member("type", node.Type.ToString());
                };

                _stack.Popped += node =>
                {
                    if ((includeLineColumn || includeRange) &&
                        locationMembersPlacement == LocationMembersPlacement.End)
                    {
                        WriteLocationInfo(node);
                    }

                    _writer.EndObject();
                };

                void WriteLocationInfo(INode node)
                {
                    if (includeRange)
                    {
                        writer.Member("range");
                        writer.StartArray();
                        writer.Number(node.Range.Start);
                        writer.Number(node.Range.End);
                        writer.EndArray();
                    }

                    if (includeLineColumn)
                    {
                        writer.Member("loc");
                        writer.StartObject();
                        writer.Member("start");
                        Write(node.Location.Start);
                        writer.Member("end");
                        Write(node.Location.End);
                        writer.EndObject();
                    }

                    void Write(Position position)
                    {
                        writer.StartObject();
                        Member("line", position.Line);
                        Member("column", position.Column);
                        writer.EndObject();
                    }
                }
            }