 6ada9a9665
			
		
	
	
		6ada9a9665
		
			
		
	
	
	
	
		
			
			- Needed for PR 18842 that adds a `DisableComment` RuboCop to ensure that all RuboCop disables have comments.
		
			
				
	
	
		
			55 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # typed: true # rubocop:todo Sorbet/StrictSigil
 | |
| # frozen_string_literal: true
 | |
| 
 | |
| require "warnings"
 | |
| Warnings.ignore(/warning: callcc is obsolete; use Fiber instead/) do
 | |
|   require "continuation"
 | |
| end
 | |
| 
 | |
| # Provides the ability to optionally ignore errors raised and continue execution.
 | |
| module Ignorable
 | |
|   # Marks exceptions which can be ignored and provides
 | |
|   # the ability to jump back to where it was raised.
 | |
|   module ExceptionMixin
 | |
|     attr_accessor :continuation
 | |
| 
 | |
|     def ignore
 | |
|       continuation.call
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def self.hook_raise
 | |
|     Object.class_eval do
 | |
|       alias_method :original_raise, :raise
 | |
| 
 | |
|       def raise(*)
 | |
|         callcc do |continuation|
 | |
|           super
 | |
|         # Handle all possible exceptions.
 | |
|         rescue Exception => e # rubocop:disable Lint/RescueException
 | |
|           unless e.is_a?(ScriptError)
 | |
|             e.extend(ExceptionMixin)
 | |
|             T.cast(e, ExceptionMixin).continuation = continuation
 | |
|           end
 | |
|           super(e)
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       alias_method :fail, :raise
 | |
|     end
 | |
| 
 | |
|     return unless block_given?
 | |
| 
 | |
|     yield
 | |
|     unhook_raise
 | |
|   end
 | |
| 
 | |
|   def self.unhook_raise
 | |
|     Object.class_eval do
 | |
|       alias_method :raise, :original_raise
 | |
|       alias_method :fail, :original_raise
 | |
|       undef :original_raise
 | |
|     end
 | |
|   end
 | |
| end
 |