def source_line(self, lineno):
line_begins = self._extract_line_begins()<EOL>lineno = lineno - self.first_line<EOL>if lineno >= <NUM_LIT:0> and lineno + <NUM_LIT:1> < len(line_begins):<EOL><INDENT>first, last = line_begins[lineno:lineno + <NUM_LIT:2>]<EOL>return self.source[first:last]<EOL><DEDENT>elif lineno >= <NUM_LIT:0> and lineno < len(line_begins):<EOL><INDENT>return self.source[line_begins[-<NUM_LIT:1>]:]<EOL><DEDENT>else:<EOL><INDENT>raise IndexError<EOL><DEDENT>
Returns line ``lineno`` from source, taking ``first_line`` into account,
or raises :exc:`IndexError` if ``lineno`` is out of range.