Remove Refinement#include and Refinement#prepend

This commit is contained in:
Nobuyoshi Nakada 2021-12-26 23:17:14 +09:00
parent 39bc5de833
commit 69f03c864e
No known key found for this signature in database
GPG Key ID: 7CD2805BFA3770C6
Notes: git 2021-12-27 00:34:23 +09:00
3 changed files with 38 additions and 161 deletions

4
eval.c
View File

@ -1129,7 +1129,7 @@ rb_mod_include(int argc, VALUE *argv, VALUE module)
CONST_ID(id_included, "included"); CONST_ID(id_included, "included");
if (FL_TEST(module, RMODULE_IS_REFINEMENT)) { if (FL_TEST(module, RMODULE_IS_REFINEMENT)) {
rb_warn_deprecated_to_remove_at(3.2, "Refinement#include", NULL); rb_raise(rb_eTypeError, "Refinement#include has been removed");
} }
rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS); rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
@ -1179,7 +1179,7 @@ rb_mod_prepend(int argc, VALUE *argv, VALUE module)
ID id_prepend_features, id_prepended; ID id_prepend_features, id_prepended;
if (FL_TEST(module, RMODULE_IS_REFINEMENT)) { if (FL_TEST(module, RMODULE_IS_REFINEMENT)) {
rb_warn_deprecated_to_remove_at(3.2, "Refinement#prepend", NULL); rb_raise(rb_eTypeError, "Refinement#prepend has been removed");
} }
CONST_ID(id_prepend_features, "prepend_features"); CONST_ID(id_prepend_features, "prepend_features");

View File

@ -243,28 +243,30 @@ describe "Module#refine" do
result.should == "foo from singleton class" result.should == "foo from singleton class"
end end
it "looks in the included modules for builtin methods" do ruby_version_is ""..."3.2" do
result = ruby_exe(<<-RUBY) it "looks in the included modules for builtin methods" do
a = Module.new do result = ruby_exe(<<-RUBY)
def /(other) quo(other) end a = Module.new do
end def /(other) quo(other) end
refinement = Module.new do
refine Integer do
include a
end end
end
result = nil refinement = Module.new do
Module.new do refine Integer do
using refinement include a
result = 1 / 2 end
end end
print result.class result = nil
RUBY Module.new do
using refinement
result = 1 / 2
end
result.should == 'Rational' print result.class
RUBY
result.should == 'Rational'
end
end end
it "looks in later included modules of the refined module first" do it "looks in later included modules of the refined module first" do

View File

@ -754,134 +754,30 @@ class TestRefinement < Test::Unit::TestCase
$VERBOSE = verbose $VERBOSE = verbose
end end
module IncludeIntoRefinement
class C
def bar
return "C#bar"
end
def baz
return "C#baz"
end
end
module Mixin
def foo
return "Mixin#foo"
end
def bar
return super << " Mixin#bar"
end
def baz
return super << " Mixin#baz"
end
end
module M
refine C do
TestRefinement.suppress_verbose do
include Mixin
end
def baz
return super << " M#baz"
end
end
end
end
eval <<-EOF, Sandbox::BINDING
using TestRefinement::IncludeIntoRefinement::M
module TestRefinement::IncludeIntoRefinement::User
def self.invoke_foo_on(x)
x.foo
end
def self.invoke_bar_on(x)
x.bar
end
def self.invoke_baz_on(x)
x.baz
end
end
EOF
def test_include_into_refinement def test_include_into_refinement
x = IncludeIntoRefinement::C.new assert_raise(TypeError) do
assert_equal("Mixin#foo", IncludeIntoRefinement::User.invoke_foo_on(x)) c = Class.new
assert_equal("C#bar Mixin#bar", mixin = Module.new
IncludeIntoRefinement::User.invoke_bar_on(x))
assert_equal("C#baz Mixin#baz M#baz",
IncludeIntoRefinement::User.invoke_baz_on(x))
end
module PrependIntoRefinement Module.new do
class C refine c do
def bar include mixin
return "C#bar"
end
def baz
return "C#baz"
end
end
module Mixin
def foo
return "Mixin#foo"
end
def bar
return super << " Mixin#bar"
end
def baz
return super << " Mixin#baz"
end
end
module M
refine C do
TestRefinement.suppress_verbose do
prepend Mixin
end
def baz
return super << " M#baz"
end end
end end
end end
end end
eval <<-EOF, Sandbox::BINDING
using TestRefinement::PrependIntoRefinement::M
module TestRefinement::PrependIntoRefinement::User
def self.invoke_foo_on(x)
x.foo
end
def self.invoke_bar_on(x)
x.bar
end
def self.invoke_baz_on(x)
x.baz
end
end
EOF
def test_prepend_into_refinement def test_prepend_into_refinement
x = PrependIntoRefinement::C.new assert_raise(TypeError) do
assert_equal("Mixin#foo", PrependIntoRefinement::User.invoke_foo_on(x)) c = Class.new
assert_equal("C#bar Mixin#bar", mixin = Module.new
PrependIntoRefinement::User.invoke_bar_on(x))
assert_equal("C#baz M#baz Mixin#baz", Module.new do
PrependIntoRefinement::User.invoke_baz_on(x)) refine c do
prepend mixin
end
end
end
end end
PrependAfterRefine_CODE = <<-EOC PrependAfterRefine_CODE = <<-EOC
@ -2626,18 +2522,6 @@ class TestRefinement < Test::Unit::TestCase
end end
end end
module D
refine A do
TestRefinement.suppress_verbose do
include B
end
def foo
"refined"
end
end
end
module UsingC module UsingC
using C using C
@ -2645,19 +2529,10 @@ class TestRefinement < Test::Unit::TestCase
A.new.bar A.new.bar
end end
end end
module UsingD
using D
def self.call_bar
A.new.bar
end
end
end end
def test_import_methods def test_import_methods
assert_equal("refined:bar", TestImport::UsingC.call_bar) assert_equal("refined:bar", TestImport::UsingC.call_bar)
assert_equal("original:bar", TestImport::UsingD.call_bar)
assert_raise(ArgumentError) do assert_raise(ArgumentError) do
Module.new do Module.new do