Skip to content

Commit

Permalink
Support keyword arguments support partially
Browse files Browse the repository at this point in the history
Previously, methods defined with keyword arguments would have their keyword arguments ignored.

```rb
def foo(x:)
  x.to_i
end
```

→

```
def foo: -> Integer
```

With the added support for keyword arguments, keyword arguments can now be interpreted.
However, the following are not yet supported

- Method calls with keyword arguments
  keyword_hash_node because it does not support.
- Optional keyword arguments
  The scenario test `RuntimeError: AST diff does not work well; the completely same code generates a different AST` is annoying me and I gave up.
  • Loading branch information
euglena1215 authored and mame committed May 22, 2024
1 parent 799276d commit 1fe112b
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 14 deletions.
20 changes: 7 additions & 13 deletions lib/typeprof/core/ast/method.rb
Original file line number Diff line number Diff line change
Expand Up @@ -70,20 +70,16 @@ def self.parse_params(tbl, raw_args, lenv)
opt_keywords = []
opt_keyword_defaults = []

kw = raw_args.keywords
if false
while kw
raise unless kw.type == :KW_ARG
lasgn, kw = kw.children
var, expr = lasgn.children
if expr == :NODE_SPECIAL_REQUIRED_KEYWORD
req_keywords << var
else
opt_keywords << var
opt_keyword_defaults << AST.create_node(lasgn, lenv)
raw_args.keywords.each do |kw|
case kw.type
when :required_keyword_parameter_node
req_keywords << kw.name
when :optional_keyword_parameter_node
# TODO: support optional_keyword_parameter_node
end
end

if false
rest_keywords = nil
if args[8]
raise unless args[8].type == :DVAR
Expand Down Expand Up @@ -146,8 +142,6 @@ def initialize(raw_node, lenv)
@opt_keyword_defaults = h[:opt_keyword_defaults]
@rest_keywords = h[:rest_keywords]
@block = h[:block]

# TODO: support opts, keywords, etc.
@args_code_ranges = h[:args_code_ranges] || []
end

Expand Down
6 changes: 5 additions & 1 deletion lib/typeprof/core/graph/box.rb
Original file line number Diff line number Diff line change
Expand Up @@ -479,7 +479,11 @@ def show
@f_args.post_positionals.each do |var|
args << Type.strip_parens(var.show)
end
# TODO: keywords
@f_args.req_keywords.each do |f_vtx|
# `f_vtx.show_name[4..]` means 'var:x' => 'x'
args << "#{f_vtx.show_name[4..]}: #{Type.strip_parens(f_vtx.show)}"
end
# TODO: support opt_keywords
args = args.join(", ")
s = args.empty? ? [] : ["(#{ args })"]
s << "#{ block_show.sort.join(" | ") }" unless block_show.empty?
Expand Down
9 changes: 9 additions & 0 deletions scenario/method/keywords.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
## update
def foo(x:)
x
end

## assert
class Object
def foo: (x: untyped) -> untyped
end

0 comments on commit 1fe112b

Please sign in to comment.