code: def getstatementrange_ast(
      lineno, source, assertion=False, astnode=None
  ):
      if astnode is None:
          content = str(source)
          # See #4260:
          # don't produce duplicate warnings when compiling source to find ast
          with warnings.catch_warnings():
              warnings.simplefilter("ignore")
              astnode = compile(content, "source", "exec", _AST_FLAG)
  
      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 absolute_import
  from __future__ import division
  from __future__ import print_function
  import ast
  import inspect
  import linecache
  import sys
  import textwrap
  import tokenize
  import warnings
  from ast import PyCF_ONLY_AST
  from bisect import bisect_right
  import py
  import six
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