Remove Refinement#include and Refinement#prepend
This commit is contained in:
parent
39bc5de833
commit
69f03c864e
Notes:
git
2021-12-27 00:34:23 +09:00
4
eval.c
4
eval.c
@ -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");
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user