🦔
[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では付属しているPrismは0.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(に依存している)をより新しいバージョンに更新する』べきとコメントされていますね- https://bugs.ruby-lang.org/issues/21618#note-4
- 他の gem と同じように『新しい Ruby に対応するように gem をアップデートする』という作業と同じ
- その上で課題としてあるのが『
Prism.parse(code)がデフォルトでRUBY_VERSIONではなくて最新の Ruby のバージョンを参照している点』が指摘されていますね- なので
Prismで参照するデフォルトのバージョンをRUBY_VERSIONにするとよいのでは、とコメントされている - https://bugs.ruby-lang.org/issues/21618#note-6
- なので
- それ以外の考慮点としては
Prismはパッチレベルのバージョンは対応していないのでそのあたりどうするのか、みたいな議論もされている - これなんですが最終的には
Prism.parse("foo", version: RUBY_VERSION)と同等のPrism.parse("foo", version: "current")みたいに"current"という形でバージョンを指定できるようにしたみたいですね - ただし
version: RUBY_VERSIONとは違いエラーになったときにより具体的なエラーが出るようになるみたいですね
Discussion