syntax_tree 2.2.0 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +20 -1
- data/.rubocop.yml +80 -0
- data/CHANGELOG.md +47 -1
- data/Gemfile +2 -0
- data/Gemfile.lock +26 -1
- data/README.md +113 -0
- data/Rakefile +27 -5
- data/config/rubocop.yml +64 -0
- data/lib/syntax_tree/cli.rb +63 -27
- data/lib/syntax_tree/formatter.rb +14 -6
- data/lib/syntax_tree/language_server/inlay_hints.rb +87 -38
- data/lib/syntax_tree/language_server.rb +50 -14
- data/lib/syntax_tree/node.rb +1042 -326
- data/lib/syntax_tree/parser.rb +444 -111
- data/lib/syntax_tree/prettyprint.rb +53 -38
- data/lib/syntax_tree/version.rb +1 -1
- data/lib/syntax_tree/visitor/field_visitor.rb +1115 -0
- data/lib/syntax_tree/visitor/json_visitor.rb +25 -1305
- data/lib/syntax_tree/visitor/match_visitor.rb +122 -0
- data/lib/syntax_tree/visitor/pretty_print_visitor.rb +35 -1163
- data/lib/syntax_tree/visitor.rb +6 -1
- data/lib/syntax_tree.rb +19 -1
- data/syntax_tree.gemspec +21 -19
- metadata +8 -4
@@ -79,7 +79,7 @@ class PrettyPrint
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def pretty_print(q)
|
82
|
-
q.group(2, "align([", "])") do
|
82
|
+
q.group(2, "align#{indent}([", "])") do
|
83
83
|
q.seplist(contents) { |content| q.pp(content) }
|
84
84
|
end
|
85
85
|
end
|
@@ -161,7 +161,7 @@ class PrettyPrint
|
|
161
161
|
end
|
162
162
|
|
163
163
|
def pretty_print(q)
|
164
|
-
q.group(2, "group([", "])") do
|
164
|
+
q.group(2, break? ? "breakGroup([" : "group([", "])") do
|
165
165
|
q.seplist(contents) { |content| q.pp(content) }
|
166
166
|
end
|
167
167
|
end
|
@@ -375,7 +375,7 @@ class PrettyPrint
|
|
375
375
|
# This argument is a noop.
|
376
376
|
# * +newline+ - Argument position expected to be here for compatibility.
|
377
377
|
# This argument is a noop.
|
378
|
-
def initialize(output,
|
378
|
+
def initialize(output, _maxwidth = nil, _newline = nil)
|
379
379
|
@output = Buffer.for(output)
|
380
380
|
@target = @output
|
381
381
|
@line_suffixes = Buffer::ArrayBuffer.new
|
@@ -397,7 +397,7 @@ class PrettyPrint
|
|
397
397
|
# They are all noop arguments.
|
398
398
|
def breakable(
|
399
399
|
separator = " ",
|
400
|
-
|
400
|
+
_width = separator.length,
|
401
401
|
indent: nil,
|
402
402
|
force: nil
|
403
403
|
)
|
@@ -410,7 +410,7 @@ class PrettyPrint
|
|
410
410
|
|
411
411
|
# Appends +separator+ to the output buffer. +width+ is a noop here for
|
412
412
|
# compatibility.
|
413
|
-
def fill_breakable(separator = " ",
|
413
|
+
def fill_breakable(separator = " ", _width = separator.length)
|
414
414
|
target << separator
|
415
415
|
end
|
416
416
|
|
@@ -419,9 +419,9 @@ class PrettyPrint
|
|
419
419
|
target.trim!
|
420
420
|
end
|
421
421
|
|
422
|
-
#
|
422
|
+
# --------------------------------------------------------------------------
|
423
423
|
# Container node builders
|
424
|
-
#
|
424
|
+
# --------------------------------------------------------------------------
|
425
425
|
|
426
426
|
# Opens a block for grouping objects to be pretty printed.
|
427
427
|
#
|
@@ -432,11 +432,11 @@ class PrettyPrint
|
|
432
432
|
# * +open_width+ - noop argument. Present for compatibility.
|
433
433
|
# * +close_width+ - noop argument. Present for compatibility.
|
434
434
|
def group(
|
435
|
-
|
435
|
+
_indent = nil,
|
436
436
|
open_object = "",
|
437
437
|
close_object = "",
|
438
|
-
|
439
|
-
|
438
|
+
_open_width = nil,
|
439
|
+
_close_width = nil
|
440
440
|
)
|
441
441
|
target << open_object
|
442
442
|
yield
|
@@ -458,6 +458,10 @@ class PrettyPrint
|
|
458
458
|
IfBreakBuilder.new
|
459
459
|
end
|
460
460
|
|
461
|
+
# Also effectively unnecessary, but here for compatibility.
|
462
|
+
def if_flat
|
463
|
+
end
|
464
|
+
|
461
465
|
# A noop that immediately yields.
|
462
466
|
def indent
|
463
467
|
yield
|
@@ -474,14 +478,14 @@ class PrettyPrint
|
|
474
478
|
# Takes +indent+ arg, but does nothing with it.
|
475
479
|
#
|
476
480
|
# Yields to a block.
|
477
|
-
def nest(
|
481
|
+
def nest(_indent)
|
478
482
|
yield
|
479
483
|
end
|
480
484
|
|
481
485
|
# Add +object+ to the text to be output.
|
482
486
|
#
|
483
487
|
# +width+ argument is here for compatibility. It is a noop argument.
|
484
|
-
def text(object = "",
|
488
|
+
def text(object = "", _width = nil)
|
485
489
|
target << object
|
486
490
|
end
|
487
491
|
end
|
@@ -542,17 +546,17 @@ class PrettyPrint
|
|
542
546
|
last_spaces = 0
|
543
547
|
end
|
544
548
|
|
545
|
-
next_queue.each do |
|
546
|
-
case
|
549
|
+
next_queue.each do |next_part|
|
550
|
+
case next_part
|
547
551
|
when IndentPart
|
548
552
|
flush_spaces.call
|
549
553
|
add_spaces.call(2)
|
550
554
|
when StringAlignPart
|
551
555
|
flush_spaces.call
|
552
|
-
next_value +=
|
553
|
-
next_length +=
|
556
|
+
next_value += next_part.n
|
557
|
+
next_length += next_part.n.length
|
554
558
|
when NumberAlignPart
|
555
|
-
last_spaces +=
|
559
|
+
last_spaces += next_part.n
|
556
560
|
end
|
557
561
|
end
|
558
562
|
|
@@ -619,9 +623,9 @@ class PrettyPrint
|
|
619
623
|
#
|
620
624
|
def self.singleline_format(
|
621
625
|
output = "".dup,
|
622
|
-
|
623
|
-
|
624
|
-
|
626
|
+
_maxwidth = nil,
|
627
|
+
_newline = nil,
|
628
|
+
_genspace = nil
|
625
629
|
)
|
626
630
|
q = SingleLine.new(output)
|
627
631
|
yield q
|
@@ -759,9 +763,7 @@ class PrettyPrint
|
|
759
763
|
|
760
764
|
# This is a linear stack instead of a mutually recursive call defined on
|
761
765
|
# the individual doc nodes for efficiency.
|
762
|
-
while commands.
|
763
|
-
indent, mode, doc = commands.pop
|
764
|
-
|
766
|
+
while (indent, mode, doc = commands.pop)
|
765
767
|
case doc
|
766
768
|
when Text
|
767
769
|
doc.objects.each { |object| buffer << object }
|
@@ -776,23 +778,26 @@ class PrettyPrint
|
|
776
778
|
position -= buffer.trim!
|
777
779
|
when Group
|
778
780
|
if mode == MODE_FLAT && !should_remeasure
|
779
|
-
commands <<
|
780
|
-
|
781
|
+
commands << [
|
782
|
+
indent,
|
783
|
+
doc.break? ? MODE_BREAK : MODE_FLAT,
|
784
|
+
doc.contents
|
785
|
+
]
|
781
786
|
else
|
782
787
|
should_remeasure = false
|
783
788
|
next_cmd = [indent, MODE_FLAT, doc.contents]
|
784
|
-
|
785
|
-
|
786
|
-
|
789
|
+
commands << if !doc.break? &&
|
790
|
+
fits?(next_cmd, commands, maxwidth - position)
|
791
|
+
next_cmd
|
787
792
|
else
|
788
|
-
|
793
|
+
[indent, MODE_BREAK, doc.contents]
|
789
794
|
end
|
790
795
|
end
|
791
796
|
when IfBreak
|
792
|
-
if mode == MODE_BREAK
|
793
|
-
commands << [indent, mode, doc.break_contents]
|
794
|
-
elsif mode == MODE_FLAT
|
795
|
-
commands << [indent, mode, doc.flat_contents]
|
797
|
+
if mode == MODE_BREAK && doc.break_contents.any?
|
798
|
+
commands << [indent, mode, doc.break_contents]
|
799
|
+
elsif mode == MODE_FLAT && doc.flat_contents.any?
|
800
|
+
commands << [indent, mode, doc.flat_contents]
|
796
801
|
end
|
797
802
|
when LineSuffix
|
798
803
|
line_suffixes << [indent, mode, doc.contents, doc.priority]
|
@@ -1011,6 +1016,16 @@ class PrettyPrint
|
|
1011
1016
|
IfBreakBuilder.new(self, doc)
|
1012
1017
|
end
|
1013
1018
|
|
1019
|
+
# This is similar to if_break in that it also inserts an IfBreak node into the
|
1020
|
+
# print tree, however it's starting from the flat contents, and cannot be used
|
1021
|
+
# to build the break contents.
|
1022
|
+
def if_flat
|
1023
|
+
doc = IfBreak.new
|
1024
|
+
target << doc
|
1025
|
+
|
1026
|
+
with_target(doc.flat_contents) { yield }
|
1027
|
+
end
|
1028
|
+
|
1014
1029
|
# Very similar to the #nest method, this indents the nested content by one
|
1015
1030
|
# level by inserting an Indent node into the print tree. The contents of the
|
1016
1031
|
# node are determined by the block.
|
@@ -1048,7 +1063,7 @@ class PrettyPrint
|
|
1048
1063
|
def text(object = "", width = object.length)
|
1049
1064
|
doc = target.last
|
1050
1065
|
|
1051
|
-
unless Text
|
1066
|
+
unless doc.is_a?(Text)
|
1052
1067
|
doc = Text.new
|
1053
1068
|
target << doc
|
1054
1069
|
end
|
@@ -1116,10 +1131,10 @@ class PrettyPrint
|
|
1116
1131
|
when Group
|
1117
1132
|
commands << [indent, doc.break? ? MODE_BREAK : mode, doc.contents]
|
1118
1133
|
when IfBreak
|
1119
|
-
if mode == MODE_BREAK
|
1120
|
-
commands << [indent, mode, doc.break_contents]
|
1121
|
-
|
1122
|
-
commands << [indent, mode, doc.flat_contents]
|
1134
|
+
if mode == MODE_BREAK && doc.break_contents.any?
|
1135
|
+
commands << [indent, mode, doc.break_contents]
|
1136
|
+
elsif mode == MODE_FLAT && doc.flat_contents.any?
|
1137
|
+
commands << [indent, mode, doc.flat_contents]
|
1123
1138
|
end
|
1124
1139
|
when Breakable
|
1125
1140
|
if mode == MODE_FLAT && !doc.force?
|
data/lib/syntax_tree/version.rb
CHANGED