查看源代码 erl_prettypr (syntax_tools v3.2.1)

抽象 Erlang 语法树的漂亮打印。

此模块是漂亮打印库模块 prettypr 的前端,用于格式化由模块 erl_syntax 定义的抽象语法树的文本。

概要

函数

等效于 best(Tree, [])

为语法树创建一个固定的“最佳”抽象布局。

将抽象 Erlang 语法树漂亮打印格式化为文本。

返回漂亮打印上下文的 hook 函数字段。

返回漂亮打印上下文的行宽字段。

返回漂亮打印上下文的纸张宽度字段。

返回漂亮打印上下文的操作符优先级字段。

返回漂亮打印上下文的用户数据字段。

为语法树创建抽象文档布局。

更新漂亮打印上下文的 hook 函数字段。

更新漂亮打印上下文的行宽字段。

更新漂亮打印上下文的纸张宽度字段。

更新漂亮打印上下文的操作符优先级字段。

更新漂亮打印上下文的用户数据字段。

类型

链接到此类型

clause_t()

查看源代码 (未导出)
-type clause_t() ::
          case_expr | fun_expr | if_expr | maybe_expr | receive_expr | try_expr |
          {function, prettypr:document()} |
          spec.
链接到此类型

context()

查看源代码 (未导出)
-type context() ::
          #ctxt{prec :: integer(),
                sub_indent :: non_neg_integer(),
                break_indent :: non_neg_integer(),
                clause :: clause_t() | undefined,
                hook :: hook(),
                paper :: integer(),
                ribbon :: integer(),
                user :: term(),
                encoding :: epp:source_encoding(),
                empty_lines :: sets:set(integer())}.
-type hook() :: none | fun((syntaxTree(), _, _) -> prettypr:document()).
链接到此类型

syntaxTree()

查看源代码 (未导出)
-type syntaxTree() :: erl_syntax:syntaxTree().

抽象语法树。

有关详细信息,请参阅 erl_syntax 模块。

函数

-spec best(syntaxTree()) -> empty | prettypr:document().

等效于 best(Tree, [])

-spec best(syntaxTree(), [term()]) -> empty | prettypr:document().

为语法树创建一个固定的“最佳”抽象布局。

这类似于 layout/2 函数,只是这里,最终布局已根据给定选项选择。如果没有生成这样的布局,则返回原子 empty。有关选项的信息,请参阅 format/2 函数。

另请参阅:best/1, format/2, layout/2, prettypr:best/3

-spec format(syntaxTree()) -> string().

等效于 format(Tree, [])

-spec format(syntaxTree(), [term()]) -> string().

将抽象 Erlang 语法树漂亮打印格式化为文本。

例如,如果你有一个使用 debug_info 编译的 .beam 文件,则以下内容应打印模块的源代码(如其在调试信息表示中的外观)

     {ok,{_,[{abstract_code,{_,AC}}]}} =
             beam_lib:chunks("myfile.beam",[abstract_code]),
     io:put_chars(erl_prettypr:format(erl_syntax:form_list(AC)))

可用选项

  • {hook, none | hook()} - 除非值为 none,否则对于每个注释列表不为空的节点,都会调用给定的函数。默认值为 none

  • {paper, integer()} - 指定任何行上的首选最大字符数,包括缩进。默认值为 80。

  • {ribbon, integer()} - 指定任何行上的首选最大字符数,不包括缩进。默认值为 65。

  • {user, term()} - 用于 hook 函数的用户特定数据。默认值为 undefined

  • {encoding, epp:source_encoding()} - 指定生成文件的编码。

hook 函数(参见 hook() 类型)将传递当前的语法树节点、上下文和一个延续。可以通过诸如 get_ctxt_user/1set_ctxt_user/2 等函数检查和操作上下文。hook 必须返回一个“文档”数据结构(参见 layout/2best/2);这可以通过应用延续函数部分或全部构造。例如,以下是一个微不足道的 hook

      fun (Node, Ctxt, Cont) -> Cont(Node, Ctxt) end

