Class: Evilution::Integration::Loading::RedefinitionRecovery

Inherits:
Object
  • Object
show all
Defined in:
lib/evilution/integration/loading/redefinition_recovery.rb

Overview

Some DSLs (Rails 8 enum, define_method guards) raise ArgumentError on re-declaration. On such a conflict we strip constants declared in the source and retry the load once against a fresh namespace.

Instance Method Summary collapse

Constructor Details

#initialize(constant_names: Evilution::AST::ConstantNames.new) ⇒ RedefinitionRecovery

Returns a new instance of RedefinitionRecovery.



10
11
12
# File 'lib/evilution/integration/loading/redefinition_recovery.rb', line 10

def initialize(constant_names: Evilution::AST::ConstantNames.new)
  @constant_names = constant_names
end

Instance Method Details

#call(source, &block) ⇒ Object



14
15
16
17
18
19
20
21
# File 'lib/evilution/integration/loading/redefinition_recovery.rb', line 14

def call(source, &block)
  block.call
rescue ArgumentError => e
  raise unless redefinition_conflict?(e)

  remove_defined_constants(source)
  block.call
end