Slide 1

Slide 1 text

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