當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Elixir Code.Fragment.surround_context用法及代碼示例


Elixir語言中 Code.Fragment.surround_context 相關用法介紹如下。

用法:

surround_context(fragment, position, options \\ [])
(從 1.13.0 開始)
@spec surround_context(List.Chars.t(), position(), keyword()) ::
  %{begin: position(), end: position(), context: context} | :none
when context:
       {:alias, charlist()}
       | {:dot, inside_dot, charlist()}
       | {:local_or_var, charlist()}
       | {:local_arity, charlist()}
       | {:local_call, charlist()}
       | {:module_attribute, charlist()}
       | {:operator, charlist()}
       | {:unquoted_atom, charlist()},
     inside_dot:
       {:alias, charlist()}
       | {:dot, inside_dot, charlist()}
       | {:module_attribute, charlist()}
       | {:unquoted_atom, charlist()}
       | {:var, charlist()}

接收一個字符串並返回環繞上下文。

此函數接收帶有 Elixir 代碼片段和 position 的字符串。它返回一個包含標識符開頭和結尾及其上下文的映射,如果沒有已知上下文,則返回 :none

cursor_context/2 surround_context/3 的區別在於前者假設代碼片段中的表達式不完整。例如, cursor_context/2 中的do 可能是關鍵字或變量或本地調用,而 surround_context/3 假定代碼片段中的表達式是完整的,因此do 將始終是關鍵字。

position 包含 linecolumn ,兩者都從索引 1 開始。列必須位於周圍的表達式之前。例如,表達式 foo 將為第 1、2 和 3 列返回一些內容,但不是 4:

foo
^ column 1

foo
 ^ column 2

foo
  ^ column 3

foo
   ^ column 4

返回的映射包含表達式開始的列和表達式結束後的第一列。

cursor_context/2 類似,此函數也提供了盡力而為的檢測,並且可能並非在所有情況下都準確。有關詳細信息,請參閱 cursor_context/2 下的 "Return values" 和 "Limitations" 部分。

例子

iex> Code.Fragment.surround_context("foo", {1, 1})
%{begin: {1, 1}, context: {:local_or_var, 'foo'}, end: {1, 4}}

cursor_context/2 的差異

因為 surround_context/3 處理完整的代碼,它與 cursor_context/2 有一些區別:

  • dot_call /dot_arityoperator_call /operator_arity 分別折疊到 dotoperator 上下文中,因為它們之間沒有任何有意義的區別

  • 另一方麵,此函數仍然區分 local_call /local_aritylocal_or_var ,因為後者可以是局部變量或變量

  • @ 如果後麵沒有任何標識符,則返回為 {:operator, '@'}(與 cursor_context/2 中的 {:module_attribute, ''} 相比

  • 此函數從不返回空符號 {:sigil, ''} 或空結構 {:struct, ''} 作為上下文

相關用法


注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Code.Fragment.surround_context(fragment, position, options \\ [])。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。