Project

General

Profile

Actions

Feature #20624

open

Enhance `RubyVM::AbstractSyntaxTree::Node#locations` method and `RubyVM::AbstractSyntaxTree::Location` class

Added by yui-knk (Kaneko Yuichiro) 7 days ago. Updated 7 days ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:118531]

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

Updated by Eregon (Benoit Daloze) 7 days ago

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.

Updated by Eregon (Benoit Daloze) 7 days ago

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.

Actions

Also available in: Atom PDF

Like1
Like0Like0