From: Magnus Holm Date: 2013-05-10T16:48:16+09:00 Subject: [ruby-core:54898] Re: [ruby-trunk - Feature #8321] Ripper: I would like coordinates for keywords --089e0112cbee4ed00404dc584ead Content-Type: text/plain; charset=UTF-8 On Fri, May 10, 2013 at 9:13 AM, bozhidar (Bozhidar Batsov) < bozhidar@batsov.com> wrote: > > Issue #8321 has been updated by bozhidar (Bozhidar Batsov). > > > The example outlined in the proposal is exactly what I think we need. A > lot of Ruby code analysis tools need exact coordinates of keywords and > currently there is no easy and reliable way to get them. This is even more > important, now that you've rejected #8383 You can use the `parser` gem: https://github.com/whitequark/parser It gives you a nice AST together with source maps: require 'parser/current' ast = Parser::CurrentRuby.parse('if a; b; else; c; end') (if (send nil :a) (send nil :b) (send nil :c)) ast.source_map.expression # => 0...21 (the whole expression) ast.source_map.keyword # => 0...2 (the "if") ast.source_map.begin # => 4...5 (the ";") ast.source_map.else # => 9...13 (the "else") ast.source_map.end # => 18...12 (the "end") And you can then check the children for more data: (cond, tbranch, fbranch) = *ast cond.source_map.expression # => 3...4 ("a") All of these return a Source::Range which allows you to extract the source and lineno/column: cond.source_map.expression.to_source # => "a" cond.source_map.expression.line # => 1 cond.source_map.expression.column # => 3 Parser also supports 1.8, 1.9, 2.0 and 2.1/trunk, *and* it ships with a rewriter tool: http://whitequark.org/blog/2013/04/26/lets-play-with-ruby-code/ --089e0112cbee4ed00404dc584ead Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

= On Fri, May 10, 2013 at 9:13 AM, bozhidar (Bozhidar Batsov) <bozhidar@ba= tsov.com> wrote:

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


The example outlined in the proposal is exactly what I think we need. =C2= =A0A lot of Ruby code analysis tools need exact coordinates of keywords and= currently there is no easy and reliable way to get them. =C2=A0This is eve= n more important, now that you've rejected #8383

You can use the `parser` gem: https://github.com/whitequark/parser

It gives you a nice AST together with sour= ce maps:

=C2=A0 require 'parser/current'
=C2=A0 ast =3D Parser::CurrentRuby.parse('if a; b; else; c= ; end')

(if
= =C2=A0 (send nil :a)
=C2=A0 (send nil :b)
=C2=A0 (send nil :c))
<= br>
=C2=A0 ast.source_map.expression # =3D> 0...21 (the whole = expression)
=C2=A0 ast.source_map.keyword # =3D> 0...2 (the &q= uot;if")
=C2=A0 ast.source_map.begin # =3D> 4...5 (the ";")
=C2=A0 ast.source_map.else # =3D> 9...13 (the "else")
=C2=A0 ast.source_map.end # =3D> 18...12 (the "end&quo= t;)

And you can then check the children for more data:

=C2=A0 (cond, tbranch, fbranch) =3D *ast<= /div>

=C2=A0 cond.source_map.expression # = =3D> 3...4 ("a")

All of these return a Source::Range which a= llows you to extract the source and lineno/column:

=C2=A0 cond.source_map.expression.to_source # =3D> "a&= quot;
=C2=A0 cond.source_map.expression.line # =3D> 1
=C2=A0 cond.source_map.expression.column # =3D> 3
Parser also supports 1.8, 1.9, 2.0 and 2.1/trunk, *and* i= t ships with a rewriter tool:=C2=A0http://whitequark.org/blog/2013/04/26/l= ets-play-with-ruby-code/
--089e0112cbee4ed00404dc584ead--