Skip to content

How to ensure valid RBS for include Enumerable? #148

Description

@thomthom

Given a class that implement Enumerable:

class Something

  include Enumerable

  # @yield [key, value]
  # @yieldparam [Integer] key
  # @yieldparam [String] value
  # @return void
  def each
    yield 123
  end

end

The generated output is:

class Something
  include Enumerable

  # _@return_ — void
  def each: () ?{ (Integer key, String value) -> void } -> untyped
end

If I then run steep check on this I get errors:

# Type checking files:

............................................F..............F.......

src/enum.rb:1:0: [error] UnexpectedError: sig/example.rbs:1:0...6:3: ::Enumerable expects parameters [Elem], but given args []
│ Diagnostic ID: Ruby::UnexpectedError
│
└ class Something
  ~~~~~~~~~~~~~~~

sig/example.rbs:1:0: [error] Type `::Enumerable` is generic but used as a non generic type
│ Diagnostic ID: RBS::InvalidTypeApplication
│
└ class Something
  ~~~~~~~~~~~~~~~

Detected 2 problems from 2 files

If I alter the RBS to include a param for the Enumerable:

class Something
  include Enumerable[untyped]

  # _@return_ — void
  def each: () ?{ (Integer key, String value) -> void } -> untyped
end

Then it passes:

C:\Users\Thomas\SourceTree\sord-test>steep check
# Type checking files:

...................................................................

No type error detected. 🍵

I'm not actually 100% sure what param to give Enumerable in the case of each yielding key and value params. hence the untyped in this case. But given that you have a collection object that return String objects, then I presume it should be include Enumerable[String]. (?)
Is there a way I can make sord generate an RBS that will not cause an error in steep?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions