Provided by: erlang-manpages_20.2.2+dfsg-1ubuntu2_all bug

NAME

       erl_syntax_lib - Support library for abstract Erlang syntax trees.

DESCRIPTION

       Support library for abstract Erlang syntax trees.

       This  module  contains  utility  functions  for working with the abstract data type defined in the module
       erl_syntax.

DATA TYPES

         info_pair() = {key(), term()}:

         key() = attributes | errors | exports | functions | imports | module | records | warnings:

         ordset(T) = ordsets:ordset(T):

         set(T) = sets:set(T):

         syntaxTree() = erl_syntax:syntaxTree():

           An abstract syntax tree. See the erl_syntax module for details.

EXPORTS

       analyze_application(Node::syntaxTree()) -> FunctionName | Arity

              Types:

                 FunctionName = {atom(), Arity} | {ModuleName, FunctionName}
                 Arity = integer()
                 ModuleName = atom()

              Returns the name of a called function. The result is a representation of the name of  the  applied
              function   F/A,   if   Node  represents  a  function  application  "<em>F</em>(<em>X_1</em>,  ...,
              <em>X_A</em>)". If the function is not explicitly named (i.e., F is  given  by  some  expression),
              only the arity A is returned.

              The  evaluation  throws  syntax_error  if  Node  does  not  represent  a  well-formed  application
              expression.

              See also: analyze_function_name/1.

       analyze_attribute(Node::syntaxTree()) -> preprocessor | {atom(), atom()}

              Analyzes an attribute node. If Node represents a preprocessor directive, the atom preprocessor  is
              returned.  Otherwise,  if  Node  represents a module attribute "-<em>Name</em>...", a tuple {Name,
              Info} is returned, where Info depends on Name, as follows:

                {module, Info}:
                  where Info = analyze_module_attribute(Node).

                {export, Info}:
                  where Info = analyze_export_attribute(Node).

                {import, Info}:
                  where Info = analyze_import_attribute(Node).

                {file, Info}:
                  where Info = analyze_file_attribute(Node).

                {record, Info}:
                  where Info = analyze_record_attribute(Node).

                {Name, Info}:
                  where {Name, Info} = analyze_wild_attribute(Node).

              The evaluation throws syntax_error if Node does not represent a well-formed module attribute.

              See  also:   analyze_export_attribute/1,   analyze_file_attribute/1,   analyze_import_attribute/1,
              analyze_module_attribute/1, analyze_record_attribute/1, analyze_wild_attribute/1.

       analyze_export_attribute(Node::syntaxTree()) -> [FunctionName]

              Types:

                 FunctionName = atom() | {atom(), integer()} | {ModuleName, FunctionName}
                 ModuleName = atom()

              Returns  the list of function names declared by an export attribute. We do not guarantee that each
              name occurs at most once in the list. The order of listing is not defined.

              The evaluation throws syntax_error if Node does not represent a well-formed export attribute.

              See also: analyze_attribute/1.

       analyze_file_attribute(Node::syntaxTree()) -> {string(), integer()}

              Returns the file name and line number of a file attribute. The result is the pair {File, Line}  if
              Node represents "-file(File, Line).".

              The evaluation throws syntax_error if Node does not represent a well-formed file attribute.

              See also: analyze_attribute/1.

       analyze_form(Node::syntaxTree()) -> {atom(), term()} | atom()

              Analyzes  a  "source  code  form"  node.  If Node is a "form" type (cf. erl_syntax:is_form/1), the
              returned value is a tuple {Type, Info} where Type is the node type and Info depends  on  Type,  as
              follows:

                {attribute, Info}:
                  where Info = analyze_attribute(Node).

                {error_marker, Info}:
                  where Info = erl_syntax:error_marker_info(Node).

                {function, Info}:
                  where Info = analyze_function(Node).

                {warning_marker, Info}:
                  where Info = erl_syntax:warning_marker_info(Node).

              For other types of forms, only the node type is returned.

              The evaluation throws syntax_error if Node is not well-formed.

              See     also:     analyze_attribute/1,     analyze_function/1,     erl_syntax:error_marker_info/1,
              erl_syntax:is_form/1, erl_syntax:warning_marker_info/1.

       analyze_forms(Forms) -> [{Key, term()}]

              Types:

                 Forms = syntaxTree() | [syntaxTree()]
                 Key = attributes | errors | exports | functions | imports | module | records | warnings

              Analyzes a sequence of "program forms". The given Forms may  be  a  single  syntax  tree  of  type
              form_list,  or  a list of "program form" syntax trees. The returned value is a list of pairs {Key,
              Info}, where each value of Key occurs at most once in the list; the absence of  a  particular  key
              indicates that there is no well-defined value for that key.

              Each  entry  in  the  resulting  list  contains  the following corresponding information about the
              program forms:

                {attributes, Attributes}:

                  * Attributes = [{atom(), term()}]

                  Attributes is a list of pairs representing the names and corresponding values of all so-called
                  "wild" attributes (as e.g. "-compile(...)") occurring in Forms (cf. analyze_wild_attribute/1).
                  We do not guarantee that each name occurs at most once in the list. The order  of  listing  is
                  not defined.

                {errors, Errors}:

                  * Errors = [term()]

                  Errors  is  the  list  of error descriptors of all error_marker nodes that occur in Forms. The
                  order of listing is not defined.

                {exports, Exports}:

                  * Exports = [FunctionName]

                  * FunctionName = atom() | {atom(), integer()} | {ModuleName, FunctionName}

                  * ModuleName = atom()

                  Exports is a list of representations of  those  function  names  that  are  listed  by  export
                  declaration  attributes  in  Forms  (cf. analyze_export_attribute/1). We do not guarantee that
                  each name occurs at most once in the list. The order of listing is not defined.

                {functions, Functions}:

                  * Functions = [{atom(), integer()}]

                  Functions is  a  list  of  the  names  of  the  functions  that  are  defined  in  Forms  (cf.
                  analyze_function/1).  We  do not guarantee that each name occurs at most once in the list. The
                  order of listing is not defined.

                {imports, Imports}:

                  * Imports = [{Module, Names}]

                  * Module = atom()

                  * Names = [FunctionName]

                  * FunctionName = atom() | {atom(), integer()} | {ModuleName, FunctionName}

                  * ModuleName = atom()

                  Imports is a list of pairs representing those module names and  corresponding  function  names
                  that  are  listed  by import declaration attributes in Forms (cf. analyze_import_attribute/1),
                  where each Module occurs at most once in Imports. We do not guarantee that each name occurs at
                  most once in the lists of function names. The order of listing is not defined.

                {module, ModuleName}:

                  * ModuleName = atom()

                  ModuleName  is  the name declared by a module attribute in Forms. If no module name is defined
                  in Forms, the result will contain no entry  for  the  module  key.  If  multiple  module  name
                  declarations should occur, all but the first will be ignored.

                {records, Records}:

                  * Records = [{atom(), Fields}]

                  * Fields = [{atom(), {Default, Type}}]

                  * Default = none | syntaxTree()

                  * Type = none | syntaxTree()

                  Records  is a list of pairs representing the names and corresponding field declarations of all
                  record declaration attributes occurring in Forms. For fields declared without a default value,
                  the corresponding value for Default is the atom none. Similarly, for fields declared without a
                  type, the corresponding value for Type is the atom none (cf.  analyze_record_attribute/1).  We
                  do  not  guarantee that each record name occurs at most once in the list. The order of listing
                  is not defined.

                {warnings, Warnings}:

                  * Warnings = [term()]

                  Warnings is the list of error descriptors of all warning_marker nodes that occur in Forms. The
                  order of listing is not defined.

              The evaluation throws syntax_error if an ill-formed Erlang construct is encountered.

              See     also:    analyze_export_attribute/1,    analyze_function/1,    analyze_import_attribute/1,
              analyze_record_attribute/1,       analyze_wild_attribute/1,        erl_syntax:error_marker_info/1,
              erl_syntax:warning_marker_info/1.

       analyze_function(Node::syntaxTree()) -> {atom(), integer()}

              Returns  the  name  and  arity  of  a  function definition. The result is a pair {Name, A} if Node
              represents a function definition "Name(<em>P_1</em>, ..., <em>P_A</em>) -> ...".

              The evaluation throws syntax_error if Node does not represent a well-formed function definition.

       analyze_function_name(Node::syntaxTree()) -> FunctionName

              Types:

                 FunctionName = atom() | {atom(), integer()} | {ModuleName, FunctionName}
                 ModuleName = atom()

              Returns the function name represented by a syntax tree. If Node represents a function  name,  such
              as  "foo/1"  or  "bloggs:fred/2",  a  uniform  representation  of that name is returned. Different
              nestings of arity and module name qualifiers in the syntax tree does not affect the result.

              The evaluation throws syntax_error if Node does not represent a well-formed function name.

       analyze_implicit_fun(Node::syntaxTree()) -> FunctionName

              Types:

                 FunctionName = atom() | {atom(), integer()} | {ModuleName, FunctionName}
                 ModuleName = atom()

              Returns the name of an implicit fun expression "fun <em>F</em>". The result is a representation of
              the function name F. (Cf. analyze_function_name/1.)

              The evaluation throws syntax_error if Node does not represent a well-formed implicit fun.

              See also: analyze_function_name/1.

       analyze_import_attribute(Node::syntaxTree()) -> {atom(), [FunctionName]} | atom()

              Types:

                 FunctionName = atom() | {atom(), integer()} | {ModuleName, FunctionName}
                 ModuleName = atom()

              Returns  the  module name and (if present) list of function names declared by an import attribute.
              The returned value is an atom Module or a pair {Module, Names}, where Names is a list of  function
              names  declared  as  imported  from the module named by Module. We do not guarantee that each name
              occurs at most once in Names. The order of listing is not defined.

              The evaluation throws syntax_error if Node does not represent a well-formed import attribute.

              See also: analyze_attribute/1.

       analyze_module_attribute(Node::syntaxTree()) -> Name::atom() | {Name::atom(), Variables::[atom()]}

              Returns the module name and possible parameters declared by a module attribute. If  the  attribute
              is  a  plain  module  declaration  such  as  -module(name),  the result is the module name. If the
              attribute is a parameterized module declaration, the result is a tuple containing the module  name
              and a list of the parameter variable names.

              The evaluation throws syntax_error if Node does not represent a well-formed module attribute.

              See also: analyze_attribute/1.

       analyze_record_attribute(Node::syntaxTree()) -> {atom(), Fields}

              Types:

                 Fields = [{atom(), {Default, Type}}]
                 Default = none | syntaxTree()
                 Type = none | syntaxTree()

              Returns  the  name  and the list of fields of a record declaration attribute. The result is a pair
              {Name, Fields}, if Node represents "-record(Name, {...}).",  where  Fields  is  a  list  of  pairs
              {Label,   {Default,  Type}}  for  each  field  "Label",  "Label  =  <em>Default</em>",  "Label  ::
              <em>Type</em>", or "Label = <em>Default</em> :: <em>Type</em>" in the declaration, listed in left-
              to-right  order.  If the field has no default-value declaration, the value for Default will be the
              atom none. If the field has no type declaration, the value for Type will be the atom none.  We  do
              not guarantee that each label occurs at most once in the list.

              The  evaluation  throws  syntax_error  if Node does not represent a well-formed record declaration
              attribute.

              See also: analyze_attribute/1, analyze_record_field/1.

       analyze_record_expr(Node::syntaxTree()) -> {atom(), Info} | atom()

              Types:

                 Info = {atom(), [{atom(), Value}]} | {atom(), atom()} | atom()
                 Value = syntaxTree()

              Returns the record name and field name/names of a record expression. If Node has type record_expr,
              record_index_expr  or  record_access,  a  pair {Type, Info} is returned, otherwise an atom Type is
              returned. Type is the node type of Node, and Info depends on Type, as follows:

                record_expr::
                  {atom(), [{atom(), Value}]}

                record_access::
                  {atom(), atom()}

                record_index_expr::
                  {atom(), atom()}

              For a record_expr node, Info represents the record name  and  the  list  of  descriptors  for  the
              involved  fields, listed in the order they appear. A field descriptor is a pair {Label, Value}, if
              Node represents "Label = <em>Value</em>". For a record_access node,  Info  represents  the  record
              name  and  the  field  name. For a record_index_expr node, Info represents the record name and the
              name field name.

              The evaluation throws syntax_error if Node represents a record expression that is not well-formed.

              See also: analyze_record_attribute/1, analyze_record_field/1.

       analyze_record_field(Node::syntaxTree()) -> {atom(), {Default, Type}}

              Types:

                 Default = none | syntaxTree()
                 Type = none | syntaxTree()

              Returns the label, value-expression, and type of a record field specifier. The result  is  a  pair
              {Label,  {Default,  Type}},  if  Node  represents  "Label",  "Label = <em>Default</em>", "Label ::
              <em>Type</em>", or "Label = <em>Default</em>  ::  <em>Type</em>".  If  the  field  has  no  value-
              expression,  the  value for Default will be the atom none. If the field has no type, the value for
              Type will be the atom none.

              The evaluation throws  syntax_error  if  Node  does  not  represent  a  well-formed  record  field
              specifier.

              See also: analyze_record_attribute/1, analyze_record_expr/1.

       analyze_type_application(Node::syntaxTree()) -> TypeName

              Types:

                 TypeName = {atom(), integer()} | {ModuleName, {atom(), integer()}}
                 ModuleName = atom()

              Returns  the  name  of  a  used  type. The result is a representation of the name of the used pre-
              defined  or  local  type   N/A,   if   Node   represents   a   local   (user)   type   application
              "<em>N</em>(<em>T_1</em>,  ..., <em>T_A</em>)", or a representation of the name of the used remote
              type M:N/A if Node represents a remote user type application  "<em>M</em>:<em>N</em>(<em>T_1</em>,
              ..., <em>T_A</em>)".

              The  evaluation  throws  syntax_error  if  Node  does  not  represent  a  well-formed  (user) type
              application expression.

              See also: analyze_type_name/1.

       analyze_type_name(Node::syntaxTree()) -> TypeName

              Types:

                 TypeName = atom() | {atom(), integer()} | {ModuleName, {atom(), integer()}}
                 ModuleName = atom()

              Returns the type name represented by a syntax tree. If  Node  represents  a  type  name,  such  as
              "foo/1" or "bloggs:fred/2", a uniform representation of that name is returned.

              The evaluation throws syntax_error if Node does not represent a well-formed type name.

       analyze_wild_attribute(Node::syntaxTree()) -> {atom(), term()}

              Returns  the  name  and value of a "wild" attribute. The result is the pair {Name, Value}, if Node
              represents "-Name(Value)".

              Note that no checking is done whether Name is a reserved attribute name such as module or  export:
              it is assumed that the attribute is "wild".

              The evaluation throws syntax_error if Node does not represent a well-formed wild attribute.

              See also: analyze_attribute/1.

       annotate_bindings(Tree::syntaxTree()) -> syntaxTree()

              Adds  or  updates  annotations  on  nodes  in a syntax tree. Equivalent to annotate_bindings(Tree,
              Bindings) where the top-level environment Bindings is taken from the annotation {env, Bindings} on
              the root node of Tree. An exception is thrown if no such annotation should exist.

              See also: annotate_bindings/2.

       annotate_bindings(Tree::syntaxTree(), Bindings::ordset(atom())) -> syntaxTree()

              Adds  or  updates  annotations  on  nodes  in  a  syntax tree. Bindings specifies the set of bound
              variables in the environment of the top level node. The following annotations are affected:

                * {env, Vars}, representing the input environment of the subtree.

                * {bound, Vars}, representing the variables that are bound in the subtree.

                * {free, Vars}, representing the free variables in the subtree.

              Bindings and Vars are ordered-set lists (cf. module ordsets) of atoms representing variable names.

              See also: ordsets(3erl), annotate_bindings/1.

       fold(F::Function, Start::term(), Tree::syntaxTree()) -> term()

              Types:

                 Function = (syntaxTree(), term()) -> term()

              Folds a function over all nodes of a  syntax  tree.  The  result  is  the  value  of  Function(X1,
              Function(X2,  ...  Function(Xn,  Start) ... )), where [X1, X2, ..., Xn] are the nodes of Tree in a
              post-order traversal.

              See also: fold_subtrees/3, foldl_listlist/3.

       fold_subtrees(F::Function, Start::term(), Tree::syntaxTree()) -> term()

              Types:

                 Function = (syntaxTree(), term()) -> term()

              Folds a function over the immediate subtrees of a syntax tree. This is similar to fold/3, but only
              on  the  immediate  subtrees of Tree, in left-to-right order; it does not include the root node of
              Tree.

              See also: fold/3.

       foldl_listlist(F::Function, Start::term(), Ls::[[term()]]) -> term()

              Types:

                 Function = (term(), term()) -> term()

              Like lists:foldl/3, but over a list of lists.

              See also: lists:foldl/3, fold/3.

       function_name_expansions(Names::[Name]) -> [{ShortName, Name}]

              Types:

                 Name = ShortName | {atom(), Name}
                 ShortName = atom() | {atom(), integer()}

              Creates a mapping from corresponding short names to full function names. Names are represented  by
              nested tuples of atoms and integers (cf. analyze_function_name/1). The result is a list containing
              a pair {ShortName, Name} for each  element  Name  in  the  given  list,  where  the  corresponding
              ShortName  is the rightmost-innermost part of Name. The list thus represents a finite mapping from
              unqualified names to the corresponding qualified names.

              Note: the resulting list can contain more than one tuple {ShortName, Name} for the same ShortName,
              possibly with different values for Name, depending on the given list.

              See also: analyze_function_name/1.

       is_fail_expr(Tree::syntaxTree()) -> boolean()

              Returns  true  if  Tree  represents  an  expression which never terminates normally. Note that the
              reverse does not apply. Currently, the detected cases are calls to exit/1, throw/1, erlang:error/1
              and erlang:error/2.

              See also: erlang:error/1, erlang:error/2, erlang:exit/1, erlang:throw/1.

       limit(Tree, Depth) -> syntaxTree()

              Equivalent to limit(Tree, Depth, Text) using the text "..." as default replacement.

              See also: limit/3, erl_syntax:text/1.

       limit(Tree::syntaxTree(), Depth::integer(), Node::syntaxTree()) -> syntaxTree()

              Limits  a  syntax  tree  to a specified depth. Replaces all non-leaf subtrees in Tree at the given
              Depth by Node. If Depth is negative, the result is always Node, even if Tree has no subtrees.

              When a group of subtrees (as e.g., the argument list of an application node) is at  the  specified
              depth,  and  there  are  two or more subtrees in the group, these will be collectively replaced by
              Node even if they are leaf nodes. Groups of subtrees that are above the specified  depth  will  be
              limited  in size, as if each subsequent tree in the group were one level deeper than the previous.
              E.g., if Tree represents a list of integers "[1, 2, 3, 4, 5, 6, 7,  8,  9,  10]",  the  result  of
              limit(Tree, 5) will represent [1, 2, 3, 4, ...].

              The  resulting  syntax  tree  is  typically  only  useful  for  pretty-printing  or similar visual
              formatting.

              See also: limit/2.

       map(F::Function, Tree::syntaxTree()) -> syntaxTree()

              Types:

                 Function = (syntaxTree()) -> syntaxTree()

              Applies a function to each node of a syntax tree. The result  of  each  application  replaces  the
              corresponding original node. The order of traversal is bottom-up.

              See also: map_subtrees/2.

       map_subtrees(F::Function, Tree::syntaxTree()) -> syntaxTree()

              Types:

                 Function = (Tree) -> Tree1

              Applies  a  function  to  each  immediate subtree of a syntax tree. The result of each application
              replaces the corresponding original node.

              See also: map/2.

       mapfold(F::Function, Start::term(), Tree::syntaxTree()) -> {syntaxTree(), term()}

              Types:

                 Function = (syntaxTree(), term()) -> {syntaxTree(), term()}

              Combines map and fold in a single operation. This is similar to  map/2,  but  also  propagates  an
              extra  value from each application of the Function to the next, while doing a post-order traversal
              of the tree like fold/3. The value Start is passed to the  first  function  application,  and  the
              final result is the result of the last application.

              See also: fold/3, map/2.

       mapfold_subtrees(F::Function, Start::term(), Tree::syntaxTree()) -> {syntaxTree(), term()}

              Types:

                 Function = (syntaxTree(), term()) -> {syntaxTree(), term()}

              Does  a  mapfold  operation  over  the  immediate  subtrees  of  a syntax tree. This is similar to
              mapfold/3, but only on the immediate subtrees of Tree, in left-to-right order; it does not include
              the root node of Tree.

              See also: mapfold/3.

       mapfoldl_listlist(F::Function, S::State, Ls::[[term()]]) -> {[[term()]], term()}

              Types:

                 Function = (term(), term()) -> {term(), term()}

              Like  lists:mapfoldl/3,  but  over  a  list of lists. The list of lists in the result has the same
              structure as the given list of lists.

       new_variable_name(Used::set(atom())) -> atom()

              Returns  an  atom  which  is  not   already   in   the   set   Used.   This   is   equivalent   to
              new_variable_name(Function,  Used),  where  Function maps a given integer N to the atom whose name
              consists of "V" followed by the numeral for N.

              See also: new_variable_name/2.

       new_variable_name(F::Function, Used::set(atom())) -> atom()

              Types:

                 Function = (integer()) -> atom()

              Returns a user-named atom which is not already in the set Used. The atom is generated by  applying
              the  given  Function to a generated integer. Integers are generated using an algorithm which tries
              to keep the names randomly distributed within a reasonably small range relative to the  number  of
              elements in the set.

              This  function  uses  the module rand to generate new keys. The seed it uses may be initialized by
              calling rand:seed/1 or rand:seed/2 before this function is first called.

              See also: random(3erl), sets(3erl), new_variable_name/1.

       new_variable_names(N::integer(), Used::set(atom())) -> [atom()]

              Like new_variable_name/1, but generates a list of N new names.

              See also: new_variable_name/1.

       new_variable_names(N::integer(), F::Function, Used::set(atom())) -> [atom()]

              Types:

                 Function = (integer()) -> atom()

              Like new_variable_name/2, but generates a list of N new names.

              See also: new_variable_name/2.

       strip_comments(Tree::syntaxTree()) -> syntaxTree()

              Removes all comments from all nodes of a syntax tree.  All  other  attributes  (such  as  position
              information) remain unchanged. Standalone comments in form lists are removed; any other standalone
              comments are changed into null-comments (no text, no indentation).

       to_comment(Tree) -> syntaxTree()

              Equivalent to to_comment(Tree, "% ").

       to_comment(Tree::syntaxTree(), Prefix::string()) -> syntaxTree()

              Equivalent to to_comment(Tree, Prefix, F) for a default  formatting  function  F.  The  default  F
              simply calls erl_prettypr:format/1.

              See also: to_comment/3, erl_prettypr:format/1.

       to_comment(Tree::syntaxTree(), Prefix::string(), F::Printer) -> syntaxTree()

              Types:

                 Printer = (syntaxTree()) -> string()

              Transforms  a  syntax tree into an abstract comment. The lines of the comment contain the text for
              Node, as produced by the given Printer function. Each line of  the  comment  is  prefixed  by  the
              string Prefix (this does not include the initial "%" character of the comment line).

              For example, the result of to_comment(erl_syntax:abstract([a,b,c])) represents

                        %% [a,b,c]

              (cf. to_comment/1).

              Note:  the  text  returned  by  the  formatting function will be split automatically into separate
              comment lines at each line break. No extra work is needed.

              See also: to_comment/1, to_comment/2.

       variables(Tree::syntaxTree()) -> set(atom())

              Returns the names of variables occurring in a syntax tree, The result is a set of  variable  names
              represented by atoms. Macro names are not included.

              See also: sets(3erl).

AUTHORS

       Richard Carlsson <carlsson.richard@gmail.com>

                                               syntax_tools 2.1.4                           erl_syntax_lib(3erl)