是否可以获取带引号的字符串文字的行号?

时间:2015-06-30 19:43:14

标签: elixir

我正在为Elixir写一个linter,主要是检查从 <xp:this.beforePageLoad><![CDATA[#{javascript: if (!poDoc.hasItem("Linkages")) { poDoc.replaceItemValue("Linkages", "defaultValue"); } }]]></xp:this.beforePageLoad> 返回的AST。当我的应用程序发现被视为违反样式的内容时,我会使用节点元数据中找到的行号进行报告。

字符串是引用形式中相同的文字之一,因此没有元数据。当我只查看字符串时,如何获取行号,并且无法从周围的表达式中绘制行号。

例如,我想要这个字符串

Code.string_to_quoted/2

在检查时导致第2行报告错误,但返回值没有行号。

~s(\n"\\"")

2 个答案:

答案 0 :(得分:1)

您不会获得文字的行号,因为它们表示为自己。它可以用于其他一切:

iex(1)> Code.string_to_quoted "a"
{:ok, {:a, [line: 1], nil}}

答案 1 :(得分:1)

虽然无法直接从引用的表达式中获取行号,但可以从标记化的源代码中获取字符串文字的行号。

Elixir编译器的标记化器实际上是标准库的一部分,可以使用:elixir_tokenizer模块进行访问,如下所示:

source_string
|> String.to_char_list
|> :elixir_tokenizer.tokenize( 1, [] )

如果您有此代码:

IO.puts "Hello, world!"

你会得到这样的东西:

{:ok, 2,
[{:aliases, 1, [:IO]}, {:., 1}, {:identifier, 1, :puts},
  {:bin_string, 1, ["Hello, world!"]}, {:eol, 1}]}

:bin_string元组中的第二项是行号。