Skip to content

Commit c989d92

Browse files
committed
+ Add Source::TreeRewriter.default_diagnostics
1 parent f14df41 commit c989d92

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

lib/parser/source/tree_rewriter.rb

+14-4
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ def initialize(source_buffer,
9595
crossing_deletions: :accept,
9696
different_replacements: :accept,
9797
swallowed_insertions: :accept)
98+
@diagnostics = nil
9899
@source_buffer = source_buffer
99100
@in_transaction = false
100101

@@ -321,12 +322,20 @@ def transaction
321322
# Provides access to a diagnostic engine.
322323
# By default outputs diagnostic to $stderr
323324
#
324-
def diagnostics
325-
@diagnostics ||= Diagnostic::Engine.new.tap do |engine|
325+
def self.default_diagnostics
326+
@default_diagnostics ||= Diagnostic::Engine.new.tap do |engine|
326327
engine.consumer = -> diag { $stderr.puts diag.render }
327328
end
328329
end
329330

331+
##
332+
# Provides access to a diagnostic engine.
333+
# By default: self.class.default_diagnostics
334+
#
335+
def diagnostics
336+
@diagnostics ||= self.class.default_diagnostics.dup
337+
end
338+
330339
def in_transaction?
331340
@in_transaction
332341
end
@@ -409,11 +418,12 @@ def policy(event)
409418
def trigger_policy(event, range: raise, conflict: nil, **arguments)
410419
action = policy(event)
411420
diag = Parser::Diagnostic.new(POLICY_TO_LEVEL[action], event, arguments, range)
412-
@diagnostics.process(diag)
421+
engine = @diagnostics || self.class.default_diagnostics
422+
engine.process(diag)
413423
if conflict
414424
range, *highlights = conflict
415425
diag = Parser::Diagnostic.new(POLICY_TO_LEVEL[action], :"#{event}_conflict", arguments, range, highlights)
416-
@diagnostics.process(diag)
426+
engine.process(diag)
417427
end
418428
raise Parser::ClobberingError, "Parser::Source::TreeRewriter detected clobbering" if action == :raise
419429
end

test/test_source_tree_rewriter.rb

+13
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,19 @@ def test_ordered_replacements
298298
result.map {|r, s| [r.to_range, s]}
299299
)
300300
end
301+
302+
def test_default_diagnostics
303+
default = Parser::Source::TreeRewriter.default_diagnostics
304+
before = default.consumer
305+
diagnostics = []
306+
default.consumer = -> diag { diagnostics << diag.render }
307+
rewriter = Parser::Source::TreeRewriter.new(@buf, swallowed_insertions: :warn)
308+
rewriter.replace(@ll, 'xx')
309+
rewriter.remove(@hello)
310+
assert_equal(2, diagnostics.size)
311+
ensure
312+
default.consumer = before
313+
end
301314
end
302315

303316
class TestSourceTreeRewriterImport < Minitest::Test

0 commit comments

Comments
 (0)