class_docstr: Adds Return statement when they are implicit,
  and adds the None return value when not set
  
  >>> import gast as ast
  >>> from pythran import passmanager, backend
  >>> node = ast.parse("def foo(y): print(y)")
  >>> pm = passmanager.PassManager("test")
  >>> _, node = pm.apply(NormalizeReturn, node)
  >>> print(pm.dump(backend.Python, node))
  def foo(y):
      print(y)
      return builtins.None
code: def visit_FunctionDef(self, node):
      self.yield_points = self.gather(YieldPoints, node)
      for stmt in node.body:
          self.visit(stmt)
      # Look for nodes that have no successors; the predecessors of
      # the special NIL node are those AST nodes that end control flow
      # without a return statement.
      for n in self.cfg.predecessors(CFG.NIL):
          if not isinstance(n, (ast.Return, ast.Raise)):
              self.update = True
              if self.yield_points:
                  node.body.append(ast.Return(None))
              else:
                  none = ast.Attribute(
                      ast.Name("builtins", ast.Load(), None, None),
                      "None",
                      ast.Load(),
                  )
                  node.body.append(ast.Return(none))
              break
  
      return node
  
file_path: pythran/pythran/transformations/normalize_return.py
imports: from pythran.analyses import CFG, YieldPoints
  from pythran.passmanager import Transformation
  import gast
label_desc: Use image node_id 2 for calling the NormalizeReturn obj's underlying member method code with example usage: obj.visit_FunctionDef(node) and returns: node