class_docstr: AST Visitor that processes function calls.
  
  Updates function calls from old API version to new API version using a given
  change spec.
class_docstr_tok: ["AST","Visitor","that","processes","function","calls",".","Updates","function","calls","from","old","API","version","to","new","API","version","using","a","given","change","spec","."]
docstr: Handle bare Attributes i.e. [tf.foo, tf.bar].
docstr_tok: ["Handle","bare","Attributes","i.e",".","[","tf.foo",",","tf.bar","]","."]
code: def visit_Attribute(self, node):  # pylint: disable=invalid-name
      """Handle bare Attributes i.e. [tf.foo, tf.bar]."""
      assert self._stack[-1] is node
  
      full_name = self._get_full_name(node)
      if full_name:
          parent = self._stack[-2]
  
          # Make sure the warning comes first, otherwise the name may have changed
          self._maybe_add_warning(node, full_name)
  
          # Once we did a modification, node is invalid and not worth inspecting
          # further. Also, we only perform modifications for simple nodes, so
          # There'd be no point in descending further.
          if self._maybe_rename(parent, node, full_name):
              return
          if self._maybe_change_to_function_call(
              parent, node, full_name
          ):
              return
  
          # The isinstance check is enough -- a bare Attribute is never root.
          i = 2
          while isinstance(self._stack[-i], ast.Attribute):
              i += 1
          whole_name = pasta.dump(self._stack[-(i - 1)])
  
          self._maybe_add_module_deprecation_warning(
              node, full_name, whole_name
          )
  
      self.generic_visit(node)
  
imports: import ast
  import collections
  import os
  import re
  import shutil
  import sys
  import tempfile
  import traceback
  import pasta
label_desc: Use image node_id 21 for calling the _PastaEditVisitor obj's underlying member method code with example usage: obj.visit_Attribute(node) without return types