@@ -95,6 +95,7 @@ def initialize(source_buffer,
95
95
crossing_deletions : :accept ,
96
96
different_replacements : :accept ,
97
97
swallowed_insertions : :accept )
98
+ @diagnostics = nil
98
99
@source_buffer = source_buffer
99
100
@in_transaction = false
100
101
@@ -321,12 +322,20 @@ def transaction
321
322
# Provides access to a diagnostic engine.
322
323
# By default outputs diagnostic to $stderr
323
324
#
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 |
326
327
engine . consumer = -> diag { $stderr. puts diag . render }
327
328
end
328
329
end
329
330
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
+
330
339
def in_transaction?
331
340
@in_transaction
332
341
end
@@ -409,11 +418,12 @@ def policy(event)
409
418
def trigger_policy ( event , range : raise , conflict : nil , **arguments )
410
419
action = policy ( event )
411
420
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 )
413
423
if conflict
414
424
range , *highlights = conflict
415
425
diag = Parser ::Diagnostic . new ( POLICY_TO_LEVEL [ action ] , :"#{ event } _conflict" , arguments , range , highlights )
416
- @diagnostics . process ( diag )
426
+ engine . process ( diag )
417
427
end
418
428
raise Parser ::ClobberingError , "Parser::Source::TreeRewriter detected clobbering" if action == :raise
419
429
end
0 commit comments