【问题标题】:Is it possible to get the line number of a quoted string literal?是否可以获得带引号的字符串文字的行号?
【发布时间】:2015-06-30 19:43:14
【问题描述】:

我正在为 Elixir 编写一个 linter,它主要通过检查从 Code.string_to_quoted/2 返回的 AST 来工作。当我的应用程序发现某些被认为违反样式的内容时,我会使用节点元数据中的行号进行报告。

字符串是引用形式相同的文字之一,因此没有元数据。只看字符串,无法从周围的表达式中画出行号,如何获取行号。

比如我想要这个字符串

~s(\n"\\"")

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

iex(18)> Code.string_to_quoted ~S(\n"\\""), lines: true
{:ok, "\""}

【问题讨论】:

    标签: elixir


    【解决方案1】:

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

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

    【讨论】:

    • 是的,这就是问题所在。我认为这意味着没有其他明显的方法可以获取这样的字符串的行号 - 太可惜了。
    【解决方案2】:

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

    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 元组中的第二项是行号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 2022-06-11
      相关资源
      最近更新 更多