mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	[ruby/delegate] Fix DelegateClass block "method redefined" warning
This commit prevents "method redefined" warnings when overriding methods
within a `DelegateClass` block, such as in the following example:
  ```ruby
  Base = Class.new do
    def foo
      "foo"
    end
  end
  Overridden = DelegateClass(Base) do
    def foo
      super + "!"
    end
  end
  ```
Fixes https://bugs.ruby-lang.org/issues/19047.
214fae86de
			
			
This commit is contained in:
		
							parent
							
								
									d416205341
								
							
						
					
					
						commit
						6061003100
					
				
					 2 changed files with 14 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -412,10 +412,12 @@ def DelegateClass(superclass, &block)
 | 
			
		|||
    end
 | 
			
		||||
    protected_instance_methods.each do |method|
 | 
			
		||||
      define_method(method, Delegator.delegating_block(method))
 | 
			
		||||
      alias_method(method, method)
 | 
			
		||||
      protected method
 | 
			
		||||
    end
 | 
			
		||||
    public_instance_methods.each do |method|
 | 
			
		||||
      define_method(method, Delegator.delegating_block(method))
 | 
			
		||||
      alias_method(method, method)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
  klass.define_singleton_method :public_instance_methods do |all=true|
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,6 +29,18 @@ class TestDelegateClass < Test::Unit::TestCase
 | 
			
		|||
    assert_equal(1, klass.new([1]).foo)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_delegate_class_block_with_override
 | 
			
		||||
    warning = EnvUtil.verbose_warning do
 | 
			
		||||
      klass = DelegateClass(Array) do
 | 
			
		||||
        def first
 | 
			
		||||
          super.inspect
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      assert_equal("1", klass.new([1]).first)
 | 
			
		||||
    end
 | 
			
		||||
    assert_empty(warning)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_systemcallerror_eq
 | 
			
		||||
    e = SystemCallError.new(0)
 | 
			
		||||
    assert((SimpleDelegator.new(e) == e) == (e == SimpleDelegator.new(e)), "[ruby-dev:34808]")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue