docs: def attach_identifier_attributes(self, ast):  # type: (Dict[str, Any]) -> Dict[str, Any]
          """ Attach 5 flags to the AST.
  
          - is dynamic: True if the identifier name can be determined by static analysis.
          - is member: True if the identifier is a member of a subscription/dot/slice node.
          - is declaring: True if the identifier is used to declare.
          - is autoload: True if the identifier is declared with autoload.
          - is function: True if the identifier is a function. Vim distinguish
              between function identifiers and variable identifiers.
          - is declarative parameter: True if the identifier is a declarative
              parameter. For example, the identifier "param" in Func(param) is a
              declarative parameter.
          - is on string expression context: True if the variable is on the
              string expression context. The string expression context is the
              string content on the 2nd argument of the map or filter function.
          - is lambda argument: True if the identifier is a lambda argument.
          """
          redir_assignment_parser = RedirAssignmentParser()
          ast_with_parsed_redir = redir_assignment_parser.process(ast)
  
          map_and_filter_parser = CallNodeParser()
          ast_with_parse_map_and_filter_and_redir = \
              map_and_filter_parser.process(ast_with_parsed_redir)
  
          traverse(
              ast_with_parse_map_and_filter_and_redir,
              on_enter=lambda node: self._enter_handler(
                  node,
                  is_on_lambda_str=None,
                  is_on_lambda_body=None,
              )
          )
          return ast