parser 2.7.1.1 → 3.0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/lib/parser.rb +1 -0
  3. data/lib/parser/all.rb +2 -0
  4. data/lib/parser/ast/processor.rb +5 -0
  5. data/lib/parser/base.rb +7 -5
  6. data/lib/parser/builders/default.rb +263 -23
  7. data/lib/parser/context.rb +5 -0
  8. data/lib/parser/current.rb +24 -6
  9. data/lib/parser/current_arg_stack.rb +5 -2
  10. data/lib/parser/diagnostic.rb +1 -1
  11. data/lib/parser/diagnostic/engine.rb +1 -2
  12. data/lib/parser/lexer.rb +887 -803
  13. data/lib/parser/macruby.rb +2214 -2189
  14. data/lib/parser/max_numparam_stack.rb +13 -5
  15. data/lib/parser/messages.rb +18 -0
  16. data/lib/parser/meta.rb +6 -5
  17. data/lib/parser/ruby18.rb +9 -3
  18. data/lib/parser/ruby19.rb +2297 -2289
  19. data/lib/parser/ruby20.rb +2413 -2397
  20. data/lib/parser/ruby21.rb +2419 -2411
  21. data/lib/parser/ruby22.rb +2468 -2460
  22. data/lib/parser/ruby23.rb +2452 -2452
  23. data/lib/parser/ruby24.rb +2435 -2430
  24. data/lib/parser/ruby25.rb +2220 -2214
  25. data/lib/parser/ruby26.rb +2220 -2214
  26. data/lib/parser/ruby27.rb +3715 -3615
  27. data/lib/parser/ruby28.rb +8047 -0
  28. data/lib/parser/ruby30.rb +8060 -0
  29. data/lib/parser/ruby31.rb +8226 -0
  30. data/lib/parser/rubymotion.rb +2190 -2182
  31. data/lib/parser/runner.rb +31 -2
  32. data/lib/parser/runner/ruby_rewrite.rb +2 -2
  33. data/lib/parser/source/buffer.rb +53 -28
  34. data/lib/parser/source/comment.rb +14 -1
  35. data/lib/parser/source/comment/associator.rb +31 -8
  36. data/lib/parser/source/map/method_definition.rb +25 -0
  37. data/lib/parser/source/range.rb +10 -3
  38. data/lib/parser/source/tree_rewriter.rb +100 -10
  39. data/lib/parser/source/tree_rewriter/action.rb +114 -21
  40. data/lib/parser/static_environment.rb +4 -0
  41. data/lib/parser/tree_rewriter.rb +1 -2
  42. data/lib/parser/variables_stack.rb +4 -0
  43. data/lib/parser/version.rb +1 -1
  44. data/parser.gemspec +3 -18
  45. metadata +17 -98
  46. data/.gitignore +0 -33
  47. data/.travis.yml +0 -42
  48. data/.yardopts +0 -21
  49. data/CHANGELOG.md +0 -1075
  50. data/CONTRIBUTING.md +0 -17
  51. data/Gemfile +0 -10
  52. data/README.md +0 -309
  53. data/Rakefile +0 -166
  54. data/ci/run_rubocop_specs +0 -14
  55. data/doc/AST_FORMAT.md +0 -2180
  56. data/doc/CUSTOMIZATION.md +0 -37
  57. data/doc/INTERNALS.md +0 -21
  58. data/doc/css/.gitkeep +0 -0
  59. data/doc/css/common.css +0 -68
  60. data/lib/parser/lexer.rl +0 -2536
  61. data/lib/parser/macruby.y +0 -2198
  62. data/lib/parser/ruby18.y +0 -1934
  63. data/lib/parser/ruby19.y +0 -2175
  64. data/lib/parser/ruby20.y +0 -2353
  65. data/lib/parser/ruby21.y +0 -2357
  66. data/lib/parser/ruby22.y +0 -2364
  67. data/lib/parser/ruby23.y +0 -2370
  68. data/lib/parser/ruby24.y +0 -2408
  69. data/lib/parser/ruby25.y +0 -2405
  70. data/lib/parser/ruby26.y +0 -2413
  71. data/lib/parser/ruby27.y +0 -2941
  72. data/lib/parser/rubymotion.y +0 -2182
  73. data/test/bug_163/fixtures/input.rb +0 -5
  74. data/test/bug_163/fixtures/output.rb +0 -5
  75. data/test/bug_163/rewriter.rb +0 -20
  76. data/test/helper.rb +0 -60
  77. data/test/parse_helper.rb +0 -319
  78. data/test/racc_coverage_helper.rb +0 -133
  79. data/test/test_base.rb +0 -31
  80. data/test/test_current.rb +0 -29
  81. data/test/test_diagnostic.rb +0 -96
  82. data/test/test_diagnostic_engine.rb +0 -62
  83. data/test/test_encoding.rb +0 -99
  84. data/test/test_lexer.rb +0 -3608
  85. data/test/test_lexer_stack_state.rb +0 -78
  86. data/test/test_parse_helper.rb +0 -80
  87. data/test/test_parser.rb +0 -9430
  88. data/test/test_runner_parse.rb +0 -35
  89. data/test/test_runner_rewrite.rb +0 -47
  90. data/test/test_source_buffer.rb +0 -162
  91. data/test/test_source_comment.rb +0 -36
  92. data/test/test_source_comment_associator.rb +0 -367
  93. data/test/test_source_map.rb +0 -15
  94. data/test/test_source_range.rb +0 -187
  95. data/test/test_source_rewriter.rb +0 -541
  96. data/test/test_source_rewriter_action.rb +0 -46
  97. data/test/test_source_tree_rewriter.rb +0 -253
  98. data/test/test_static_environment.rb +0 -45
  99. data/test/using_tree_rewriter/fixtures/input.rb +0 -3
  100. data/test/using_tree_rewriter/fixtures/output.rb +0 -3
  101. data/test/using_tree_rewriter/using_tree_rewriter.rb +0 -9
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'helper'
4
-
5
- class TestSourceRewriterAction < Minitest::Test
6
- def setup
7
- @buf = Parser::Source::Buffer.new('(rewriter_action)')
8
- @buf.source = 'foo bar baz'
9
- end
10
-
11
- def range(from, len)
12
- Parser::Source::Range.new(@buf, from, from + len)
13
- end
14
-
15
- def action(range, replacement)
16
- Parser::Source::Rewriter::Action.new(range, replacement)
17
- end
18
-
19
- def test_accessors
20
- action = action(range(1, 10), 'foo')
21
-
22
- assert action.frozen?
23
- assert_equal range(1, 10), action.range
24
- assert_equal 'foo', action.replacement
25
- end
26
-
27
- def test_to_s_replace
28
- action = action(range(3, 1), 'foo')
29
- assert_equal "replace 1 character(s) with \"foo\"", action.to_s
30
- end
31
-
32
- def test_to_s_insert
33
- action = action(range(3, 0), 'foo')
34
- assert_equal "insert \"foo\"", action.to_s
35
- end
36
-
37
- def test_to_s_remove
38
- action = action(range(3, 2), '')
39
- assert_equal 'remove 2 character(s)', action.to_s
40
- end
41
-
42
- def test_to_s_nop
43
- action = action(range(3, 0), '')
44
- assert_equal 'do nothing', action.to_s
45
- end
46
- end
@@ -1,253 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'helper'
4
-
5
- class TestSourceTreeRewriter < Minitest::Test
6
- def setup
7
- @buf = Parser::Source::Buffer.new('(rewriter)')
8
- @buf.source = 'puts(:hello, :world)'
9
-
10
- @hello = range(5, 6)
11
- @ll = range(7, 2)
12
- @comma_space = range(11,2)
13
- @world = range(13,6)
14
- @whole = range(0, @buf.source.length)
15
- end
16
-
17
- def range(from, len)
18
- Parser::Source::Range.new(@buf, from, from + len)
19
- end
20
-
21
- # Returns either:
22
- # - yield rewriter
23
- # - [diagnostic, ...] (Diagnostics)
24
- # - Parser::ClobberingError
25
- #
26
- def build(actions, **policy)
27
- diagnostics = []
28
- diags = -> { diagnostics.flatten.map(&:strip).join("\n") }
29
- rewriter = Parser::Source::TreeRewriter.new(@buf, **policy)
30
- rewriter.diagnostics.consumer = -> diag { diagnostics << diag.render }
31
- actions.each do |action, range, *args|
32
- rewriter.public_send(action, range, *args)
33
- end
34
- if diagnostics.empty?
35
- yield rewriter
36
- else
37
- diags.call
38
- end
39
- rescue ::Parser::ClobberingError => e
40
- [::Parser::ClobberingError, diags.call]
41
- end
42
-
43
- # Returns either:
44
- # - String (Normal operation)
45
- # - [diagnostic, ...] (Diagnostics)
46
- # - Parser::ClobberingError
47
- #
48
- def apply(actions, **policy)
49
- build(actions, **policy) { |rewriter| rewriter.process }
50
- end
51
-
52
- # Expects ordered actions to be grouped together
53
- def check_actions(expected, grouped_actions, **policy)
54
- grouped_actions.permutation do |sequence|
55
- # [action, [action, action]] => [action, action, action]
56
- # except we can't use flatten because "action" are arrays themselves
57
- actions = sequence.flat_map { |group| group.first.is_a?(Array) ? group : [group] }
58
- assert_equal(expected, apply(actions, **policy))
59
- end
60
- end
61
-
62
- def assert_actions_result(expected, *actions, **rest)
63
- if expected == :raise
64
- diagnostic = rest.values.first
65
- check_actions([::Parser::ClobberingError, diagnostic], actions)
66
- elsif rest.empty?
67
- check_actions(expected, actions)
68
- else
69
- policy, diagnostic = rest.first
70
- check_actions(expected, actions, policy => :accept)
71
- check_actions(diagnostic, actions, policy => :warn)
72
- diagnostic.gsub!(/warning: /, 'error: ')
73
- check_actions([::Parser::ClobberingError, diagnostic], actions, policy => :raise)
74
- end
75
- end
76
-
77
- ### Simple cases
78
-
79
- def test_remove
80
- assert_actions_result 'puts(, :world)', [:remove, @hello]
81
- end
82
-
83
- def test_insert_before
84
- assert_actions_result 'puts(:hello, 42, :world)', [:insert_before, @world, '42, ']
85
- end
86
-
87
- def test_insert_after
88
- assert_actions_result 'puts(:hello, 42, :world)', [:insert_after, @hello, ', 42']
89
- end
90
-
91
- def test_wrap
92
- assert_actions_result 'puts([:hello], :world)', [:wrap, @hello, '[', ']']
93
- end
94
-
95
- def test_replace
96
- assert_actions_result 'puts(:hi, :world)', [:replace, @hello, ':hi']
97
- end
98
-
99
- #
100
- # All other cases, as per doc
101
- #
102
-
103
- def test_crossing_non_deletions
104
- check = [
105
- [:wrap, '(', ')'],
106
- [:remove],
107
- [:replace, 'xx'],
108
- ]
109
- check.combination(2) do |(action, *args), (action_b, *args_b)|
110
- next if action == :remove && action_b == :remove
111
- assert_actions_result :raise,
112
- [[action, @hello.join(@comma_space), *args],
113
- [action_b, @world.join(@comma_space), *args_b]],
114
- diagnostic: <<-DIAGNOSTIC.chomp
115
- (rewriter):1:12: error: the rewriting action on:
116
- (rewriter):1: puts(:hello, :world)
117
- (rewriter):1: ^~~~~~~~
118
- (rewriter):1:6: error: is crossing that on:
119
- (rewriter):1: puts(:hello, :world)
120
- (rewriter):1: ^~~~~~~~
121
- DIAGNOSTIC
122
- end
123
- end
124
-
125
-
126
- def test_crossing_deletions
127
- assert_actions_result 'puts()',
128
- [[:remove, @hello.join(@comma_space)],
129
- [:remove, @world.join(@comma_space)]],
130
- crossing_deletions: <<-DIAGNOSTIC.chomp
131
- (rewriter):1:12: warning: the deletion of:
132
- (rewriter):1: puts(:hello, :world)
133
- (rewriter):1: ^~~~~~~~
134
- (rewriter):1:6: warning: is crossing:
135
- (rewriter):1: puts(:hello, :world)
136
- (rewriter):1: ^~~~~~~~
137
- DIAGNOSTIC
138
- end
139
-
140
- def test_multiple_actions
141
- assert_actions_result 'puts({:hello => [:everybody]})',
142
- [:replace, @comma_space, ' => '],
143
- [:wrap, @hello.join(@world), '{', '}'],
144
- [:replace, @world, ':everybody'],
145
- [:wrap, @world, '[', ']']
146
- end
147
-
148
- def test_wraps_same_range
149
- assert_actions_result 'puts([(:hello)], :world)',
150
- [[:wrap, @hello, '(', ')'],
151
- [:wrap, @hello, '[', ']']]
152
- end
153
-
154
- def test_replace_same_range
155
- assert_actions_result 'puts(:hey, :world)',
156
- [[:replace, @hello, ':hi'],
157
- [:replace, @hello, ':hey']],
158
- different_replacements: <<-DIAGNOSTIC.chomp
159
- (rewriter):1:6: warning: different replacements: :hey vs :hi
160
- (rewriter):1: puts(:hello, :world)
161
- (rewriter):1: ^~~~~~
162
- DIAGNOSTIC
163
- end
164
-
165
- def test_swallowed_insertions
166
- assert_actions_result 'puts(:hi)',
167
- [[:wrap, @hello.adjust(begin_pos: 1), '__', '__'],
168
- [:replace, @world.adjust(end_pos: -2), 'xx'],
169
- [:replace, @hello.join(@world), ':hi']],
170
- swallowed_insertions: <<-DIAGNOSTIC.chomp
171
- (rewriter):1:6: warning: this replacement:
172
- (rewriter):1: puts(:hello, :world)
173
- (rewriter):1: ^~~~~~~~~~~~~~
174
- (rewriter):1:7: warning: swallows some inner rewriting actions:
175
- (rewriter):1: puts(:hello, :world)
176
- (rewriter):1: ^~~~~ ~~~~
177
- DIAGNOSTIC
178
- end
179
-
180
- def test_out_of_range_ranges
181
- rewriter = Parser::Source::TreeRewriter.new(@buf)
182
- assert_raises(IndexError) { rewriter.insert_before(range(0, 100), 'hola') }
183
- end
184
-
185
- def test_empty
186
- rewriter = Parser::Source::TreeRewriter.new(@buf)
187
- assert_equal true, rewriter.empty?
188
-
189
- # This is a trivial wrap
190
- rewriter.wrap(range(2,3), '', '')
191
- assert_equal true, rewriter.empty?
192
-
193
- # This is a trivial deletion
194
- rewriter.remove(range(2,0))
195
- assert_equal true, rewriter.empty?
196
-
197
- rewriter.remove(range(2,3))
198
- assert_equal false, rewriter.empty?
199
- end
200
-
201
- # splits array into two groups, yield all such possible pairs of groups
202
- # each_split([1, 2, 3, 4]) yields [1, 2], [3, 4];
203
- # then [1, 3], [2, 4]
204
- # ...
205
- # and finally [3, 4], [1, 2]
206
- def each_split(array)
207
- n = array.size
208
- first_split_size = n.div(2)
209
- splitting = (0...n).to_set
210
- splitting.to_a.combination(first_split_size) do |indices|
211
- yield array.values_at(*indices),
212
- array.values_at(*(splitting - indices))
213
- end
214
- end
215
-
216
- # Checks that `actions+extra` give the same result when
217
- # made in order or from subgroups that are later merged.
218
- # The `extra` actions are always added at the end of the second group.
219
- #
220
- def check_all_merge_possibilities(actions, extra, **policy)
221
- expected = apply(actions + extra, **policy)
222
-
223
- each_split(actions) do |actions_1, actions_2|
224
- build(actions_1, **policy) do |rewriter_1|
225
- build(actions_2 + extra, **policy) do |rewriter_2|
226
- result = rewriter_1.merge(rewriter_2).process
227
- assert_equal(expected, result,
228
- "Group 1: #{actions_1.inspect}\n\n" +
229
- "Group 2: #{(actions_2 + extra).inspect}"
230
- )
231
- end
232
- end
233
- end
234
- end
235
-
236
- def test_merge
237
- check_all_merge_possibilities([
238
- [:wrap, @whole, '<', '>'],
239
- [:replace, @comma_space, ' => '],
240
- [:wrap, @hello, '!', '!'],
241
- # Following two wraps must have same value as they
242
- # will be applied in different orders...
243
- [:wrap, @hello.join(@world), '{', '}'],
244
- [:wrap, @hello.join(@world), '{', '}'],
245
- [:remove, @ll],
246
- [:replace, @world, ':everybody'],
247
- [:wrap, @world, '[', ']']
248
- ],
249
- [ # ... but this one is always going to be applied last (extra)
250
- [:wrap, @hello.join(@world), '@', '@'],
251
- ])
252
- end
253
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'helper'
4
-
5
- class TestStaticEnvironment < Minitest::Test
6
- def setup
7
- @env = Parser::StaticEnvironment.new
8
- end
9
-
10
- def test_declare
11
- refute @env.declared?(:foo)
12
-
13
- @env.declare :foo
14
-
15
- assert @env.declared?(:foo)
16
- end
17
-
18
- def test_extend_static
19
- @env.declare :foo
20
- @env.extend_static
21
- @env.declare :bar
22
-
23
- refute @env.declared?(:foo)
24
- assert @env.declared?(:bar)
25
- end
26
-
27
- def test_extend_dynamic
28
- @env.declare :foo
29
- @env.extend_dynamic
30
- @env.declare :bar
31
-
32
- assert @env.declared?(:foo)
33
- assert @env.declared?(:bar)
34
- end
35
-
36
- def test_unextend
37
- @env.declare :foo
38
- @env.extend_dynamic
39
- @env.declare :bar
40
- @env.unextend
41
-
42
- assert @env.declared?(:foo)
43
- refute @env.declared?(:bar)
44
- end
45
- end
@@ -1,3 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- 6 * 7
@@ -1,3 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- ([6] * 7)
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UsingTreeRewriter < Parser::TreeRewriter
4
- def on_send(node)
5
- wrap(node.loc.expression, '(', ')')
6
- wrap(node.children[0].loc.expression, '[', ']')
7
- super
8
- end
9
- end