Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 8 additions & 17 deletions lib/rbs/prototype/runtime/value_object_generator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,6 @@ def self.generatable?(target)

private

CAN_CALL_KEYWORD_INIT_P = Struct.new(:tmp).respond_to?(:keyword_init?)

def build_super_class
AST::Declarations::Class::Super.new(name: TypeName.parse("::Struct"), args: [untyped], location: nil)
end
Expand All @@ -118,21 +116,16 @@ def build_s_new
[:new, :[]].map do |name|
new_overloads = [] #: Array[AST::Members::MethodDefinition::Overload]

if CAN_CALL_KEYWORD_INIT_P
case @target_class.keyword_init?
when false
new_overloads << build_overload_for_positional_arguments
when true
new_overloads << build_overload_for_keyword_arguments
when nil
new_overloads << build_overload_for_positional_arguments
new_overloads << build_overload_for_keyword_arguments
else
raise
end
else
case @target_class.keyword_init?
when false
new_overloads << build_overload_for_positional_arguments
when true
new_overloads << build_overload_for_keyword_arguments
when nil
new_overloads << build_overload_for_positional_arguments
new_overloads << build_overload_for_keyword_arguments
else
raise
end

AST::Members::MethodDefinition.new(
Expand Down Expand Up @@ -178,8 +171,6 @@ def build_overload_for_keyword_arguments

# def self.keyword_init?: () -> bool?
def build_s_keyword_init_p
return [] unless CAN_CALL_KEYWORD_INIT_P

return_type = @target_class.keyword_init?.nil? \
? Types::Bases::Nil.new(location: nil)
: Types::Literal.new(literal: @target_class.keyword_init?, location: nil)
Expand Down
2 changes: 0 additions & 2 deletions sig/prototype/runtime.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,6 @@ module RBS
def build_s_new: () -> Array[AST::Members::MethodDefinition]

def build_super_class: () -> AST::Declarations::Class::Super

CAN_CALL_KEYWORD_INIT_P: bool
end

class DataGenerator < ValueObjectBase
Expand Down
252 changes: 88 additions & 164 deletions test/rbs/runtime_prototype_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -690,151 +690,77 @@ def test_struct
SignatureManager.new do |manager|
manager.build do |env|
p = Runtime.new(patterns: ["RBS::RuntimePrototypeTest::StructInheritWithNil"], env: env, merge: false)
if Runtime::StructGenerator::CAN_CALL_KEYWORD_INIT_P
assert_write p.decls, <<~RBS
module RBS
class RuntimePrototypeTest < ::Test::Unit::TestCase
class StructInheritWithNil < ::Struct[untyped]
def self.new: (?untyped foo, ?untyped bar, ?untyped `baz?`) -> instance
| (?foo: untyped, ?bar: untyped, ?baz?: untyped) -> instance

def self.[]: (?untyped foo, ?untyped bar, ?untyped `baz?`) -> instance
| (?foo: untyped, ?bar: untyped, ?baz?: untyped) -> instance

def self.keyword_init?: () -> nil

def self.members: () -> [ :foo, :bar, :baz? ]

def members: () -> [ :foo, :bar, :baz? ]

attr_accessor foo: untyped

attr_accessor bar: untyped
assert_write p.decls, <<~RBS
module RBS
class RuntimePrototypeTest < ::Test::Unit::TestCase
class StructInheritWithNil < ::Struct[untyped]
def self.new: (?untyped foo, ?untyped bar, ?untyped `baz?`) -> instance
| (?foo: untyped, ?bar: untyped, ?baz?: untyped) -> instance

attr_accessor baz?: untyped
end
end
end
RBS
else
assert_write p.decls, <<~RBS
module RBS
class RuntimePrototypeTest < ::Test::Unit::TestCase
class StructInheritWithNil < ::Struct[untyped]
def self.new: (?untyped foo, ?untyped bar, ?untyped `baz?`) -> instance
| (?foo: untyped, ?bar: untyped, ?baz?: untyped) -> instance
def self.[]: (?untyped foo, ?untyped bar, ?untyped `baz?`) -> instance
| (?foo: untyped, ?bar: untyped, ?baz?: untyped) -> instance

def self.[]: (?untyped foo, ?untyped bar, ?untyped `baz?`) -> instance
| (?foo: untyped, ?bar: untyped, ?baz?: untyped) -> instance
def self.keyword_init?: () -> nil

def self.members: () -> [ :foo, :bar, :baz? ]
def self.members: () -> [ :foo, :bar, :baz? ]

def members: () -> [ :foo, :bar, :baz? ]
def members: () -> [ :foo, :bar, :baz? ]

attr_accessor foo: untyped
attr_accessor foo: untyped

attr_accessor bar: untyped
attr_accessor bar: untyped

attr_accessor baz?: untyped
end
attr_accessor baz?: untyped
end
end
RBS
end
end
RBS

p = Runtime.new(patterns: ["RBS::RuntimePrototypeTest::StructKeywordInitTrue"], env: env, merge: false)
if Runtime::StructGenerator::CAN_CALL_KEYWORD_INIT_P
assert_write p.decls, <<~RBS
module RBS
class RuntimePrototypeTest < ::Test::Unit::TestCase
class StructKeywordInitTrue < ::Struct[untyped]
def self.new: (?foo: untyped, ?bar: untyped) -> instance

def self.[]: (?foo: untyped, ?bar: untyped) -> instance

def self.keyword_init?: () -> true

def self.members: () -> [ :foo, :bar ]

def members: () -> [ :foo, :bar ]

attr_accessor foo: untyped
assert_write p.decls, <<~RBS
module RBS
class RuntimePrototypeTest < ::Test::Unit::TestCase
class StructKeywordInitTrue < ::Struct[untyped]
def self.new: (?foo: untyped, ?bar: untyped) -> instance

attr_accessor bar: untyped
end
end
end
RBS
else
assert_write p.decls, <<~RBS
module RBS
class RuntimePrototypeTest < ::Test::Unit::TestCase
class StructKeywordInitTrue < ::Struct[untyped]
def self.new: (?untyped foo, ?untyped bar) -> instance
| (?foo: untyped, ?bar: untyped) -> instance
def self.[]: (?foo: untyped, ?bar: untyped) -> instance

def self.[]: (?untyped foo, ?untyped bar) -> instance
| (?foo: untyped, ?bar: untyped) -> instance
def self.keyword_init?: () -> true

def self.members: () -> [ :foo, :bar ]
def self.members: () -> [ :foo, :bar ]

def members: () -> [ :foo, :bar ]
def members: () -> [ :foo, :bar ]

attr_accessor foo: untyped
attr_accessor foo: untyped

attr_accessor bar: untyped
end
attr_accessor bar: untyped
end
end
RBS
end
end
RBS

p = Runtime.new(patterns: ["RBS::RuntimePrototypeTest::StructKeywordInitFalse"], env: env, merge: false)
if Runtime::StructGenerator::CAN_CALL_KEYWORD_INIT_P
assert_write p.decls, <<~RBS
module RBS
class RuntimePrototypeTest < ::Test::Unit::TestCase
class StructKeywordInitFalse < ::Struct[untyped]
def self.new: (?untyped foo, ?untyped bar) -> instance

def self.[]: (?untyped foo, ?untyped bar) -> instance

def self.keyword_init?: () -> false

def self.members: () -> [ :foo, :bar ]

def members: () -> [ :foo, :bar ]

attr_accessor foo: untyped
assert_write p.decls, <<~RBS
module RBS
class RuntimePrototypeTest < ::Test::Unit::TestCase
class StructKeywordInitFalse < ::Struct[untyped]
def self.new: (?untyped foo, ?untyped bar) -> instance

attr_accessor bar: untyped
end
end
end
RBS
else
assert_write p.decls, <<~RBS
module RBS
class RuntimePrototypeTest < ::Test::Unit::TestCase
class StructKeywordInitFalse < ::Struct[untyped]
def self.new: (?untyped foo, ?untyped bar) -> instance
| (?foo: untyped, ?bar: untyped) -> instance
def self.[]: (?untyped foo, ?untyped bar) -> instance

def self.[]: (?untyped foo, ?untyped bar) -> instance
| (?foo: untyped, ?bar: untyped) -> instance
def self.keyword_init?: () -> false

def self.members: () -> [ :foo, :bar ]
def self.members: () -> [ :foo, :bar ]

def members: () -> [ :foo, :bar ]
def members: () -> [ :foo, :bar ]

attr_accessor foo: untyped
attr_accessor foo: untyped

attr_accessor bar: untyped
end
attr_accessor bar: untyped
end
end
RBS
end
end
RBS

p = Runtime.new(patterns: ["RBS::RuntimePrototypeTest::StructDirectInherited"], env: env, merge: false)
assert_write p.decls, <<~RBS
Expand All @@ -849,74 +775,72 @@ class StructDirectInherited < ::Struct[untyped]
end
end

if RUBY_VERSION >= '3.2'
class DataInherit < Data.define(:foo, :bar, :baz?)
end
DataConst = Data.define(:foo, :bar)
class DataDirectInherit < Data
end
class DataInherit < Data.define(:foo, :bar, :baz?)
end
DataConst = Data.define(:foo, :bar)
class DataDirectInherit < Data
end

def test_data
SignatureManager.new do |manager|
manager.build do |env|
p = Runtime.new(patterns: ["RBS::RuntimePrototypeTest::DataInherit"], env: env, merge: false)
assert_write p.decls, <<~RBS
module RBS
class RuntimePrototypeTest < ::Test::Unit::TestCase
class DataInherit < ::Data
def self.new: (untyped foo, untyped bar, untyped `baz?`) -> instance
| (foo: untyped, bar: untyped, baz?: untyped) -> instance
def test_data
SignatureManager.new do |manager|
manager.build do |env|
p = Runtime.new(patterns: ["RBS::RuntimePrototypeTest::DataInherit"], env: env, merge: false)
assert_write p.decls, <<~RBS
module RBS
class RuntimePrototypeTest < ::Test::Unit::TestCase
class DataInherit < ::Data
def self.new: (untyped foo, untyped bar, untyped `baz?`) -> instance
| (foo: untyped, bar: untyped, baz?: untyped) -> instance

def self.[]: (untyped foo, untyped bar, untyped `baz?`) -> instance
| (foo: untyped, bar: untyped, baz?: untyped) -> instance
def self.[]: (untyped foo, untyped bar, untyped `baz?`) -> instance
| (foo: untyped, bar: untyped, baz?: untyped) -> instance

def self.members: () -> [ :foo, :bar, :baz? ]
def self.members: () -> [ :foo, :bar, :baz? ]

def members: () -> [ :foo, :bar, :baz? ]
def members: () -> [ :foo, :bar, :baz? ]

attr_reader foo: untyped
attr_reader foo: untyped

attr_reader bar: untyped
attr_reader bar: untyped

attr_reader baz?: untyped
end
attr_reader baz?: untyped
end
end
RBS
end
RBS

p = Runtime.new(patterns: ["RBS::RuntimePrototypeTest::DataConst"], env: env, merge: false)
assert_write p.decls, <<~RBS
module RBS
class RuntimePrototypeTest < ::Test::Unit::TestCase
class DataConst < ::Data
def self.new: (untyped foo, untyped bar) -> instance
| (foo: untyped, bar: untyped) -> instance
p = Runtime.new(patterns: ["RBS::RuntimePrototypeTest::DataConst"], env: env, merge: false)
assert_write p.decls, <<~RBS
module RBS
class RuntimePrototypeTest < ::Test::Unit::TestCase
class DataConst < ::Data
def self.new: (untyped foo, untyped bar) -> instance
| (foo: untyped, bar: untyped) -> instance

def self.[]: (untyped foo, untyped bar) -> instance
| (foo: untyped, bar: untyped) -> instance
def self.[]: (untyped foo, untyped bar) -> instance
| (foo: untyped, bar: untyped) -> instance

def self.members: () -> [ :foo, :bar ]
def self.members: () -> [ :foo, :bar ]

def members: () -> [ :foo, :bar ]
def members: () -> [ :foo, :bar ]

attr_reader foo: untyped
attr_reader foo: untyped

attr_reader bar: untyped
end
attr_reader bar: untyped
end
end
RBS
end
RBS

p = Runtime.new(patterns: ["RBS::RuntimePrototypeTest::DataDirectInherit"], env: env, merge: false)
assert_write p.decls, <<~RBS
module RBS
class RuntimePrototypeTest < ::Test::Unit::TestCase
class DataDirectInherit < ::Data
end
p = Runtime.new(patterns: ["RBS::RuntimePrototypeTest::DataDirectInherit"], env: env, merge: false)
assert_write p.decls, <<~RBS
module RBS
class RuntimePrototypeTest < ::Test::Unit::TestCase
class DataDirectInherit < ::Data
end
end
RBS
end
end
RBS
end
end
end
Expand Down
2 changes: 0 additions & 2 deletions test/rbs/test/runtime_test_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
require "rbs/test"
require "logger"

return unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.7.0')

class RBS::Test::RuntimeTestTest < Test::Unit::TestCase
omit_on_truffle_ruby! "`rbs test` relies on `TracePoint` `:end` event, which is not supported on TruffleRuby"
omit_on_jruby! "`rbs test` relies on `TracePoint` `:end` event, which is not supported on JRuby"
Expand Down
Loading
Loading