Patch #1159931/bug #1143895: inspect.getsource failed when functions,

etc., had comments after the colon, and some other cases. This patch
take a simpler approach that doesn't rely on looking for a ':'. Thanks
Simon Percivall!
This commit is contained in:
Johannes Gijsbers 2005-03-12 16:37:11 +00:00
parent f77d0334f3
commit a5855d5ace
3 changed files with 26 additions and 5 deletions

View File

@ -504,6 +504,7 @@ class BlockFinder:
"""Provide a tokeneater() method to detect the end of a code block.""" """Provide a tokeneater() method to detect the end of a code block."""
def __init__(self): def __init__(self):
self.indent = 0 self.indent = 0
self.islambda = False
self.started = False self.started = False
self.passline = False self.passline = False
self.last = 0 self.last = 0
@ -511,11 +512,8 @@ class BlockFinder:
def tokeneater(self, type, token, (srow, scol), (erow, ecol), line): def tokeneater(self, type, token, (srow, scol), (erow, ecol), line):
if not self.started: if not self.started:
if token in ("def", "class", "lambda"): if token in ("def", "class", "lambda"):
lastcolon = line.rfind(":") if token == "lambda":
if lastcolon: self.islambda = True
oneline = re.search(r"\w", line[lastcolon:])
if oneline and line[-2:] != "\\\n":
raise EndOfBlock, srow
self.started = True self.started = True
self.passline = True self.passline = True
elif type == tokenize.NEWLINE: elif type == tokenize.NEWLINE:
@ -523,6 +521,8 @@ class BlockFinder:
self.last = srow self.last = srow
elif self.passline: elif self.passline:
pass pass
elif self.islambda:
raise EndOfBlock, self.last
elif type == tokenize.INDENT: elif type == tokenize.INDENT:
self.indent = self.indent + 1 self.indent = self.indent + 1
self.passline = True self.passline = True

View File

@ -53,3 +53,14 @@ a = [None,
def setfunc(func): def setfunc(func):
globals()["anonymous"] = func globals()["anonymous"] = func
setfunc(lambda x, y: x*y) setfunc(lambda x, y: x*y)
# line 57
def with_comment(): # hello
world
# line 61
multiline_sig = [
lambda (x,
y): x+y,
None,
]

View File

@ -229,6 +229,15 @@ class TestOneliners(GetSourceBase):
# as argument to another function. # as argument to another function.
self.assertSourceEqual(mod2.anonymous, 55, 55) self.assertSourceEqual(mod2.anonymous, 55, 55)
class TestBuggyCases(GetSourceBase):
fodderFile = mod2
def test_with_comment(self):
self.assertSourceEqual(mod2.with_comment, 58, 59)
def test_multiline_sig(self):
self.assertSourceEqual(mod2.multiline_sig[0], 63, 64)
# Helper for testing classify_class_attrs. # Helper for testing classify_class_attrs.
def attrs_wo_objs(cls): def attrs_wo_objs(cls):
return [t[:3] for t in inspect.classify_class_attrs(cls)] return [t[:3] for t in inspect.classify_class_attrs(cls)]
@ -414,6 +423,7 @@ class TestClassesAndFunctions(unittest.TestCase):
def test_main(): def test_main():
run_unittest(TestDecorators, TestRetrievingSourceCode, TestOneliners, run_unittest(TestDecorators, TestRetrievingSourceCode, TestOneliners,
TestBuggyCases,
TestInterpreterStack, TestClassesAndFunctions, TestPredicates) TestInterpreterStack, TestClassesAndFunctions, TestPredicates)
if __name__ == "__main__": if __name__ == "__main__":