From: "nobu (Nobuyoshi Nakada)" <nobu@...> Date: 2013-05-09T10:57:38+09:00 Subject: [ruby-core:54873] [ruby-trunk - Feature #8321] Ripper: I would like coordinates for keywords Issue #8321 has been updated by nobu (Nobuyoshi Nakada). Do you mean changing following code from `current' to `proposal'? *code Ripper.sexp(<<SRC) if some test elsif yet another else test end SRC *current [:program, [ [:if, [:vcall, [:@ident, "some", [1, 3]]], [ [:vcall, [:@ident, "test", [2, 2]]] ], [:elsif, [:vcall, [:@ident, "yet", [3, 6]]], [ [:vcall, [:@ident, "another", [4, 2]]] ], [:else, [ [:vcall, [:@ident, "test", [6, 2]]] ] ] ] ] ] ] *proposal [:program, [ [:if, [:vcall, [:@ident, "some", [1, 3]]], [ [:vcall, [:@ident, "test", [2, 2]]] ], [:elsif, [:vcall, [:@ident, "yet", [3, 6]]], [ [:vcall, [:@ident, "another", [4, 2]]] ], [:else, [ [:vcall, [:@ident, "test", [6, 2]]] ], [6, 0] # location of `if' ], [3, 0] # location of `elsif' ], [1, 0] # location of `else' ] ] ] Or do you want the end location of `vcall's? ---------------------------------------- Feature #8321: Ripper: I would like coordinates for keywords https://bugs.ruby-lang.org/issues/8321#change-39212 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/