parameters: (self, node)
return_statement: return node.lineno, node.col_offset
docstring: Return correct line number and column offset for a given node.
  
      This is necessary mainly because ListComp's location reporting reports
      the next token after the list comprehension list opening.
  
      Args:
        node: Node for which we wish to know the lineno and col_offset
docstring_summary: Return correct line number and column offset for a given node.
docstring_tokens: Return correct line number and column offset for a given node .
function: def _find_true_position(self, node):
      """Return correct line number and column offset for a given node.
  
      This is necessary mainly because ListComp's location reporting reports
      the next token after the list comprehension list opening.
  
      Args:
        node: Node for which we wish to know the lineno and col_offset
      """
      import re
      find_open = re.compile("^\s*(\\[).*$")
      find_string_chars = re.compile("['\"]")
  
      if isinstance(node, ast.ListComp):
        # Strangely, ast.ListComp returns the col_offset of the first token
        # after the '[' token which appears to be a bug. Workaround by
        # explicitly finding the real start of the list comprehension.
        line = node.lineno
        col = node.col_offset
        # loop over lines
        while 1:
          # Reverse the text to and regular expression search for whitespace
          text = self._lines[line-1]
          reversed_preceding_text = text[:col][::-1]
          # First find if a [ can be found with only whitespace between it and
          # col.
          m = find_open.match(reversed_preceding_text)
          if m:
            new_col_offset = col - m.start(1) - 1
            return line, new_col_offset
          else:
            if (reversed_preceding_text=="" or
               reversed_preceding_text.isspace()):
              line = line - 1
              prev_line = self._lines[line - 1]
              # TODO(aselle):
              # this is poor comment detection, but it is good enough for
              # cases where the comment does not contain string literal starting/
              # ending characters. If ast gave us start and end locations of the
              # ast nodes rather than just start, we could use string literal
              # node ranges to filter out spurious #'s that appear in string
              # literals.
              comment_start = prev_line.find("#")
              if comment_start ==  -1:
                col = len(prev_line) -1
              elif find_string_chars.search(prev_line[comment_start:]) is None:
                col = comment_start
              else:
                return None, None
            else:
              return None, None
      # Most other nodes return proper locations (with notably does not), but
      # it is not possible to use that in an argument.
      return node.lineno, node.col_offset
function_tokens: def _find_true_position ( self , node ) : import re find_open = re . compile ( "^\s*(\\[).*$" ) find_string_chars = re . compile ( "['\"]" ) if isinstance ( node , ast . ListComp ) : # Strangely, ast.ListComp returns the col_offset of the first token # after the '[' token which appears to be a bug. Workaround by # explicitly finding the real start of the list comprehension. line = node . lineno col = node . col_offset # loop over lines while 1 : # Reverse the text to and regular expression search for whitespace text = self . _lines [ line - 1 ] reversed_preceding_text = text [ : col ] [ : : - 1 ] # First find if a [ can be found with only whitespace between it and # col. m = find_open . match ( reversed_preceding_text ) if m : new_col_offset = col - m . start ( 1 ) - 1 return line , new_col_offset else : if ( reversed_preceding_text == "" or reversed_preceding_text . isspace ( ) ) : line = line - 1 prev_line = self . _lines [ line - 1 ] # TODO(aselle): # this is poor comment detection, but it is good enough for # cases where the comment does not contain string literal starting/ # ending characters. If ast gave us start and end locations of the # ast nodes rather than just start, we could use string literal # node ranges to filter out spurious #'s that appear in string # literals. comment_start = prev_line . find ( "#" ) if comment_start == - 1 : col = len ( prev_line ) - 1 elif find_string_chars . search ( prev_line [ comment_start : ] ) is None : col = comment_start else : return None , None else : return None , None # Most other nodes return proper locations (with notably does not), but # it is not possible to use that in an argument. return node . lineno , node . col_offset