Issue #8321 has been updated by bozhidar (Bozhidar Batsov).


Here's an example:

[6] pry(main)> Ripper.sexp('alias :some :test')
=> [:program,
 [[:alias,
   [:symbol_literal, [:symbol, [:@ident, "some", [1, 7]]]],
   [:symbol_literal, [:symbol, [:@ident, "test", [1, 13]]]]]]]

Using the first identifier position is the common workaround for this problem, but it's a bit unreliable, since it might not be on the same line. That's why I generally use *Ripper.lex* to get exact keyword positions.
----------------------------------------
Feature #8321: Ripper: I would like coordinates for keywords
https://bugs.ruby-lang.org/issues/8321#change-39211

Author: ericp (Eric Promislow)
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 


=begin
Ripper gives the (({[line, column]})) coordinates for identifiers, strings, and numbers.

I would like it if it appended those coordinates to most of the block keywords,
including (({:program})), (({:if})), (({:while})), (({:unless})), (({:end})), (({:def})), (({:class})), (({:module})), etc.  As with the
identifiers, it should go at the end.  So an (({if}))-block would be represented as
 [0] :if
 [1] CONDITION
 [2] BLOCK
 [3] [:elsif, ...] || [:else, ...] || nil
 [4] [lineNo, colNo] # location of the leading :if/:elsif/:else/:unless

I currently get the first coordinate of ((%CONDITION%)), and then look up the preceding
(({:if}))/(({:elsif}))/(({:else})) using (({Ripper.lex(src).find_all{|posn kwd name| kwd == :on_kw && %w/if else elsif/.include?(name) }}))

So the info is in Ripper.  It would be more convenient if I could get that info in the src tree.

Note that my suggestion won't break (most) existing code, as the new data goes at the end
of the list.

The same would be useful for other keywords, including (({:module})) (({:class})) (({:def})) (({:try})) (({:catch})) (({:begin})) (({:rescue})).
=end



-- 
http://bugs.ruby-lang.org/