🦔

[Bug #21618] 実行中の Ruby と Prism で使用する Ruby のバージョンが異なっている場合のチケット

に公開

[Bug #21618] Allow to use the build-in prism version to parse code

  • Prism.parse("foo") を呼び出すと常に Prism でサポートしている最新の Ruby の構文が使用される
  • これは現在実行中の Ruby のバージョンの可能性もあるがそうでない可能性もある
  • 例えば Ruby 3.3.7 では付属している Prism0.19.0 になる
  • このときに次のように Ruby 3.4 で追加された it の構文はサポートされていない
require "prism"

pp Prism::VERSION # => "0.19.0"
pp RUBY_VERSION   # => "3.3.7"

# it は専用の構文としては扱われずにパースされる
pp Prism.parse("42.tap { it }")
  • 一方で使用する Prism のバージョンが 1.6.0 であれば Ruby 3.4 をサポートしているので it も専用の構文としてパースされる
require "prism"

pp RUBY_VERSION   # => "3.3.7"
pp Prism::VERSION # => "1.6.0" 新しいバージョンを使用する

# Prism の新しいバージョンを使用すると it は専用の構文としてパースされる
pp Prism.parse("42.tap { it }")
  • これが現在実行中のバージョンと同じようにパースしたい場合に問題がある
    • 新しい構文もそうだが、削除された構文ではパースできなくなってしまう
  • これを回避する場合に Prism.parse("foo", version: RUBY_VERSION) のように明示的にバージョンをしているやり方が考えられる
  • しかし、例えば RUBY_VERSION = 4.0 のときに『まだ 4.0 をサポートしていない古い Prism を使用している場合』に問題が発生する可能性がある
    • Gemfile 等で明示的に Prism のバージョンを指定している場合等
  • こういう問題をどうしましょうか、という内容のチケット
  • ここでいう課題というのが『使用している Prism が古くて最新の Ruby をサポートしていない』と言えるんですがそれは単純に『 Prism (に依存している)をより新しいバージョンに更新する』べきとコメントされていますね
  • その上で課題としてあるのが『 Prism.parse(code) がデフォルトで RUBY_VERSION ではなくて最新の Ruby のバージョンを参照している点』が指摘されていますね
  • それ以外の考慮点としては Prism はパッチレベルのバージョンは対応していないのでそのあたりどうするのか、みたいな議論もされている
  • これなんですが最終的には Prism.parse("foo", version: RUBY_VERSION) と同等の Prism.parse("foo", version: "current") みたいに "current" という形でバージョンを指定できるようにしたみたいですね
  • ただし version: RUBY_VERSION とは違いエラーになったときにより具体的なエラーが出るようになるみたいですね
GitHubで編集を提案

Discussion