Enjoy Ruby Programming
in IDE and TypeProf
Yusuke Endoh (@mametter)
RubyConf 2021
Slide 2
Slide 2 text
Yusuke Endoh / @mametter
•A Ruby committer working at Cookpad w/ @ko1
•Main contribution so far:
• Designed and implemented keyword arguments
• Implemented test coverage feature
• Implementing TypeProf Today's topic
2
Slide 3
Slide 3 text
A recent contribution: error_highlight
3
json = { foo: { bar: { baz: 42 } } }
json[:foo][:barr][:baz]
# Ruby 3.0
$ ruby t.rb
t.rb:2:in `': undefined method `[]' for nil:NilClass (NoMethodError)
# Ruby 3.1
$ ruby t.rb
t.rb:2:in `': undefined method `[]' for nil:NilClass (NoMethodError)
json[:foo][:barr][:baz]
^^^^^^
Credit: The original author of its prototype is @yui-knk
https://github.com/ruby/ruby/pull/4470
Slide 4
Slide 4 text
Index
•What is TypeProf?
•TypeProf for IDE
• How to use TypeProf for IDE
• Conclusion
4
Slide 5
Slide 5 text
TypeProf: A static analyzer for Ruby 3
•TypeProf analyzes non-annotated Ruby code
• guess types of method arguments and a return value
5
class User
def initialize(name)
@name = name
end
end
User.new("John")
Ruby code
class User
def initialize:(String name)->void
end
RBS
TypeProf
Slide 6
Slide 6 text
TypeProf? RBS? Steep? Sorbet?
6
Name What
RBS
TypeProf
Steep
Sorbet
The Ruby official type definition language
A static type analyzer for Ruby
A static type analyzer for Ruby
A static type analyzer for Ruby
Slide 7
Slide 7 text
Comparison between static analyzers
7
TypeProf Steep Sorbet
Type inference Strong Weak Weak
Accuracy Weak Strong Strong
Analysis speed Slow Fast Very fast
RBS support Yes Yes Not yet
IDE support No → Yes Yes Yes
Slide 8
Slide 8 text
RBS: An official language for Ruby types
• Common complaint: "Header files suck"
• TypeProf for IDE may solve this issue
8
class User
def initialize(name)
@name = name
end
end
User.new("John")
user.rb
class User
def initialize:
(String name) -> void
end
user.rbs
Slide 9
Slide 9 text
Index
•What is TypeProf?
•TypeProf for IDE
• How to use TypeProf for IDE
• Conclusion
9
Slide 10
Slide 10 text
Today's topic: TypeProf for IDE
10
VSCode TypeProf
code changed
error found
complete "5.ti"
maybe "5.times"
5.ti|
Do you mean:
5.times
1 + "str"
1 + "str"
Is this a bug?
• A VSCode extension for Ruby powered by TypeProf
Slide 11
Slide 11 text
Demo: TypeProf for IDE
11
Slide 12
Slide 12 text
The modern development experience
with TypeProf for IDE
12
On-the-fly method signature
Slide 13
Slide 13 text
The modern development experience
with TypeProf for IDE
13
On-the-fly error reporting
Slide 14
Slide 14 text
The modern development experience
with TypeProf for IDE
14
Slide 15
Slide 15 text
The modern development experience
with TypeProf for IDE
15
On-the-fly type inference
Completion
Slide 16
Slide 16 text
The modern development experience
with TypeProf for IDE
16
Hint for arguments
Slide 17
Slide 17 text
Demo: Summary
•Modern development experience comes to Ruby
without type annotations
•RBS are interspersed to Ruby files
• One possible answer to "Header files suck"
17
Slide 18
Slide 18 text
Index
•What is TypeProf?
•TypeProf for IDE
• How to use TypeProf for IDE
• Conclusion
18
Slide 19
Slide 19 text
How to configure TypeProf for IDE
• Use ruby 3.1.0-dev (development version☺)
• Add for your Gemfile
• Configure RBS collection
• if you use gems
• Install VSCode extension→
• search "typeprof"
• Open your folder with VSCode and pray
• More detail: https://github.com/ruby/typeprof/blob/master/doc/ide.md
19
gem "typeprof"
Slide 20
Slide 20 text
Protips™
•Write a simple test in a file
•Write RBS 😞
20
Slide 21
Slide 21 text
Demo: Tests instead of type annotations
21
untyped
String
Slide 22
Slide 22 text
Demo: Passing an unknown type
22
The method signature is changed
to accept a new type
Error in the callee side
Slide 23
Slide 23 text
Demo: Manual RBS specification
23
Click here
A prototype RBS is
created
Slide 24
Slide 24 text
Demo: Manual RBS specification (cont'd)
24
Error in the caller side
# means RBS-defined
Slide 25
Slide 25 text
Protips™
•Write a simple test in a file
• TypeProf requires a test to guess method signatures
•Write RBS to fix method signatures (if needed)
• This makes TypeProf analysis faster
• This is also useful to make TypeProf faster
25
Slide 26
Slide 26 text
Index
•What is TypeProf?
•TypeProf for IDE
• How to use TypeProf for IDE
• Conclusion
26
Slide 27
Slide 27 text
Release plan
•TypeProf for IDE will be released in Ruby 3.1
• Happy if you could play with it and give us feedback
•Ready for production?
• Experimental, but hopefully works for small programs
• For large code base, please write RBS for gems first!
• https://github.com/ruby/gem_rbs_collection
27
Slide 28
Slide 28 text
Special thanks
•Hideki Miura
• Ruby committers: matz, akr, ko1, soutaro
• Katsuhiro Ueno & Eijiro Sumii
•Stripe team & Shopify team & Jeff Foster
• Yuta Saito (@kateinoigakukun)
• Many improvements of TypeProf for IDE
28
Slide 29
Slide 29 text
Conclusion
•The modern development experience is possible
without full type annotations by TypeProf for IDE
•Ruby 3.1 will bundle TypeProf for IDE
29