ruby-trunk-changes 2022-10-08

今日は主に RubyVM::AbstractSyntaxTree.parse に error_tolerant キーワードオプションを追加して、不完全なスクリプトを parse してもなんらかの AST が返せるようにする error tolerant parser の実装などがありました。

[ad0def7f25] Peter Zhu 2022-10-07 13:39:07 UTC

3df904d1a8dc614589295dfdf30a781114b3a7fcデバッグのためのメッセージ追加していたテスト test_thrashing_for_young_objects でさらにデバッグメッセージに GC.stat_heap の前後での値を追加しています。

[d76854f166] Alan Wu 2022-10-06 15:37:16 UTC

定数の inline cache の粒度を細かく制御するようにした変更について NEWS に追記しています。内部的な実装の変更ですが RubyVM.stat(:global_constant_state) がなくなるという非互換もあるので追記しているみたいです。 [ruby-core:107603] [Feature #18589]

[83a9b91522] st0012 2022-10-06 10:49:51 UTC

標準添付ライブラリ irb の補間処理のテストを追加しています。

[3e18bb916f] st0012 2022-10-06 10:59:49 UTC

標準添付ライブラリ irb の補完処理のテストをいくつかのテストクラスに分割するリファクタリング

[afc1f4fba4] st0012 2022-10-06 11:27:16 UTC

標準添付ライブラリ irb の補完処理のテストに定数の補完のテストクラスを追加しています。

[7be5e9b971] st0012 2022-10-06 11:30:18 UTC

標準添付ライブラリ irb の補完処理のテストで assert_equal の引数の順序が間違ってた(期待値のほうを後に書いてた)のを修正しています。

[7cafe09aec] st0012 2022-10-06 10:54:11 UTC

標準添付ライブラリ irb の補完処理でメソッド一覧を取得するのを本当に必要とする直前に移動しています。

[5b3079a8a5] st0012 2022-10-06 11:37:37 UTC

標準添付ライブラリ irb の補完処理で定数の補完候補をソートしておくようにしています。

[844a9dff88] Samuel Williams 2022-10-08 01:02:34 UTC

e4f91bbdbaa6ab3125f24967414ac5300bb244f5 で追加した IO#timeout= に関連して rb_io_maybe_wait_{readable,writable}() などの関数のタイムアウト指定でデフォルト(IO#timeout= で設定した値)を使うことを指定するために Qundef を渡すという仕様にしていたのを、Qnil でデフォルト値を使うという仕様に変更しています。これに伴ない rb_io_t::timeout を使ってたところで a081fe76de5de0307651d99324a0e454fd8b8a8b で追加したマクロ定数 RUBY_IO_TIMEOUT_DEFAULT を利用するようにしています。このマクロの定義も Qundef から Qnil に変更されています。 https://github.com/ruby/ruby/pull/6509

[7775d14356] git 2022-10-08 07:05:42 UTC

gems/bundled_gems および NEWS の net-ftp のバージョンを更新/追記しています。

[fbbdbdd891] yui-knk 2022-09-25 08:53:44 UTC

Language Server などエディタや IDE でのサポートのために不完全な ruby スクリプト片でもエラーにならずにパースして構築途中の AST を返せるパーサーが欲しいという動機があるみたいで、RubyVM::AbstractSyntaxTree.parse に error_tolerant というキーワード引数を追加してこれに true が指定されたら SyntaxError になるようなスクリプトが渡されてもエラーにせず Node を返せるようにしています。 [ruby-core:109977] [Feature #19013]

[52eaffde86] yui-knk 2022-09-25 12:23:17 UTC

fbbdbdd8911ffb24d98bb71c7c33d24609ce7dfe の続きでコマンドラインオプションの --dump の yydebug, parsetree, parsetree_with_comment などに "+error_tolerant" をつけることでこれらのオプションが出力するパーサーの情報や AST の情報もスクリプトに文法エラーがあっても出るところまで出すようにしているようです。 [ruby-core:109977] [Feature #19013]

[342d4c16d9] yui-knk 2022-09-25 09:09:34 UTC

fbbdbdd8911ffb24d98bb71c7c33d24609ce7dfe の続きで RubyVM::AbstractSyntaxTree.parse では end に対応する式のトークンの位置を記録しておいて、ちゃんと閉じられなかった時に末尾にダミーの end トークンを発生させておくようにしています。メンバー名や関数名の localtions は locations の typo でしょうか?(検索しようとしてどうしてもヒットしなくて気がついた) [ruby-core:109977] [Feature #19013]

[4f24f3ea94] yui-knk 2022-10-01 08:19:34 UTC

fbbdbdd8911ffb24d98bb71c7c33d24609ce7dfe の続きで end がメソッド呼び出しの形の部分に出現した場合メソッド名として扱われますが、書きかけのスクリプトで行の末尾に "." があって次の行に end があるという状態では end はメソッド名ではなくブロックを終端させる end と解釈するほうが自然なので、end の閉じ漏れがあった場合にこのような疑わしい end はキーワードとして扱うようにするということをしているようです。文法エラー時のメッセージをわかりやすくするのにも効果がありそう(今のところ使っているかどうかはわかりませんが)。 [ruby-core:109977] [Feature #19013]

[4bfdf6d06d] yui-knk 2022-10-01 08:44:28 UTC

fbbdbdd8911ffb24d98bb71c7c33d24609ce7dfe の続きで NODE_ERROR というタイプの NODE を追加して SyntaxError 時の AST 生成でエラー箇所を極力ノードの葉に近いところで検出できるようにしているみたいです。元々は bison の error ルールが stmts や top_stmts のところにあったのを stmt (文)のレベルにアクションを置くようにしています。不完全なスクリプトをパースした時にエラーになった箇所の先を正しく解釈した AST が作れるようにするためかなと思います。 [ruby-core:109977] [Feature #19013]

[3531086095] yui-knk 2022-10-01 08:53:39 UTC

fbbdbdd8911ffb24d98bb71c7c33d24609ce7dfe および 4bfdf6d06ddbcf21345461038f2a9e3012f77268 の続きで parse.y の expr_value のルールにも error を追加しています。条件部のない if などで必要だったとのこと。 [ruby-core:109977] [Feature #19013]

[0f231f2bab] Maciek Rząsa 2022-10-08 10:30:12 UTC

標準添付ライブラリ optparse の OptionParser#on で short option がないことを表すのに明示的に空文字列を渡すことができるみたいで(知らなかった)その時に空文字列がヘルプメッセージに入るのを防ぐようにしています。