@@ -125,18 +125,195 @@ def foo; end
125125 assert_empty result . declarations
126126 end
127127
128- def test_error__def__singleton
128+ def test_parse__def__singleton
129129 result = parse ( <<~RUBY )
130130 module Foo
131131 def self.foo; end
132132 end
133133 RUBY
134134
135+ assert_empty result . diagnostics
136+
137+ result . declarations [ 0 ] . tap do |decl |
138+ decl . members [ 0 ] . tap do |member |
139+ assert_instance_of RBS ::AST ::Ruby ::Members ::DefMember , member
140+ assert_equal :foo , member . name
141+ assert_predicate member , :singleton?
142+ refute_predicate member , :instance?
143+ assert_equal :singleton , member . kind
144+ end
145+ end
146+ end
147+
148+ def test_parse__def__singleton__colon_type
149+ result = parse ( <<~RUBY )
150+ class Foo
151+ #: () -> void
152+ def self.hello
153+ end
154+ end
155+ RUBY
156+
157+ assert_empty result . diagnostics
158+
159+ result . declarations [ 0 ] . tap do |decl |
160+ decl . members [ 0 ] . tap do |member |
161+ assert_instance_of RBS ::AST ::Ruby ::Members ::DefMember , member
162+ assert_equal :hello , member . name
163+ assert_predicate member , :singleton?
164+ assert_equal [ "() -> void" ] , member . overloads . map { _1 . method_type . to_s }
165+ end
166+ end
167+ end
168+
169+ def test_parse__def__singleton__rbs_annotation
170+ result = parse ( <<~RUBY )
171+ class Foo
172+ # @rbs () -> void
173+ def self.hello
174+ end
175+ end
176+ RUBY
177+
178+ assert_empty result . diagnostics
179+
180+ result . declarations [ 0 ] . tap do |decl |
181+ decl . members [ 0 ] . tap do |member |
182+ assert_instance_of RBS ::AST ::Ruby ::Members ::DefMember , member
183+ assert_equal :hello , member . name
184+ assert_predicate member , :singleton?
185+ assert_equal [ "() -> void" ] , member . overloads . map { _1 . method_type . to_s }
186+ end
187+ end
188+ end
189+
190+ def test_parse__def__singleton__with_params
191+ result = parse ( <<~RUBY )
192+ class Foo
193+ # @rbs n: Integer
194+ # @rbs return: Integer
195+ def self.double(n)
196+ n * 2
197+ end
198+ end
199+ RUBY
200+
201+ assert_empty result . diagnostics
202+
203+ result . declarations [ 0 ] . tap do |decl |
204+ decl . members [ 0 ] . tap do |member |
205+ assert_instance_of RBS ::AST ::Ruby ::Members ::DefMember , member
206+ assert_equal :double , member . name
207+ assert_predicate member , :singleton?
208+ assert_equal [ "(Integer n) -> Integer" ] , member . overloads . map { _1 . method_type . to_s }
209+ end
210+ end
211+ end
212+
213+ def test_parse__def__singleton__mixed_with_instance
214+ result = parse ( <<~RUBY )
215+ class Foo
216+ #: () -> void
217+ def self.class_method
218+ end
219+
220+ #: () -> String
221+ def instance_method
222+ ""
223+ end
224+ end
225+ RUBY
226+
227+ assert_empty result . diagnostics
228+
229+ result . declarations [ 0 ] . tap do |decl |
230+ assert_equal 2 , decl . members . size
231+
232+ decl . members [ 0 ] . tap do |member |
233+ assert_instance_of RBS ::AST ::Ruby ::Members ::DefMember , member
234+ assert_equal :class_method , member . name
235+ assert_predicate member , :singleton?
236+ assert_equal [ "() -> void" ] , member . overloads . map { _1 . method_type . to_s }
237+ end
238+
239+ decl . members [ 1 ] . tap do |member |
240+ assert_instance_of RBS ::AST ::Ruby ::Members ::DefMember , member
241+ assert_equal :instance_method , member . name
242+ assert_predicate member , :instance?
243+ assert_equal [ "() -> String" ] , member . overloads . map { _1 . method_type . to_s }
244+ end
245+ end
246+ end
247+
248+ def test_parse__def__singleton__skip
249+ result = parse ( <<~RUBY )
250+ class Foo
251+ # @rbs skip
252+ def self.skipped_method
253+ end
254+ end
255+ RUBY
256+
257+ assert_empty result . diagnostics
258+
259+ result . declarations [ 0 ] . tap do |decl |
260+ assert_empty decl . members
261+ end
262+ end
263+
264+ def test_error__def__singleton__non_self_receiver
265+ result = parse ( <<~RUBY )
266+ module Foo
267+ def other_obj.foo; end
268+ end
269+ RUBY
270+
135271 assert_equal 1 , result . diagnostics . size
136272 assert_any! ( result . diagnostics ) do |diagnostic |
137273 assert_instance_of RBS ::InlineParser ::Diagnostic ::NotImplementedYet , diagnostic
138- assert_equal "self" , diagnostic . location . source
139- assert_equal "Singleton method definition is not supported yet" , diagnostic . message
274+ assert_equal "other_obj" , diagnostic . location . source
275+ assert_equal "Method definition with non-self receiver is not supported" , diagnostic . message
276+ end
277+ end
278+
279+ def test_parse__def__singleton__in_module
280+ result = parse ( <<~RUBY )
281+ module Foo
282+ #: () -> void
283+ def self.module_method
284+ end
285+ end
286+ RUBY
287+
288+ assert_empty result . diagnostics
289+
290+ result . declarations [ 0 ] . tap do |decl |
291+ decl . members [ 0 ] . tap do |member |
292+ assert_instance_of RBS ::AST ::Ruby ::Members ::DefMember , member
293+ assert_equal :module_method , member . name
294+ assert_predicate member , :singleton?
295+ assert_equal [ "() -> void" ] , member . overloads . map { _1 . method_type . to_s }
296+ end
297+ end
298+ end
299+
300+ def test_parse__def__instance_method_kind
301+ result = parse ( <<~RUBY )
302+ class Foo
303+ def instance_method; end
304+ end
305+ RUBY
306+
307+ assert_empty result . diagnostics
308+
309+ result . declarations [ 0 ] . tap do |decl |
310+ decl . members [ 0 ] . tap do |member |
311+ assert_instance_of RBS ::AST ::Ruby ::Members ::DefMember , member
312+ assert_equal :instance_method , member . name
313+ assert_predicate member , :instance?
314+ refute_predicate member , :singleton?
315+ assert_equal :instance , member . kind
316+ end
140317 end
141318 end
142319
0 commit comments