parser 2.7.1.0 → 2.7.1.5
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.
- checksums.yaml +4 -4
- data/.travis.yml +10 -11
- data/CHANGELOG.md +70 -1
- data/README.md +2 -2
- data/Rakefile +2 -1
- data/doc/AST_FORMAT.md +107 -3
- data/lib/parser.rb +1 -0
- data/lib/parser/all.rb +1 -0
- data/lib/parser/ast/processor.rb +2 -0
- data/lib/parser/base.rb +6 -5
- data/lib/parser/builders/default.rb +146 -19
- data/lib/parser/context.rb +1 -0
- data/lib/parser/current.rb +9 -0
- data/lib/parser/diagnostic.rb +1 -1
- data/lib/parser/diagnostic/engine.rb +1 -2
- data/lib/parser/lexer.rb +23770 -0
- data/lib/parser/lexer.rl +15 -1
- data/lib/parser/macruby.rb +6149 -0
- data/lib/parser/macruby.y +15 -5
- data/lib/parser/max_numparam_stack.rb +1 -1
- data/lib/parser/messages.rb +17 -0
- data/lib/parser/meta.rb +3 -3
- data/lib/parser/ruby18.rb +5663 -0
- data/lib/parser/ruby18.y +3 -1
- data/lib/parser/ruby19.rb +6092 -0
- data/lib/parser/ruby19.y +15 -5
- data/lib/parser/ruby20.rb +6527 -0
- data/lib/parser/ruby20.y +15 -5
- data/lib/parser/ruby21.rb +6578 -0
- data/lib/parser/ruby21.y +10 -3
- data/lib/parser/ruby22.rb +6613 -0
- data/lib/parser/ruby22.y +10 -3
- data/lib/parser/ruby23.rb +6624 -0
- data/lib/parser/ruby23.y +10 -3
- data/lib/parser/ruby24.rb +6694 -0
- data/lib/parser/ruby24.y +10 -3
- data/lib/parser/ruby25.rb +6662 -0
- data/lib/parser/ruby25.y +10 -3
- data/lib/parser/ruby26.rb +6676 -0
- data/lib/parser/ruby26.y +10 -3
- data/lib/parser/ruby27.rb +7803 -0
- data/lib/parser/ruby27.y +16 -8
- data/lib/parser/ruby30.rb +8052 -0
- data/lib/parser/ruby30.y +3048 -0
- data/lib/parser/rubymotion.rb +6086 -0
- data/lib/parser/rubymotion.y +15 -5
- data/lib/parser/runner.rb +26 -2
- data/lib/parser/runner/ruby_rewrite.rb +2 -2
- data/lib/parser/source/buffer.rb +3 -1
- data/lib/parser/source/comment.rb +1 -1
- data/lib/parser/source/comment/associator.rb +14 -4
- data/lib/parser/source/map/method_definition.rb +25 -0
- data/lib/parser/source/range.rb +19 -3
- data/lib/parser/source/tree_rewriter.rb +115 -12
- data/lib/parser/source/tree_rewriter/action.rb +135 -26
- data/lib/parser/tree_rewriter.rb +1 -2
- data/lib/parser/version.rb +1 -1
- data/parser.gemspec +6 -2
- data/test/helper.rb +49 -6
- data/test/parse_helper.rb +49 -40
- data/test/test_ast_processor.rb +32 -0
- data/test/test_base.rb +1 -1
- data/test/test_current.rb +2 -0
- data/test/test_diagnostic.rb +6 -7
- data/test/test_diagnostic_engine.rb +5 -8
- data/test/test_lexer.rb +17 -8
- data/test/test_meta.rb +12 -0
- data/test/test_parse_helper.rb +12 -9
- data/test/test_parser.rb +612 -56
- data/test/test_runner_parse.rb +22 -1
- data/test/test_runner_rewrite.rb +1 -1
- data/test/test_source_buffer.rb +4 -1
- data/test/test_source_comment.rb +2 -2
- data/test/test_source_comment_associator.rb +47 -15
- data/test/test_source_map.rb +1 -2
- data/test/test_source_range.rb +29 -9
- data/test/test_source_rewriter.rb +4 -4
- data/test/test_source_rewriter_action.rb +2 -2
- data/test/test_source_tree_rewriter.rb +201 -13
- metadata +19 -13
- data/.gitignore +0 -33
data/lib/parser/tree_rewriter.rb
CHANGED
@@ -28,8 +28,7 @@ module Parser
|
|
28
28
|
# EOF
|
29
29
|
#
|
30
30
|
# ast = Parser::CurrentRuby.parse code
|
31
|
-
# buffer = Parser::Source::Buffer.new('(example)')
|
32
|
-
# buffer.source = code
|
31
|
+
# buffer = Parser::Source::Buffer.new('(example)', source: code)
|
33
32
|
# rewriter = RemoveDo.new
|
34
33
|
#
|
35
34
|
# # Rewrite the AST, returns a String with the new form.
|
data/lib/parser/version.rb
CHANGED
data/parser.gemspec
CHANGED
@@ -32,19 +32,23 @@ Gem::Specification.new do |spec|
|
|
32
32
|
lib/parser/ruby25.rb
|
33
33
|
lib/parser/ruby26.rb
|
34
34
|
lib/parser/ruby27.rb
|
35
|
+
lib/parser/ruby30.rb
|
35
36
|
lib/parser/macruby.rb
|
36
37
|
lib/parser/rubymotion.rb
|
38
|
+
) - %w(
|
39
|
+
.gitignore
|
37
40
|
)
|
41
|
+
|
38
42
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
39
43
|
spec.test_files = spec.files.grep(%r{^test/})
|
40
44
|
spec.require_paths = ['lib']
|
41
45
|
|
42
46
|
spec.required_ruby_version = '>= 2.0.0'
|
43
47
|
|
44
|
-
spec.add_dependency 'ast', '~> 2.4.
|
48
|
+
spec.add_dependency 'ast', '~> 2.4.1'
|
45
49
|
|
46
50
|
spec.add_development_dependency 'bundler', '>= 1.15', '< 3.0.0'
|
47
|
-
spec.add_development_dependency 'rake', '~>
|
51
|
+
spec.add_development_dependency 'rake', '~> 13.0.1'
|
48
52
|
spec.add_development_dependency 'racc', '= 1.4.15'
|
49
53
|
spec.add_development_dependency 'cliver', '~> 0.3.2'
|
50
54
|
|
data/test/helper.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'tempfile'
|
4
|
-
require 'minitest/test'
|
5
|
-
|
6
4
|
require 'simplecov'
|
7
5
|
|
8
6
|
if ENV.include?('COVERAGE') && SimpleCov.usable?
|
@@ -20,6 +18,7 @@ if ENV.include?('COVERAGE') && SimpleCov.usable?
|
|
20
18
|
ruby25.y
|
21
19
|
ruby26.y
|
22
20
|
ruby27.y
|
21
|
+
ruby30.y
|
23
22
|
),
|
24
23
|
File.expand_path('../../lib/parser', __FILE__))
|
25
24
|
|
@@ -27,9 +26,9 @@ if ENV.include?('COVERAGE') && SimpleCov.usable?
|
|
27
26
|
at_exit { RaccCoverage.stop }
|
28
27
|
|
29
28
|
SimpleCov.start do
|
30
|
-
self.formatter = SimpleCov::Formatter::MultiFormatter
|
31
|
-
SimpleCov::Formatter::HTMLFormatter
|
32
|
-
|
29
|
+
self.formatter = SimpleCov::Formatter::MultiFormatter.new(
|
30
|
+
SimpleCov::Formatter::HTMLFormatter
|
31
|
+
)
|
33
32
|
|
34
33
|
add_group 'Grammars' do |source_file|
|
35
34
|
source_file.filename =~ %r{\.y$}
|
@@ -52,9 +51,53 @@ require 'minitest/autorun'
|
|
52
51
|
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
53
52
|
require 'parser'
|
54
53
|
|
54
|
+
module NodeCollector
|
55
|
+
extend self
|
56
|
+
attr_accessor :callbacks, :nodes
|
57
|
+
self.callbacks = []
|
58
|
+
self.nodes = []
|
59
|
+
|
60
|
+
def check
|
61
|
+
@callbacks.each do |callback|
|
62
|
+
@nodes.each { |node| callback.call(node) }
|
63
|
+
end
|
64
|
+
puts "#{callbacks.size} additional tests on #{nodes.size} nodes ran successfully"
|
65
|
+
end
|
66
|
+
|
67
|
+
Minitest.after_run { check }
|
68
|
+
end
|
69
|
+
|
70
|
+
def for_each_node(&block)
|
71
|
+
NodeCollector.callbacks << block
|
72
|
+
end
|
73
|
+
|
55
74
|
class Parser::AST::Node
|
56
75
|
def initialize(type, *)
|
57
|
-
|
76
|
+
NodeCollector.nodes << self
|
58
77
|
super
|
59
78
|
end
|
60
79
|
end
|
80
|
+
|
81
|
+
# Special test extension that records a context of the parser
|
82
|
+
# for any node that is created
|
83
|
+
module NodeContextExt
|
84
|
+
module NodeExt
|
85
|
+
attr_reader :context
|
86
|
+
|
87
|
+
def assign_properties(properties)
|
88
|
+
super
|
89
|
+
|
90
|
+
if (context = properties[:context])
|
91
|
+
@context = context
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
Parser::AST::Node.prepend(NodeExt)
|
96
|
+
|
97
|
+
module BuilderExt
|
98
|
+
def n(type, children, source_map)
|
99
|
+
super.updated(nil, nil, context: @parser.context.stack.dup)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
Parser::Builders::Default.prepend(BuilderExt)
|
103
|
+
end
|
data/test/parse_helper.rb
CHANGED
@@ -7,7 +7,7 @@ module ParseHelper
|
|
7
7
|
require 'parser/macruby'
|
8
8
|
require 'parser/rubymotion'
|
9
9
|
|
10
|
-
ALL_VERSIONS = %w(1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 mac ios)
|
10
|
+
ALL_VERSIONS = %w(1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 3.0 mac ios)
|
11
11
|
|
12
12
|
def setup
|
13
13
|
@diagnostics = []
|
@@ -27,6 +27,7 @@ module ParseHelper
|
|
27
27
|
when '2.5' then parser = Parser::Ruby25.new
|
28
28
|
when '2.6' then parser = Parser::Ruby26.new
|
29
29
|
when '2.7' then parser = Parser::Ruby27.new
|
30
|
+
when '3.0' then parser = Parser::Ruby30.new
|
30
31
|
when 'mac' then parser = Parser::MacRuby.new
|
31
32
|
when 'ios' then parser = Parser::RubyMotion.new
|
32
33
|
else raise "Unrecognized Ruby version #{version}"
|
@@ -48,15 +49,17 @@ module ParseHelper
|
|
48
49
|
end
|
49
50
|
end
|
50
51
|
|
51
|
-
def assert_source_range(
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
52
|
+
def assert_source_range(expect_range, range, version, what)
|
53
|
+
if expect_range == nil
|
54
|
+
# Avoid "Use assert_nil if expecting nil from .... This will fail in Minitest 6.""
|
55
|
+
assert_nil range,
|
56
|
+
"(#{version}) range of #{what}"
|
57
|
+
else
|
58
|
+
assert range.is_a?(Parser::Source::Range),
|
59
|
+
"(#{version}) #{range.inspect}.is_a?(Source::Range) for #{what}"
|
60
|
+
assert_equal expect_range, range.to_range,
|
61
|
+
"(#{version}) range of #{what}"
|
62
|
+
end
|
60
63
|
end
|
61
64
|
|
62
65
|
# Use like this:
|
@@ -84,8 +87,7 @@ module ParseHelper
|
|
84
87
|
end
|
85
88
|
|
86
89
|
def try_parsing(ast, code, parser, source_maps, version)
|
87
|
-
source_file = Parser::Source::Buffer.new('(assert_parses)')
|
88
|
-
source_file.source = code
|
90
|
+
source_file = Parser::Source::Buffer.new('(assert_parses)', source: code)
|
89
91
|
|
90
92
|
begin
|
91
93
|
parsed_ast = parser.parse(source_file)
|
@@ -105,8 +107,7 @@ module ParseHelper
|
|
105
107
|
assert_equal ast, parsed_ast,
|
106
108
|
"(#{version}) AST equality"
|
107
109
|
|
108
|
-
parse_source_map_descriptions(source_maps)
|
109
|
-
do |begin_pos, end_pos, map_field, ast_path, line|
|
110
|
+
parse_source_map_descriptions(source_maps) do |range, map_field, ast_path, line|
|
110
111
|
|
111
112
|
astlet = traverse_ast(parsed_ast, ast_path)
|
112
113
|
|
@@ -120,9 +121,9 @@ module ParseHelper
|
|
120
121
|
assert astlet.location.respond_to?(map_field),
|
121
122
|
"(#{version}) #{astlet.location.inspect}.respond_to?(#{map_field.inspect}) for:\n#{parsed_ast.inspect}"
|
122
123
|
|
123
|
-
|
124
|
+
found_range = astlet.location.send(map_field)
|
124
125
|
|
125
|
-
assert_source_range(
|
126
|
+
assert_source_range(range, found_range, version, line.inspect)
|
126
127
|
end
|
127
128
|
|
128
129
|
assert parser.instance_eval { @lexer }.cmdarg.empty?,
|
@@ -142,8 +143,7 @@ module ParseHelper
|
|
142
143
|
# ~~~
|
143
144
|
def assert_diagnoses(diagnostic, code, source_maps='', versions=ALL_VERSIONS)
|
144
145
|
with_versions(versions) do |version, parser|
|
145
|
-
source_file = Parser::Source::Buffer.new('(assert_diagnoses)')
|
146
|
-
source_file.source = code
|
146
|
+
source_file = Parser::Source::Buffer.new('(assert_diagnoses)', source: code)
|
147
147
|
|
148
148
|
begin
|
149
149
|
parser = parser.parse(source_file)
|
@@ -159,26 +159,25 @@ module ParseHelper
|
|
159
159
|
|
160
160
|
level, reason, arguments = diagnostic
|
161
161
|
arguments ||= {}
|
162
|
-
message = Parser::
|
162
|
+
message = Parser::Messages.compile(reason, arguments)
|
163
163
|
|
164
164
|
assert_equal level, emitted_diagnostic.level
|
165
165
|
assert_equal reason, emitted_diagnostic.reason
|
166
166
|
assert_equal arguments, emitted_diagnostic.arguments
|
167
167
|
assert_equal message, emitted_diagnostic.message
|
168
168
|
|
169
|
-
parse_source_map_descriptions(source_maps)
|
170
|
-
do |begin_pos, end_pos, map_field, ast_path, line|
|
169
|
+
parse_source_map_descriptions(source_maps) do |range, map_field, ast_path, line|
|
171
170
|
|
172
171
|
case map_field
|
173
172
|
when 'location'
|
174
|
-
assert_source_range
|
173
|
+
assert_source_range range,
|
175
174
|
emitted_diagnostic.location,
|
176
175
|
version, 'location'
|
177
176
|
|
178
177
|
when 'highlights'
|
179
178
|
index = ast_path.first.to_i
|
180
179
|
|
181
|
-
assert_source_range
|
180
|
+
assert_source_range range,
|
182
181
|
emitted_diagnostic.highlights[index],
|
183
182
|
version, "#{index}th highlight"
|
184
183
|
|
@@ -201,8 +200,7 @@ module ParseHelper
|
|
201
200
|
# ~~~
|
202
201
|
def assert_diagnoses_many(diagnostics, code, versions=ALL_VERSIONS)
|
203
202
|
with_versions(versions) do |version, parser|
|
204
|
-
source_file = Parser::Source::Buffer.new('(assert_diagnoses_many)')
|
205
|
-
source_file.source = code
|
203
|
+
source_file = Parser::Source::Buffer.new('(assert_diagnoses_many)', source: code)
|
206
204
|
|
207
205
|
begin
|
208
206
|
parser = parser.parse(source_file)
|
@@ -215,7 +213,7 @@ module ParseHelper
|
|
215
213
|
diagnostics.zip(@diagnostics) do |expected_diagnostic, actual_diagnostic|
|
216
214
|
level, reason, arguments = expected_diagnostic
|
217
215
|
arguments ||= {}
|
218
|
-
message = Parser::
|
216
|
+
message = Parser::Messages.compile(reason, arguments)
|
219
217
|
|
220
218
|
assert_equal level, actual_diagnostic.level
|
221
219
|
assert_equal reason, actual_diagnostic.reason
|
@@ -227,8 +225,7 @@ module ParseHelper
|
|
227
225
|
|
228
226
|
def refute_diagnoses(code, versions=ALL_VERSIONS)
|
229
227
|
with_versions(versions) do |version, parser|
|
230
|
-
source_file = Parser::Source::Buffer.new('(refute_diagnoses)')
|
231
|
-
source_file.source = code
|
228
|
+
source_file = Parser::Source::Buffer.new('(refute_diagnoses)', source: code)
|
232
229
|
|
233
230
|
begin
|
234
231
|
parser = parser.parse(source_file)
|
@@ -244,23 +241,22 @@ module ParseHelper
|
|
244
241
|
|
245
242
|
def assert_context(context, code, versions=ALL_VERSIONS)
|
246
243
|
with_versions(versions) do |version, parser|
|
247
|
-
source_file = Parser::Source::Buffer.new('(assert_context)')
|
248
|
-
source_file.source = code
|
244
|
+
source_file = Parser::Source::Buffer.new('(assert_context)', source: code)
|
249
245
|
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
end
|
246
|
+
parsed_ast = parser.parse(source_file)
|
247
|
+
|
248
|
+
nodes = find_matching_nodes(parsed_ast) { |node| node.type == :send && node.children[1] == :get_context }
|
249
|
+
assert_equal 1, nodes.count, "there must exactly 1 `get_context()` call"
|
255
250
|
|
256
|
-
|
251
|
+
node = nodes.first
|
252
|
+
assert_equal context, node.context, "(#{version}) expect parsing context to match"
|
257
253
|
end
|
258
254
|
end
|
259
255
|
|
260
256
|
SOURCE_MAP_DESCRIPTION_RE =
|
261
257
|
/(?x)
|
262
258
|
^(?# $1 skip) ^(\s*)
|
263
|
-
(?# $2 highlight) ([~\^]
|
259
|
+
(?# $2 highlight) ([~\^]+|\!)
|
264
260
|
\s+
|
265
261
|
(?# $3 source_map_field) ([a-z_]+)
|
266
262
|
(?# $5 ast_path) (\s+\(([a-z_.\/0-9]+)\))?
|
@@ -278,8 +274,11 @@ module ParseHelper
|
|
278
274
|
next if line.empty?
|
279
275
|
|
280
276
|
if (match = SOURCE_MAP_DESCRIPTION_RE.match(line))
|
281
|
-
|
282
|
-
|
277
|
+
if match[2] != '!'
|
278
|
+
begin_pos = match[1].length
|
279
|
+
end_pos = begin_pos + match[2].length
|
280
|
+
range = begin_pos...end_pos
|
281
|
+
end
|
283
282
|
source_map_field = match[3]
|
284
283
|
|
285
284
|
if match[5]
|
@@ -288,7 +287,7 @@ module ParseHelper
|
|
288
287
|
ast_path = []
|
289
288
|
end
|
290
289
|
|
291
|
-
yield
|
290
|
+
yield range, source_map_field, ast_path, line
|
292
291
|
else
|
293
292
|
raise "Cannot parse source map description line: #{line.inspect}."
|
294
293
|
end
|
@@ -316,4 +315,14 @@ module ParseHelper
|
|
316
315
|
matching_children[index]
|
317
316
|
end
|
318
317
|
end
|
318
|
+
|
319
|
+
def find_matching_nodes(ast, &block)
|
320
|
+
return [] unless ast.is_a?(AST::Node)
|
321
|
+
|
322
|
+
result = []
|
323
|
+
result << ast if block.call(ast)
|
324
|
+
ast.children.each { |child| result += find_matching_nodes(child, &block) }
|
325
|
+
|
326
|
+
result
|
327
|
+
end
|
319
328
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'helper'
|
4
|
+
|
5
|
+
class TestASTProcessor < Minitest::Test
|
6
|
+
LEAF_NODES = %i[
|
7
|
+
sym str int float complex rational
|
8
|
+
true false nil self
|
9
|
+
__FILE__ __LINE__ __ENCODING__
|
10
|
+
cbase regopt zsuper
|
11
|
+
match_with_trailing_comma match_nil_pattern
|
12
|
+
forward_args forwarded_args numargs kwnilarg
|
13
|
+
objc_varargs objc_restarg objc_kwarg
|
14
|
+
ident
|
15
|
+
].freeze
|
16
|
+
|
17
|
+
def setup
|
18
|
+
@traversible = Parser::AST::Processor
|
19
|
+
.instance_methods(false)
|
20
|
+
.map { |mid| mid.to_s.scan(/\Aon_(.*)/) }
|
21
|
+
.flatten
|
22
|
+
.map(&:to_sym)
|
23
|
+
|
24
|
+
@traversible += LEAF_NODES
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_nodes_are_traversible
|
28
|
+
for_each_node do |node|
|
29
|
+
assert_includes @traversible, node.type
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/test/test_base.rb
CHANGED
data/test/test_current.rb
CHANGED
@@ -22,6 +22,8 @@ class TestCurrent < Minitest::Test
|
|
22
22
|
assert_equal Parser::Ruby26, Parser::CurrentRuby
|
23
23
|
when /^2\.7\.\d+/
|
24
24
|
assert_equal Parser::Ruby27, Parser::CurrentRuby
|
25
|
+
when /^3\.0\.\d+/
|
26
|
+
assert_equal Parser::Ruby30, Parser::CurrentRuby
|
25
27
|
else
|
26
28
|
flunk "Update test_current for #{RUBY_VERSION}"
|
27
29
|
end
|
data/test/test_diagnostic.rb
CHANGED
@@ -4,8 +4,8 @@ require 'helper'
|
|
4
4
|
|
5
5
|
class TestDiagnostic < Minitest::Test
|
6
6
|
def setup
|
7
|
-
@buffer = Parser::Source::Buffer.new('(string)'
|
8
|
-
|
7
|
+
@buffer = Parser::Source::Buffer.new('(string)',
|
8
|
+
source: 'if (this is some bad code + bugs)')
|
9
9
|
|
10
10
|
@range1 = Parser::Source::Range.new(@buffer, 0, 2) # if
|
11
11
|
@range2 = Parser::Source::Range.new(@buffer, 4, 8) # this
|
@@ -16,7 +16,7 @@ class TestDiagnostic < Minitest::Test
|
|
16
16
|
Parser::Diagnostic.new(:foobar, :escape_eof, {}, @range1)
|
17
17
|
end
|
18
18
|
|
19
|
-
assert_match
|
19
|
+
assert_match(/level/, error.message)
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_freezes
|
@@ -50,8 +50,8 @@ class TestDiagnostic < Minitest::Test
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def test_multiline_render
|
53
|
-
@buffer = Parser::Source::Buffer.new('(string)'
|
54
|
-
|
53
|
+
@buffer = Parser::Source::Buffer.new('(string)',
|
54
|
+
source: "abc abc abc\ndef def def\nghi ghi ghi\n")
|
55
55
|
|
56
56
|
location = Parser::Source::Range.new(@buffer, 4, 27)
|
57
57
|
|
@@ -80,8 +80,7 @@ class TestDiagnostic < Minitest::Test
|
|
80
80
|
}
|
81
81
|
}
|
82
82
|
CODE
|
83
|
-
@buffer = Parser::Source::Buffer.new('(string)')
|
84
|
-
@buffer.source = source
|
83
|
+
@buffer = Parser::Source::Buffer.new('(string)', source: source)
|
85
84
|
|
86
85
|
location = Parser::Source::Range.new(@buffer, 33, 34)
|
87
86
|
diag = Parser::Diagnostic.new(:error, :unexpected_token, { :token => 'tNL' },
|
@@ -4,9 +4,6 @@ require 'helper'
|
|
4
4
|
|
5
5
|
class TestDiagnosticEngine < Minitest::Test
|
6
6
|
def setup
|
7
|
-
@buffer = Parser::Source::Buffer.new('(source)')
|
8
|
-
@buffer.source = 'foobar'
|
9
|
-
|
10
7
|
@engine = Parser::Diagnostic::Engine.new
|
11
8
|
|
12
9
|
@queue = []
|
@@ -14,7 +11,7 @@ class TestDiagnosticEngine < Minitest::Test
|
|
14
11
|
end
|
15
12
|
|
16
13
|
def test_process_warnings
|
17
|
-
warn = Parser::Diagnostic.new(:warning, :invalid_escape,
|
14
|
+
warn = Parser::Diagnostic.new(:warning, :invalid_escape, {}, 1..2)
|
18
15
|
@engine.process(warn)
|
19
16
|
|
20
17
|
assert_equal [warn], @queue
|
@@ -23,7 +20,7 @@ class TestDiagnosticEngine < Minitest::Test
|
|
23
20
|
def test_ignore_warnings
|
24
21
|
@engine.ignore_warnings = true
|
25
22
|
|
26
|
-
warn = Parser::Diagnostic.new(:warning, :invalid_escape,
|
23
|
+
warn = Parser::Diagnostic.new(:warning, :invalid_escape, {}, 1..2)
|
27
24
|
@engine.process(warn)
|
28
25
|
|
29
26
|
assert_equal [], @queue
|
@@ -32,7 +29,7 @@ class TestDiagnosticEngine < Minitest::Test
|
|
32
29
|
def test_all_errors_are_fatal
|
33
30
|
@engine.all_errors_are_fatal = true
|
34
31
|
|
35
|
-
error = Parser::Diagnostic.new(:error, :invalid_escape,
|
32
|
+
error = Parser::Diagnostic.new(:error, :invalid_escape, {}, 1..2)
|
36
33
|
|
37
34
|
err = assert_raises Parser::SyntaxError do
|
38
35
|
@engine.process(error)
|
@@ -44,14 +41,14 @@ class TestDiagnosticEngine < Minitest::Test
|
|
44
41
|
end
|
45
42
|
|
46
43
|
def test_all_errors_are_collected
|
47
|
-
error = Parser::Diagnostic.new(:error, :invalid_escape,
|
44
|
+
error = Parser::Diagnostic.new(:error, :invalid_escape, {}, 1..2)
|
48
45
|
@engine.process(error)
|
49
46
|
|
50
47
|
assert_equal [error], @queue
|
51
48
|
end
|
52
49
|
|
53
50
|
def test_fatal_error
|
54
|
-
fatal = Parser::Diagnostic.new(:fatal, :invalid_escape,
|
51
|
+
fatal = Parser::Diagnostic.new(:fatal, :invalid_escape, {}, 1..2)
|
55
52
|
|
56
53
|
assert_raises Parser::SyntaxError do
|
57
54
|
@engine.process(fatal)
|