Skip to content

Commit 86bbbe8

Browse files
committed
updates continued
1 parent 39e6a65 commit 86bbbe8

2 files changed

Lines changed: 152 additions & 25 deletions

File tree

core/module.rbs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ class Module
284284
# module to *mod* if this module has not already been added to *mod* or one of
285285
# its ancestors. See also Module#include.
286286
#
287-
private def append_features: (Module arg0) -> self
287+
private def append_features: (Module mod) -> self
288288

289289
# <!--
290290
# rdoc-file=object.c
@@ -348,7 +348,7 @@ class Module
348348
#
349349
# Files that are currently being loaded must not be registered for autoload.
350350
#
351-
def autoload: (interned _module, String filename) -> NilClass
351+
def autoload: (interned constant, String filename) -> NilClass
352352

353353
# <!--
354354
# rdoc-file=load.c
@@ -531,7 +531,7 @@ class Module
531531
# :const_added
532532
# :inherited
533533
#
534-
private def const_added: (Symbol) -> void
534+
private def const_added: (Symbol const_name) -> void
535535

536536
# <!--
537537
# rdoc-file=object.c
@@ -825,7 +825,7 @@ class Module
825825
# Picky added to Array
826826
# Can't add Picky to a String
827827
#
828-
private def extend_object: (untyped arg0) -> untyped
828+
private def extend_object: [T] (T object) -> T
829829

830830
# <!--
831831
# rdoc-file=object.c
@@ -843,7 +843,7 @@ class Module
843843
# end
844844
# # => prints "A extended in Enumerable"
845845
#
846-
private def extended: (Module othermod) -> untyped
846+
private def extended: (untyped othermod) -> void
847847

848848
# <!--
849849
# rdoc-file=object.c
@@ -901,7 +901,7 @@ class Module
901901
# end
902902
# # => prints "A included in Enumerable"
903903
#
904-
private def included: (Module othermod) -> untyped
904+
private def included: (Module othermod) -> void
905905

906906
# <!--
907907
# rdoc-file=object.c
@@ -1041,7 +1041,7 @@ class Module
10411041
#
10421042
# Adding :some_instance_method
10431043
#
1044-
private def method_added: (Symbol meth) -> untyped
1044+
private def method_added: (Symbol method_name) -> void
10451045

10461046
# <!--
10471047
# rdoc-file=vm_method.c
@@ -1102,7 +1102,7 @@ class Module
11021102
#
11031103
# Removing :some_instance_method
11041104
#
1105-
private def method_removed: (Symbol method_name) -> untyped
1105+
private def method_removed: (Symbol method_name) -> void
11061106

11071107
# <!--
11081108
# rdoc-file=object.c
@@ -1127,7 +1127,7 @@ class Module
11271127
#
11281128
# Undefining :some_instance_method
11291129
#
1130-
private def method_undefined: (Symbol method_name) -> untyped
1130+
private def method_undefined: (Symbol method_name) -> void
11311131

11321132
# <!--
11331133
# rdoc-file=vm_eval.c
@@ -1254,7 +1254,7 @@ class Module
12541254
# this module to *mod* if this module has not already been added to *mod* or one
12551255
# of its ancestors. See also Module#prepend.
12561256
#
1257-
private def prepend_features: (Module arg0) -> self
1257+
private def prepend_features: (Module mod) -> self
12581258

12591259
# <!--
12601260
# rdoc-file=object.c
@@ -1272,7 +1272,7 @@ class Module
12721272
# end
12731273
# # => prints "A prepended to Enumerable"
12741274
#
1275-
private def prepended: (Module othermod) -> untyped
1275+
private def prepended: (Module othermod) -> void
12761276

12771277
# <!--
12781278
# rdoc-file=vm_method.c
@@ -1648,7 +1648,7 @@ class Module
16481648
# previous value. If that constant referred to a module, this will not change
16491649
# that module's name and can lead to confusion.
16501650
#
1651-
private def remove_const: (interned arg0) -> untyped
1651+
private def remove_const: (interned name) -> untyped
16521652

