Skip to content

Commit 7b3cb0e

Browse files
authored
Merge pull request #13 from ruby/anonymous_class_doc
Fix anonymous class doc_namespace to use named superclass
2 parents fcfd6b9 + 2adea58 commit 7b3cb0e

3 files changed

Lines changed: 39 additions & 11 deletions

File tree

lib/repl_type_completor/result.rb

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -139,29 +139,37 @@ def method_doc(type, name)
139139
type = type.types.find { _1.all_methods.include? name.to_sym }
140140
case type
141141
when Types::SingletonType
142-
"#{Types.class_name_of(type.module_or_class)}.#{name}"
142+
"#{doc_class_module_name(type.module_or_class)}.#{name}"
143143
when Types::InstanceType
144-
"#{Types.class_name_of(type.klass)}##{name}"
144+
"#{doc_class_module_name(type.klass)}##{name}"
145145
end
146146
end
147147

148148
def call_or_const_doc(type, name)
149149
if name =~ /\A[A-Z]/
150150
type = type.types.grep(Types::SingletonType).find { _1.module_or_class.const_defined?(name) }
151-
type.module_or_class == Object ? name : "#{Types.class_name_of(type.module_or_class)}::#{name}" if type
151+
type.module_or_class == Object ? name : "#{doc_class_module_name(type.module_or_class)}::#{name}" if type
152152
else
153153
method_doc(type, name)
154154
end
155155
end
156156

157+
def doc_class_module_name(module_or_class)
158+
if Class === module_or_class
159+
Types.class_name_of(module_or_class)
160+
else
161+
Methods::MODULE_NAME_METHOD.bind_call(module_or_class) || 'Module'
162+
end
163+
end
164+
157165
def value_doc(type)
158166
return unless type
159167
type.types.each do |t|
160168
case t
161169
when Types::SingletonType
162-
return Types.class_name_of(t.module_or_class)
170+
return doc_class_module_name(t.module_or_class)
163171
when Types::InstanceType
164-
return Types.class_name_of(t.klass)
172+
return doc_class_module_name(t.klass)
165173
end
166174
end
167175
nil

lib/repl_type_completor/types.rb

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,12 @@ def self.load_rbs_builder
5353
end
5454

5555
def self.class_name_of(klass)
56-
klass = klass.superclass if klass.singleton_class?
57-
Methods::MODULE_NAME_METHOD.bind_call klass
56+
while true
57+
name = Methods::MODULE_NAME_METHOD.bind_call klass
58+
return name if name
59+
60+
klass = klass.superclass
61+
end
5862
end
5963

6064
if RBS::TypeName.respond_to?(:parse) # RBS >= 3.8.0
@@ -69,9 +73,11 @@ def self.rbs_absolute_type_name(name)
6973
end
7074

7175
def self.rbs_search_method(klass, method_name, singleton)
76+
return unless rbs_builder
77+
7278
klass.ancestors.each do |ancestor|
73-
name = class_name_of ancestor
74-
next unless name && rbs_builder
79+
next unless (name = Methods::MODULE_NAME_METHOD.bind_call(ancestor))
80+
7581
type_name = rbs_absolute_type_name(name)
7682
definition = (singleton ? rbs_builder.build_singleton(type_name) : rbs_builder.build_instance(type_name)) rescue nil
7783
method = definition.methods[method_name] if definition
@@ -219,9 +225,9 @@ def types() = [self]
219225
def nillable?() = (@klass == NilClass)
220226
def nonnillable() = self
221227
def rbs_methods
222-
name = Types.class_name_of(@klass)
223-
return {} unless name && Types.rbs_builder
228+
return {} unless Types.rbs_builder
224229

230+
name = Types.class_name_of(@klass)
225231
type_name = Types.rbs_absolute_type_name(name)
226232
Types.rbs_builder.build_instance(type_name).methods rescue {}
227233
end

test/repl_type_completor/test_repl_type_completor.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,20 @@ def bo.foo; end
183183
end
184184
end
185185

186+
def test_anonymous_class
187+
bind = eval('c = Struct.new(:foobar); o = c.new; binding')
188+
assert_completion('c.', binding: bind, include: ['ancestors', 'singleton_class?', 'superclass'])
189+
assert_completion('o.', binding: bind, include: ['foobar', 'each_pair'])
190+
assert_doc_namespace('c.superclass', 'Struct.superclass', binding: bind)
191+
assert_doc_namespace('o.each', 'Struct#each', binding: bind)
192+
end
193+
194+
def test_anonymous_module
195+
bind = eval('m = Module.new; binding')
196+
assert_completion('m.', binding: bind, include: ['ancestors', 'singleton_class?'], exclude: 'superclass')
197+
assert_doc_namespace('m.ancestors', 'Module.ancestors', binding: bind)
198+
end
199+
186200
DEPRECATED_CONST = 1
187201
deprecate_constant :DEPRECATED_CONST
188202
def test_deprecated_const_without_warning

0 commit comments

Comments
 (0)