Project

General

Profile

Actions

Feature #21998

open

Add {Method,UnboundMethod,Proc}#source_range

Feature #21998: Add {Method,UnboundMethod,Proc}#source_range

Added by Eregon (Benoit Daloze) about 20 hours ago.

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

Description

I'm using matz's suggestion almost as-is from https://bugs.ruby-lang.org/issues/6012#note-53.
The only change is the proposed class name.

Use Cases

Use cases have been discussed extensively and matz said:

The use cases are real and I want to support them

So I think we don't need to discuss that anymore :)

Background

Adding column and last line information to #source_location is deemed too incompatible given the usages of obj.source_location.last which expect the start line (they would get the end column instead).

Proposal

So instead we add a new method, {Method,UnboundMethod,Proc}#source_range,
which returns a Ruby::SourceRange and has these methods:

  • start_line: 1-indexed (same as source_location.first)
  • end_line: 1-indexed
  • start_column: in bytes, 0-indexed, I think start_byte_column could be good for extra clarity
  • end_column: in bytes, 0-indexed, I think end_byte_column could be good for extra clarity
  • inspect which shows something like #<Ruby::SourceRange (1,0)-(2,10)>.

For the edge case of a heredoc spanning further than the end of a method/block, we would not include it in the end_line & end_column methods, but instead document it and provide a small code snippet in the docs to compute that if desired with Prism.

Alternative

An alternative could be a Ruby::SourceLocation class and obj.source_location(object: true)/obj.source_location(extended: true) but it feels less nice. Since we are designing something new I think it's best to go for the cleanest design.

Consistency

The above methods match the name of methods on Prism::Node and have the same semantics, which is good for consistency and to avoid confusion.

Scope

The scope is intentionally minimal to keep the discussion focused.

Implementation

I'm happy to implement this, it should be pretty trivial and very similar to the extended source_location.
I would prefer to get an approval for this feature before implementing.


Related issues 4 (1 open3 closed)

Related to Ruby - Feature #6012: Proc#source_location also return the columnRejectednobu (Nobuyoshi Nakada)Actions
Related to Ruby - Feature #8751: Add offsets to method#source_locationClosedActions
Related to Ruby - Feature #17930: Add column information into error backtraceClosedmame (Yusuke Endoh)Actions
Related to Ruby - Feature #21005: Update the source location method to include line start/stop and column start/stop detailsOpenEregon (Benoit Daloze)Actions

Updated by Eregon (Benoit Daloze) about 20 hours ago Actions #1

  • Related to Feature #6012: Proc#source_location also return the column added

Updated by Eregon (Benoit Daloze) about 20 hours ago Actions #2

  • Related to Feature #8751: Add offsets to method#source_location added

Updated by Eregon (Benoit Daloze) about 20 hours ago Actions #3

  • Related to Feature #17930: Add column information into error backtrace added

Updated by Eregon (Benoit Daloze) about 20 hours ago Actions #4

  • Related to Feature #21005: Update the source location method to include line start/stop and column start/stop details added
Actions

Also available in: PDF Atom