16531653
# <!--
16541654
# rdoc-file=vm_method.c
@@ -1828,7 +1828,7 @@ class Module
18281828
# Import class refinements from *module* into the current class or module
18291829
# definition.
18301830
#
1831-
private def using: (Module arg0) -> self
1831+
private def using: (Module mod) -> self
18321832

18331833
# <!-- rdoc-file=object.c -->
18341834
# Returns a string representing this module or class. For basic classes and

test/stdlib/Module_test.rb

Lines changed: 139 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@ module RefinedModule
5555
end
5656
end
5757

58+
def with_untyped_singleton_possible
59+
with_untyped do |untyped|
60+
next if Integer === untyped || Float === untyped || Symbol === untyped
61+
untyped = ::Kernel.instance_method(:dup).bind_call(untyped) if ::Kernel.instance_method(:frozen?).bind_call(untyped)
62+
yield untyped
63+
end
64+
end
65+
5866
def test_op_lt
5967
with Object, Float, Hash do |mod|
6068
assert_send_type '(Module) -> bool?',
@@ -1071,72 +1079,191 @@ def foo = 4
10711079
def test_append_features
10721080
assert_visibility :private,
10731081
Module.new, :append_features
1074-
omit 'todo'
1082+
1083+
assert_send_type '(Module) -> Module',
1084+
Module.new, :append_features, Module.new
10751085
end
10761086

10771087
def test_const_added
10781088
assert_visibility :private,
10791089
Module.new, :const_added
1080-
omit 'todo'
1090+
1091+
# const_added directly works
1092+
assert_send_type '(Symbol) -> void',
1093+
Module.new, :const_added, :foo
1094+
1095+
# Setting the constant also works
1096+
const_added_module = proc do
1097+
assert_type_meth = method(:assert_type)
1098+
mod = Module.new do
1099+
define_singleton_method :const_added do |name|
1100+
assert_type_meth.call('Symbol', name)
1101+
end
1102+
end
1103+
end
1104+
1105+
# Make sure the `::` assignment passes a symbol
1106+
eval <<~EOS
1107+
const_added_module.call()::Foo = 3
1108+
EOS
1109+
1110+
# Make sure that `const_set` also always passes a symbol to the `const_added`
1111+
with_interned :Foo do |name|
1112+
const_added_module.call().const_set(name, 2r)
1113+
end
10811114
end
10821115

10831116
def test_extend_object
10841117
assert_visibility :private,
10851118
Module.new, :extend_object
1086-
omit 'todo'
1119+
1120+
with_untyped_singleton_possible do |untyped|
1121+
assert_send_type '[T] (T) -> T',
1122+
Module.new, :extend_object, untyped
1123+
end
1124+
1125+
# No need to make sure `object.extend(module)` works because the signature
1126+
# is `(T) -> T`, which means it can take any type (and we aren't testing the
1127+
# return value of `extend`)
10871128
end
10881129

10891130
def test_extended
10901131
assert_visibility :private,
10911132
Module.new, :extended
1092-
omit 'todo'
1133+
1134+
with_untyped_singleton_possible do |untyped|
1135+
assert_send_type '(untyped) -> void',
1136+
Module.new, :extended, untyped
1137+
end
1138+
1139+
# No need to make sure `object.extend(module)` works because the signature
1140+
# is `(untyped) -> void`, which means it can take any type, and we dont care
1141+
# about the return value.
10931142
end
10941143

10951144
def test_included
10961145
assert_visibility :private,
10971146
Module.new, :included
1098-
omit 'todo'
1147+
1148+
assert_send_type '(Module) -> void',
1149+
Module.new, :included, Module.new
1150+
1151+
assert_send_type '(Module) -> void',
1152+
Module.new, :included, Class.new
10991153
end
11001154

