parser 2.7.1.0 → 2.7.1.5
Sign up to get free protection for your applications and to get access to all the features.
- 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)
|