Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Enjoy Ruby Programming in IDE and TypeProf

Enjoy Ruby Programming in IDE and TypeProf

RubyConf 2021

Yusuke Endoh

November 09, 2021
Tweet

More Decks by Yusuke Endoh

Other Decks in Programming

Transcript

  1. 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
  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
  3. Index •What is TypeProf? •TypeProf for IDE • How to

    use TypeProf for IDE • Conclusion 4
  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
  5. 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
  6. 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
  7. 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
  8. Index •What is TypeProf? •TypeProf for IDE • How to

    use TypeProf for IDE • Conclusion 9
  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
  10. 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
  11. Index •What is TypeProf? •TypeProf for IDE • How to

    use TypeProf for IDE • Conclusion 18
  12. 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"
  13. Demo: Passing an unknown type 22 The method signature is

    changed to accept a new type Error in the callee side
  14. 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
  15. Index •What is TypeProf? •TypeProf for IDE • How to

    use TypeProf for IDE • Conclusion 26
  16. 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
  17. 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
  18. Conclusion •The modern development experience is possible without full type

    annotations by TypeProf for IDE •Ruby 3.1 will bundle TypeProf for IDE 29