Feature #20624
closed
Enhance `RubyVM::AbstractSyntaxTree::Node#locations` method and `RubyVM::AbstractSyntaxTree::Location` class
Added by yui-knk (Kaneko Yuichiro) 4 months ago.
Updated 4 months ago.
Description
Background¶
It's revealed that single location information is not enough for some node types.
For example, Prism::IfNode
include these locations
if_keyword_loc
then_keyword_loc
end_keyword_loc
-
location
(this is whole node location)
I propose RubyVM::AbstractSyntaxTree::Node#locations
method to provide multiple locations information, and RubyVM::AbstractSyntaxTree::Location
class for location information.
Example¶
node = RubyVM::AbstractSyntaxTree.parse("1 + 2")
node = node
locs = node.locations
loc = locs.first
p node
# => #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-1:5>
p loc.class
# => RubyVM::AbstractSyntaxTree::Location
p [loc.first_lineno, loc.first_column, loc.last_lineno, loc.last_column]
# => [1, 0, 1, 5]
Interface¶
- Add
RubyVM::AbstractSyntaxTree::Location
class which has these methods
#first_lineno
#first_column
#last_lineno
#last_column
- Add
RubyVM::AbstractSyntaxTree::Node#locations
method which returns multiple location information of the node
- The first location is same with the whole node location
Implementation¶
https://github.com/yui-knk/ruby/tree/ast_locations
What is the motivation to improve this RubyVM API which AFAIK should not be used anymore?
RubyVM::AbstractSyntaxTree
is an experimental unstable hard-to-use API which only works on CRuby (from the documentation).
Prism is the designated Ruby parsing API, it is already adopted by many tools and it works on many Ruby implementations.
This new API also seems hard-to-use BTW, because RubyVM::AbstractSyntaxTree::Node#locations
returns an Array of locations, so how is one supposed to know the location at which index of that Array corresponds to what?
The current branch also only ever returns arrays with a single element, so it does not seem useful in the current state.
I have heard this is for further development for Universal Parser (Prism API bridge).
Accepted.
Matz.
- Status changed from Open to Closed
Applied in changeset git|f23485a8d693cb69fd7b84c1ab93cb4198ecfe4a.
[Feature #20624] Enhance RubyVM::AbstractSyntaxTree::Node#locations
This commit introduce RubyVM::AbstractSyntaxTree::Node#locations
method
and RubyVM::AbstractSyntaxTree::Location
class.
Ruby AST node will hold multiple locations information.
RubyVM::AbstractSyntaxTree::Node#locations
provides a way to access
these locations information.
RubyVM::AbstractSyntaxTree::Location
is a class which holds these location information:
#first_lineno
#first_column
#last_lineno
#last_column
Also available in: Atom
PDF
Like1
Like0Like0Like0Like0