terminal 1
$ brew install glib
$ C_INCLUDE_PATH=/usr/local/opt/glib/include/glib-2.0/ gem install arg_scanner
$ mkfifo /tmp/ruby-type-inference-pipe-42
$ arg-scanner --type-tracker --pipe-file-path=/tmp/ruby-type-inference-pipe-42 bundle exec rails console
[1] pry(main)> app.get('/')
terminal 2. sample output. this is prettified and truncated, btw.
$ tail -f /tmp/ruby-type-inference-pipe-42
{
"method_name": "split",
"call_info_argc": "-1",
"args_info": "REQ,String,uri",
"visibility": "PUBLIC",
"path": "/.rbenv/versions/2.5.7/lib/ruby/2.5.0/uri/rfc2396_parser.rb",
"lineno": "121",
"receiver_name": "URI::RFC2396_Parser",
"return_type_name": "Array"
}
{
"method_name": "initialize",
"call_info_argc": "10",
"args_info": "REQ,NilClass,scheme;REQ,NilClass,userinfo;REQ,NilClass,host;REQ,NilClass,port;REQ,NilClass,registry;REQ,String,path;REQ,NilClass,opaque;REQ,NilClass,query;REQ,NilClass,fragment;OPT,URI::RFC2396_Parser,parser;OPT,FalseClass,arg_check",
"visibility": "PUBLIC",
"path": "/.rbenv/versions/2.5.7/lib/ruby/2.5.0/uri/generic.rb",
"lineno": "170",
"receiver_name": "URI::Generic",
"return_type_name": "NilClass"
}
{
"method_name": "parse",
"call_info_argc": "-1",
"args_info": "REQ,String,uri",
"visibility": "PUBLIC",
"path": "/.rbenv/versions/2.5.7/lib/ruby/2.5.0/uri/rfc2396_parser.rb",
"lineno": "210",
"receiver_name": "URI::RFC2396_Parser",
"return_type_name": "URI::Generic"
}
{
"method_name": "set_port",
"call_info_argc": "-1",
"args_info": "REQ,String,v",
"visibility": "PUBLIC",
"path": "/.rbenv/versions/2.5.7/lib/ruby/2.5.0/uri/generic.rb",
"lineno": "701",
"receiver_name": "URI::Generic",
"return_type_name": "Integer"
}
...
{
"method_name": "parse",
"call_info_argc": "-1",
"args_info": "REQ,String,uri",
"visibility": "PUBLIC",
"path": "/.rbenv/versions/2.5.7/lib/ruby/2.5.0/uri/rfc2396_parser.rb",
"lineno": "210",
"receiver_name": "URI::RFC2396_Parser",
"return_type_name": "URI::HTTP"
}
{
"method_name": "connect_nonblock",
"call_info_argc": "1",
"args_info": "REQ,String,addr",
"visibility": "PUBLIC",
"path": "/.rbenv/versions/2.5.7/lib/ruby/2.5.0/socket.rb",
"lineno": "1212",
"receiver_name": "Socket",
"return_type_name": "NilClass"
}
{
"method_name": "mon_synchronize",
"call_info_argc": "-1",
"args_info": "",
"visibility": "PUBLIC",
"path": "/.rbenv/versions/2.5.7/lib/ruby/2.5.0/monitor.rb",
"lineno": "230",
"receiver_name": "Redis::Connection::TCPSocket",
"return_type_name": "Redis::Connection::TCPSocket"
}
...
{
"method_name": "uuid",
"call_info_argc": "-1",
"args_info": "",
"visibility": "PUBLIC",
"path": "/.rbenv/versions/2.5.7/lib/ruby/2.5.0/securerandom.rb",
"lineno": "220",
"receiver_name": "Random::Formatter",
"return_type_name": "String"
}
{
"method_name": "[]",
"call_info_argc": "1",
"args_info": "REST,Array,args;BLOCK,NilClass,block",
"visibility": "PUBLIC",
"path": "/.rbenv/versions/2.5.7/lib/ruby/gems/2.5.0/gems/actionpack-4.2.11.1/lib/action_dispatch/http/response.rb",
"lineno": "51",
"receiver_name": "ActionDispatch::Response",
"return_type_name": "NilClass"
}