From 39a39660a2c373ae2029631b0cc0b7f692ea6748 Mon Sep 17 00:00:00 2001 From: ksss Date: Thu, 24 Mar 2022 10:36:35 +0900 Subject: [PATCH 1/4] Use `literal_to_type` on CDECL instead of `node_type` --- lib/rbs/prototype/rb.rb | 2 +- test/rbs/rb_prototype_test.rb | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/rbs/prototype/rb.rb b/lib/rbs/prototype/rb.rb index 03d0470ac..61d8ba8ae 100644 --- a/lib/rbs/prototype/rb.rb +++ b/lib/rbs/prototype/rb.rb @@ -338,7 +338,7 @@ def process(node, decls:, comments:, context:) # Give up type prediction when node is MASGN. Types::Bases::Any.new(location: nil) else - node_type(value_node) + literal_to_type(value_node) end decls << AST::Declarations::Constant.new( name: const_name, diff --git a/test/rbs/rb_prototype_test.rb b/test/rbs/rb_prototype_test.rb index cce1bfee8..1ee7ef7ff 100644 --- a/test/rbs/rb_prototype_test.rb +++ b/test/rbs/rb_prototype_test.rb @@ -574,11 +574,11 @@ module Foo assert_write parser.decls, <<-EOF module Foo - VERSION: ::String + VERSION: "0.1.1" - FROZEN: ::String + FROZEN: untyped - ::Hello::World: ::Symbol + ::Hello::World: :foo end EOF end @@ -622,21 +622,21 @@ def test_literal_types parser.parse(rb) assert_write parser.decls, <<-EOF -A: ::Integer +A: 1 B: ::Float C: ::String -D: ::Symbol +D: :hello -E: untyped? +E: nil -F: bool +F: ::FalseClass -G: ::Array[untyped] +G: ::Array[1 | 2 | 3] -H: ::Hash[untyped, untyped] +H: { id: 123 } EOF end From d274c72349a43f0d26109eb8f33a180a0afcdfaf Mon Sep 17 00:00:00 2001 From: ksss Date: Thu, 24 Mar 2022 10:42:32 +0900 Subject: [PATCH 2/4] Move the logic for CALL cases from `node_type` to `literal_to_type`. Because this logic is primarily intended for CDECL. --- lib/rbs/prototype/rb.rb | 16 ++++++++-------- test/rbs/rb_prototype_test.rb | 6 +----- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/lib/rbs/prototype/rb.rb b/lib/rbs/prototype/rb.rb index 61d8ba8ae..e3f8be437 100644 --- a/lib/rbs/prototype/rb.rb +++ b/lib/rbs/prototype/rb.rb @@ -536,6 +536,14 @@ def literal_to_type(node) value_type = types_to_union_type(value_types) BuiltinNames::Hash.instance_type([key_type, value_type]) end + when :CALL + receiver, method_name, * = node.children + case method_name + when :freeze, :tap, :itself, :dup, :clone, :taint, :untaint, :extend + literal_to_type(receiver) + else + default + end else untyped end @@ -597,14 +605,6 @@ def node_type(node, default: Types::Bases::Any.new(location: nil)) BuiltinNames::Array.instance_type(default) when :HASH BuiltinNames::Hash.instance_type(default, default) - when :CALL - receiver, method_name, * = node.children - case method_name - when :freeze, :tap, :itself, :dup, :clone, :taint, :untaint, :extend - node_type(receiver) - else - default - end else default end diff --git a/test/rbs/rb_prototype_test.rb b/test/rbs/rb_prototype_test.rb index 1ee7ef7ff..359bf389b 100644 --- a/test/rbs/rb_prototype_test.rb +++ b/test/rbs/rb_prototype_test.rb @@ -49,8 +49,6 @@ def self.world end def kw_req(a:) end - - def opt_with_method_call(a = 'a'.freeze, b: 'b'.dup) end end EOR @@ -63,8 +61,6 @@ def hello: (untyped a, ?::Integer b, *untyped c, untyped d, e: untyped e, ?f: :: def self.world: () { (untyped, untyped, untyped, x: untyped, y: untyped) -> untyped } -> untyped def kw_req: (a: untyped a) -> nil - - def opt_with_method_call: (?::String a, ?b: ::String b) -> nil end EOF end @@ -576,7 +572,7 @@ module Foo module Foo VERSION: "0.1.1" - FROZEN: untyped + FROZEN: "str" ::Hello::World: :foo end From 7964e67c61776a01d27f64914826444832e50227 Mon Sep 17 00:00:00 2001 From: ksss Date: Thu, 24 Mar 2022 10:44:57 +0900 Subject: [PATCH 3/4] Rename method name to `param_type`. The `node_type` is used practically only for method arguments. Change the name to make the difference between `literal_to_type` and `node_type` clearer. --- lib/rbs/prototype/rb.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/rbs/prototype/rb.rb b/lib/rbs/prototype/rb.rb index e3f8be437..91792a591 100644 --- a/lib/rbs/prototype/rb.rb +++ b/lib/rbs/prototype/rb.rb @@ -408,7 +408,7 @@ def function_type_from_body(node, def_name) name = lvasgn.children[0] fun.optional_positionals << Types::Function::Param.new( name: name, - type: node_type(lvasgn.children[1]) + type: param_type(lvasgn.children[1]) ) end @@ -429,7 +429,7 @@ def function_type_from_body(node, def_name) when nil, :NODE_SPECIAL_REQUIRED_KEYWORD fun.required_keywords[name] = Types::Function::Param.new(name: name, type: untyped) when RubyVM::AbstractSyntaxTree::Node - fun.optional_keywords[name] = Types::Function::Param.new(name: name, type: node_type(value)) + fun.optional_keywords[name] = Types::Function::Param.new(name: name, type: param_type(value)) else raise "Unexpected keyword arg value: #{value}" end @@ -578,7 +578,7 @@ def range_element_type(types) end end - def node_type(node, default: Types::Bases::Any.new(location: nil)) + def param_type(node, default: Types::Bases::Any.new(location: nil)) case node.type when :LIT case node.children[0] @@ -610,6 +610,9 @@ def node_type(node, default: Types::Bases::Any.new(location: nil)) end end + # backward compatible + alias node_type param_type + def private @private ||= AST::Members::Private.new(location: nil) end From 03cbebb0a2e5ded83ffb79dc0e569d47d29f31ee Mon Sep 17 00:00:00 2001 From: ksss Date: Thu, 24 Mar 2022 10:46:37 +0900 Subject: [PATCH 4/4] Output true/false instead of TrueClass/FalseClass --- lib/rbs/prototype/rb.rb | 4 ++-- test/rbs/rb_prototype_test.rb | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/rbs/prototype/rb.rb b/lib/rbs/prototype/rb.rb index 91792a591..9bb7c6bb4 100644 --- a/lib/rbs/prototype/rb.rb +++ b/lib/rbs/prototype/rb.rb @@ -477,9 +477,9 @@ def literal_to_type(node) when :DREGX BuiltinNames::Regexp.instance_type when :TRUE - BuiltinNames::TrueClass.instance_type + Types::Literal.new(literal: true, location: nil) when :FALSE - BuiltinNames::FalseClass.instance_type + Types::Literal.new(literal: false, location: nil) when :NIL Types::Bases::Nil.new(location: nil) when :LIT diff --git a/test/rbs/rb_prototype_test.rb b/test/rbs/rb_prototype_test.rb index 359bf389b..1f8e60f14 100644 --- a/test/rbs/rb_prototype_test.rb +++ b/test/rbs/rb_prototype_test.rb @@ -130,9 +130,9 @@ def regx: () -> ::Regexp def dregx: () -> ::Regexp - def t: () -> ::TrueClass + def t: () -> true - def f: () -> ::FalseClass + def f: () -> false def n: () -> nil @@ -628,7 +628,7 @@ def test_literal_types E: nil -F: ::FalseClass +F: false G: ::Array[1 | 2 | 3]