code: def getstatementrange_ast(
      lineno, source, assertion=False, astnode=None
  ):
      if astnode is None:
          content = str(source)
          try:
              astnode = compile(
                  content, "source", "exec", 1024
              )  # 1024 for AST
          except ValueError:
              start, end = getstatementrange_old(
                  lineno, source, assertion
              )
              return None, start, end
      start, end = get_statement_startend2(lineno, astnode)
      # we need to correct the end:
      # - ast-parsing strips comments
      # - there might be empty lines
      # - we might have lesser indented code blocks at the end
      if end is None:
          end = len(source.lines)
  
      if end > start + 1:
          # make sure we don't span differently indented code blocks
          # by using the BlockFinder helper used which inspect.getsource() uses itself
          block_finder = inspect.BlockFinder()
          # if we start with an indented line, put blockfinder to "started" mode
          block_finder.started = source.lines[start][0].isspace()
          it = ((x + "\n") for x in source.lines[start:end])
          try:
              for tok in tokenize.generate_tokens(lambda: next(it)):
                  block_finder.tokeneater(*tok)
          except (inspect.EndOfBlock, IndentationError):
              end = block_finder.last + start
          except Exception:
              pass
  
      # the end might still point to a comment or empty line, correct it
      while end:
          line = source.lines[end - 1].lstrip()
          if line.startswith("#") or not line:
              end -= 1
          else:
              break
      return astnode, start, end
  
imports: from __future__ import generators
  from bisect import bisect_right
  import sys
  import inspect, tokenize
  import py
  from types import ModuleType
label_desc: Use image node_id 7 for calling a global function with example usage: getstatementrange_ast(lineno, source, assertion, astnode) and returns: astnode,  start,  end, None,  start,  end