我正在为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"\\"")
答案 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
元组中的第二项是行号。