Share
Embed
Transcript
29 slides
-
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 -
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 `<main>': undefined method `[]' for nil:NilClass (NoMethodError) # Ruby 3.1 $ ruby t.rb t.rb:2:in `<main>': 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 -
Index •What is TypeProf? •TypeProf for IDE • How to
use TypeProf for IDE • Conclusion 4 -
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 -
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 -
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 -
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 -
Index •What is TypeProf? •TypeProf for IDE • How to
use TypeProf for IDE • Conclusion 9 -
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 -
The modern development experience with TypeProf for IDE 15 On-the-fly
type inference Completion -
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 -
Index •What is TypeProf? •TypeProf for IDE • How to
use TypeProf for IDE • Conclusion 18 -
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" -
Demo: Passing an unknown type 22 The method signature is
changed to accept a new type Error in the callee side -
Demo: Manual RBS specification (cont'd) 24 Error in the caller
side # means RBS-defined -
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 -
Index •What is TypeProf? •TypeProf for IDE • How to
use TypeProf for IDE • Conclusion 26 -
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 -
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 -
Conclusion •The modern development experience is possible without full type
annotations by TypeProf for IDE •Ruby 3.1 will bundle TypeProf for IDE 29