当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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 \\ [])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。