11011155
def test_method_added
11021156
assert_visibility :private,
11031157
Module.new, :method_added
1104-
omit 'todo'
1158+
1159+
1160+
# method_added directly works
1161+
assert_send_type '(Symbol) -> void',
1162+
Module.new, :method_added, :foo
1163+
1164+
# make sure using `with_intern` always passes a symbol
1165+
assert_type_meth = method(:assert_type)
1166+
mod = Module.new do
1167+
define_singleton_method :method_added do |name|
1168+
assert_type_meth.call('Symbol', name)
1169+
end
1170+
end
1171+
1172+
with_interned :foo do |name|
1173+
mod.define_method(:foo) {}
1174+
mod.undef_method(:foo) # avoid warnings
1175+
end
11051176
end
11061177

11071178
def test_method_removed
11081179
assert_visibility :private,
11091180
Module.new, :method_removed
1110-
omit 'todo'
1181+
1182+
# method_removed directly works
1183+
assert_send_type '(Symbol) -> void',
1184+
Module.new, :method_removed, :foo
1185+
1186+
# make sure using `with_intern` always passes a symbol
1187+
assert_type_meth = method(:assert_type)
1188+
mod = Module.new do
1189+
define_singleton_method :method_removed do |name|
1190+
assert_type_meth.call('Symbol', name)
1191+
end
1192+
end
1193+
1194+
with_interned :foo do |name|
1195+
mod.define_method(:foo) {}
1196+
mod.remove_method(name)
1197+
end
11111198
end
11121199

11131200
def test_method_undefined
11141201
assert_visibility :private,
11151202
Module.new, :method_undefined
1116-
omit 'todo'
1203+
1204+
# method_undefined directly works
1205+
assert_send_type '(Symbol) -> void',
1206+
Module.new, :method_undefined, :foo
1207+
1208+
# make sure using `with_intern` always passes a symbol
1209+
assert_type_meth = method(:assert_type)
1210+
mod = Module.new do
1211+
define_singleton_method :method_undefined do |name|
1212+
assert_type_meth.call('Symbol', name)
1213+
end
1214+
end
1215+
1216+
with_interned :foo do |name|
1217+
mod.define_method(:foo) {}
1218+
mod.undef_method(name)
1219+
end
11171220
end
11181221

11191222
def test_prepend_features
11201223
assert_visibility :private,
11211224
Module.new, :prepend_features
1122-
omit 'todo'
1225+
1226+
assert_send_type '(Module) -> Module',
1227+
Module.new, :prepend_features, Module.new
1228+
1229+
assert_send_type '(Module) -> Module',
1230+
Module.new, :prepend_features, Class.new
11231231
end
11241232

11251233
def test_prepended
11261234
assert_visibility :private,
11271235
Module.new, :prepended
1128-
omit 'todo'
1236+
1237+
assert_send_type '(Module) -> void',
1238+
Module.new, :prepended, Module.new
1239+
1240+
assert_send_type '(Module) -> void',
1241+
Module.new, :prepended, Class.new
11291242
end
11301243

11311244
def test_remove_const
11321245
assert_visibility :private,
11331246
Module.new, :remove_const
1134-
omit 'todo'
1247+
1248+
with_interned :Foo do |name|
1249+
mod = Module.new
1250+
mod.const_set :Foo, 1r
1251+
1252+
assert_send_type '(interned) -> untyped',
1253+
mod, :remove_const, name
1254+
end
1255+
end
1256+
1257+
1258+
module UsingModule
1259+
UsingReturnValue = using Module.new
11351260
end
11361261

11371262
def test_using
11381263
assert_visibility :private,
11391264
Module.new, :using
1140-
omit 'todo'
1265+
1266+
# Cant actually test `using` in modules, so this is the best we got
1267+
assert_type 'Module', UsingModule::UsingModule
11411268
end
11421269
end

0 commit comments

Comments
 (0)