def decompose_position(self, offset):
line_begins = self._extract_line_begins()<EOL>lineno = bisect.bisect_right(line_begins, offset) - <NUM_LIT:1><EOL>if offset >= <NUM_LIT:0> and offset <= len(self.source):<EOL><INDENT>return lineno + self.first_line, offset - line_begins[lineno]<EOL><DEDENT>else:<EOL><INDENT>raise IndexError<EOL><DEDENT>
Returns a ``line, column`` tuple for a character offset into the source,
orraises :exc:`IndexError` if ``lineno`` is out of range.