lib/tapioca/helpers/rbi_helper.rb in tapioca-0.16.3 vs lib/tapioca/helpers/rbi_helper.rb in tapioca-0.16.4

- old
+ new

@@ -105,38 +105,14 @@ end end sig { params(name: String).returns(T::Boolean) } def valid_method_name?(name) - # try to parse a method definition with this name - iseq = RubyVM::InstructionSequence.compile("def #{name}; end", nil, nil, 0, false) - # pull out the first operation in the instruction sequence and its first argument - op, arg, _data = iseq.to_a.dig(-1, 0) - # make sure that the operation is a method definition and the method that was - # defined has the expected name, for example, for `def !foo; end` we don't get - # a syntax error but instead get a method defined as `"foo"` - op == :definemethod && arg == name.to_sym - rescue SyntaxError - false + Prism.parse_success?("def self.#{name}(a); end") end sig { params(name: String).returns(T::Boolean) } def valid_parameter_name?(name) - sentinel_method_name = :sentinel_method_name - # try to parse a method definition with this name as the name of a - # keyword parameter. If we use a positional parameter, then parameter names - # like `&` (and maybe others) will be treated like `def foo(&); end` and will - # thus be considered valid. Using a required keyword parameter prevents that - # confusion between Ruby syntax and parameter name. - iseq = RubyVM::InstructionSequence.compile("def #{sentinel_method_name}(#{name}:); end", nil, nil, 0, false) - # pull out the first operation in the instruction sequence and its first argument and data - op, arg, data = iseq.to_a.dig(-1, 0) - # make sure that: - # 1. a method was defined, and - # 2. the method has the expected method name, and - # 3. the method has a keyword parameter with the expected name - op == :definemethod && arg == sentinel_method_name && data.dig(11, :keyword, 0) == name.to_sym - rescue SyntaxError - false + Prism.parse_success?("def sentinel_method_name(#{name}:); end") end end end