code: def test_nested_functions(self):
      def test_fn(a, b):
          a = []
          if b:
              a = []
  
              def foo():
                  return a
  
              foo()
  
          return a
  
      node = self._parse_and_analyze(test_fn)
      fn_body = node.body
      def_of_a_in_if = fn_body[1].body[0].targets[0]
  
      self.assertHasDefs(fn_body[0].targets[0], 1)
      self.assertHasDefs(fn_body[1].test, 1)
      self.assertHasDefs(def_of_a_in_if, 1)
      self.assertHasDefs(fn_body[2].value, 2)
  
      inner_fn_body = fn_body[1].body[1].body
      def_of_a_in_foo = inner_fn_body[0].value
      # Even though `a` is visible in the inner functio above, the late binding
      # makes it impossible to assume that the same value will be visible at
      # call time.
      self.assertHasDefs(def_of_a_in_foo, 0)
  
imports: from tensorflow.python.autograph.pyct import anno
  from tensorflow.python.autograph.pyct import cfg
  from tensorflow.python.autograph.pyct import naming
  from tensorflow.python.autograph.pyct import parser
  from tensorflow.python.autograph.pyct import qual_names
  from tensorflow.python.autograph.pyct import transformer
  from tensorflow.python.autograph.pyct.static_analysis import activity
  from tensorflow.python.autograph.pyct.static_analysis import reaching_definitions
  from tensorflow.python.platform import test
label_desc: Use image node_id 8 for calling the ReachingDefinitionsAnalyzerTest obj's underlying member method code with example usage: obj.test_nested_functions() and returns: a, a