Feature #21826
openDeprecating RubyVM::AbstractSyntaxTree
Description
I think it is time to deprecate RubyVM::AbstractSyntaxTree.
Matz has agreed that going forward the official parser API for Ruby will be the Prism API so it's clear the official Ruby parsing API is the Prism API.
RubyVM::AbstractSyntaxTree is CRuby-specific and does not work on any other Ruby implementation, the API is unstable, inconvenient, etc:
This module is experimental and its API is not stable, therefore it
might change without notice. As examples, the order of children nodes is
not guaranteed, the number of children nodes might change, there is no
way to access children nodes by name, etc.
Because it's under RubyVM, it also has the following documented caveats:
This module is for very limited purposes, such as debugging, prototyping, and research.
Normal users must not use it. This module is not portable between Ruby implementations.
Given these caveats I think it could possibly be fair enough to remove it without deprecation,
however I see no urgency to remove it straight away so I think having it deprecated for one release is nicer for the few gems using it.
The advantages of deprecating it are:
- Make it clear that this API should not be used in new code
- Encourage the few usages to migrate to the Prism API, which is stable, officially supported, designed with many people to be usable and convenient for every parsing/tooling usage, etc.
- Improve portability of Ruby code between Ruby implementations
So, let's deprecate RubyVM::AbstractSyntaxTree in 4.1, and remove it in 4.2?
Updated by headius (Charles Nutter) 2 days ago
I am in favor, but that's no surprise.
Updated by Earlopain (Earlopain _) about 11 hours ago
RubyVM::AbstractSyntaxTree is not only used for parsing. I don't think there are proper replacements for of and node_id_for_backtrace_location yet. error_highlight for example uses both of (under parse.y) and node_id_for_backtrace_location (under prism).
of is probably handled with something like https://bugs.ruby-lang.org/issues/21795 but it is only an idea right now. Maybe it can use source_location with end information instead. But I don't know of something for node_id_for_backtrace_location (https://bugs.ruby-lang.org/issues/19083) so it's too early to deprecate the entire module in my opinion.
I'm don't mind parse/parse_file being deprecated.
Updated by mame (Yusuke Endoh) about 11 hours ago
I reserve my opinion on the proposal itself, but just about node_id_for_backtrace_location:
Earlopain (Earlopain _) wrote in #note-2:
But I don't know of something for
node_id_for_backtrace_location(https://bugs.ruby-lang.org/issues/19083) so it's too early to deprecate the entire module in my opinion.
This is an internal API for retrieving the node_id of a Thread::Backtrace::Location in order to identify the corresponding Prism node. So, if Thread::Backtrace::Location#ast is introduced, I guess node_id_for_backtrace_location can be replaced with it.
That said, the API is introduced for Rails, and actually still used: https://github.com/rails/rails/blob/d82a7d6bf7aed3dd9629287b2d814b269ac8446f/actionview/lib/action_view/template.rb#L232
So, deprecation and removal needs careful synchronization with them, at least.