查看源代码 erl_prettypr (syntax_tools v3.2.1)
抽象 Erlang 语法树的漂亮打印。
此模块是漂亮打印库模块 prettypr
的前端,用于格式化由模块 erl_syntax
定义的抽象语法树的文本。
概要
函数
等效于 best(Tree, [])
。
为语法树创建一个固定的“最佳”抽象布局。
将抽象 Erlang 语法树漂亮打印格式化为文本。
返回漂亮打印上下文的 hook 函数字段。
返回漂亮打印上下文的行宽字段。
返回漂亮打印上下文的纸张宽度字段。
返回漂亮打印上下文的操作符优先级字段。
返回漂亮打印上下文的用户数据字段。
为语法树创建抽象文档布局。
更新漂亮打印上下文的 hook 函数字段。
更新漂亮打印上下文的行宽字段。
更新漂亮打印上下文的纸张宽度字段。
更新漂亮打印上下文的操作符优先级字段。
更新漂亮打印上下文的用户数据字段。
类型
-type clause_t() :: case_expr | fun_expr | if_expr | maybe_expr | receive_expr | try_expr | {function, prettypr:document()} | spec.
-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()).
-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/1
和 set_ctxt_user/2
等函数检查和操作上下文。hook 必须返回一个“文档”数据结构(参见 layout/2
和 best/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
。
返回漂亮打印上下文的 hook 函数字段。
另请参阅:set_ctxt_hook/2
。
返回漂亮打印上下文的行宽字段。
另请参阅:set_ctxt_linewidth/2
。
返回漂亮打印上下文的纸张宽度字段。
另请参阅:set_ctxt_paperwidth/2
。
返回漂亮打印上下文的操作符优先级字段。
另请参阅:set_ctxt_precedence/2
。
返回漂亮打印上下文的用户数据字段。
另请参阅:set_ctxt_user/2
。
-spec layout(syntaxTree()) -> prettypr:document().
等效于 layout(Tree, [])
。
-spec layout(syntaxTree(), [term()]) -> prettypr:document().
为语法树创建抽象文档布局。
结果表示一组可能的布局(参见模块 prettypr
)。有关选项的信息,请参阅 format/2
;但是,请注意此函数会忽略 paper
和 ribbon
选项。
此函数提供了一个漂亮打印机的低级接口,返回一个灵活的可能布局表示,与最终用于格式化的纸张宽度无关。这可以作为另一个文档的一部分包括,和/或由 prettypr
模块中的函数直接进一步处理,或者在 hook 函数中使用(有关详细信息,请参阅 format/2
)。
更新漂亮打印上下文的 hook 函数字段。
另请参阅:get_ctxt_hook/1
。
更新漂亮打印上下文的行宽字段。
注意
更改此值(并将结果上下文传递给延续函数)不会影响正常格式,但可能会影响 hook 函数中用户定义的行为。
另请参阅:get_ctxt_linewidth/1
。
更新漂亮打印上下文的纸张宽度字段。
注意
更改此值(并将结果上下文传递给延续函数)不会影响正常格式,但可能会影响 hook 函数中用户定义的行为。
另请参阅:get_ctxt_paperwidth/1
。
更新漂亮打印上下文的操作符优先级字段。
有关运算符优先级,请参阅 //stdlib/erl_parse
模块。
更新漂亮打印上下文的用户数据字段。
另请参阅:get_ctxt_user/1
。