@@ -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
0 commit comments