这产生的结果与未给出 hook 时相同。但是,以下内容

      fun (Node, Ctxt, Cont) ->
          Doc = Cont(Node, Ctxt),
          prettypr:beside(prettypr:text("<b>"),
                          prettypr:beside(Doc,
                                          prettypr:text("</b>")))
      end

将把任何带注释节点的文本(无论注释数据如何)放在 HTML “粗体开始”和“粗体结束”标签之间。

另请参阅:erl_syntax, best/2, format/1, get_ctxt_user/1, layout/2, set_ctxt_user/2

-spec get_ctxt_hook(context()) -> hook().

返回漂亮打印上下文的 hook 函数字段。

另请参阅:set_ctxt_hook/2

链接到此函数

get_ctxt_linewidth(Ctxt)

查看源代码
-spec get_ctxt_linewidth(context()) -> integer().

返回漂亮打印上下文的行宽字段。

另请参阅:set_ctxt_linewidth/2

链接到此函数

get_ctxt_paperwidth(Ctxt)

查看源代码
-spec get_ctxt_paperwidth(context()) -> integer().

返回漂亮打印上下文的纸张宽度字段。

另请参阅:set_ctxt_paperwidth/2

链接到此函数

get_ctxt_precedence(Ctxt)

查看源代码
-spec get_ctxt_precedence(context()) -> integer().

返回漂亮打印上下文的操作符优先级字段。

另请参阅:set_ctxt_precedence/2

-spec get_ctxt_user(context()) -> term().

返回漂亮打印上下文的用户数据字段。

另请参阅:set_ctxt_user/2

-spec layout(syntaxTree()) -> prettypr:document().

等效于 layout(Tree, [])

-spec layout(syntaxTree(), [term()]) -> prettypr:document().

为语法树创建抽象文档布局。

结果表示一组可能的布局(参见模块 prettypr)。有关选项的信息,请参阅 format/2;但是,请注意此函数会忽略 paperribbon 选项。

此函数提供了一个漂亮打印机的低级接口,返回一个灵活的可能布局表示,与最终用于格式化的纸张宽度无关。这可以作为另一个文档的一部分包括,和/或由 prettypr 模块中的函数直接进一步处理,或者在 hook 函数中使用(有关详细信息,请参阅 format/2)。

另请参阅:prettypr, format/2, layout/1

链接到此函数

set_ctxt_hook(Ctxt, Hook)

查看源代码
-spec set_ctxt_hook(context(), hook()) -> context().

更新漂亮打印上下文的 hook 函数字段。

另请参阅:get_ctxt_hook/1

链接到此函数

set_ctxt_linewidth(Ctxt, W)

查看源代码
-spec set_ctxt_linewidth(context(), integer()) -> context().

更新漂亮打印上下文的行宽字段。

注意

更改此值(并将结果上下文传递给延续函数)不会影响正常格式,但可能会影响 hook 函数中用户定义的行为。

另请参阅:get_ctxt_linewidth/1

链接到此函数

set_ctxt_paperwidth(Ctxt, W)

查看源代码
-spec set_ctxt_paperwidth(context(), integer()) -> context().

更新漂亮打印上下文的纸张宽度字段。

注意

更改此值(并将结果上下文传递给延续函数)不会影响正常格式,但可能会影响 hook 函数中用户定义的行为。

另请参阅:get_ctxt_paperwidth/1

链接到此函数

set_ctxt_precedence(Ctxt, Prec)

查看源代码
-spec set_ctxt_precedence(context(), integer()) -> context().

更新漂亮打印上下文的操作符优先级字段。

有关运算符优先级,请参阅 //stdlib/erl_parse 模块。

另请参阅://stdlib/erl_parse, get_ctxt_precedence/1

链接到此函数

set_ctxt_user(Ctxt, X)

查看源代码
-spec set_ctxt_user(context(), term()) -> context().

更新漂亮打印上下文的用户数据字段。

另请参阅:get_ctxt_user/1