Hi,
I would like Elixir AST nodes to include begin and end parse character offsets.
This would make it easier to write refactoring tools that modify parts of
Elixir source files.
Usecase:
able to create and update expected values in tests. For example, given the
following:
assert_value 2 + 2 == 2 + 3
our code will find the location of `2 + 3` and replace it with `4`:
assert_value 2 + 2 == 4
Today determining the location of `2 + 3` in the source file is difficult. For
now, we use a custom-made parser which processes code char by char until it gets
value matching AST:
But if we had the parse offsets it would be much easier.
Proposed interface:
Probably need two sets of offsets, exclusive and inclusive of children. For
each probably best to store beginning offset and length. Will need reasonable
handling for parentheses and other tokens that do not make it into AST.
Existing implementation:
Elixir AST nodes do have useful info on this already. We use the "line:" which
is very helpful. We don't use "column:", it did not seem useful given our
implementation. We may be missing something obvious here.
Details:
In Elixir 1.6 compiled code AST has only function line number in meta. Even
"columns: true" in Code.string_to_quoted gives only function starting column
without information about arguments.
Consider the following code:
Code.string_to_quoted!("(41.00 == 42.0000)", columns: true)
#=> {:==, [line: 1, column: 8], [41.0, 42.0]}
From the AST you don't know where to find 41.00 and 42.0000 in a code.
Column information does not help. AST values of 41.0 and 42.0 don't have
information about how original values were formatted.
Thanks,
Serge