[Python-checkins] bpo-42116: Fix inspect.getsource handling of trailing comments (GH-23630)
miss-islington
webhook-mailer at python.org
Fri Dec 4 15:20:13 EST 2020
https://github.com/python/cpython/commit/3b14f18205b17d1634e21bd7bc48152247590d9f
commit: 3b14f18205b17d1634e21bd7bc48152247590d9f
branch: 3.8
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: miss-islington <31488909+miss-islington at users.noreply.github.com>
date: 2020-12-04T12:20:09-08:00
summary:
bpo-42116: Fix inspect.getsource handling of trailing comments (GH-23630)
(cherry picked from commit 6e1eec71f59c344fb23c7977061dc2c97b77d51b)
Co-authored-by: Irit Katriel <iritkatriel at yahoo.com>
files:
A Misc/NEWS.d/next/Library/2020-12-03-15-42-32.bpo-42116.yIwroP.rst
M Lib/inspect.py
M Lib/test/inspect_fodder.py
M Lib/test/test_inspect.py
diff --git a/Lib/inspect.py b/Lib/inspect.py
index e8ea8c221f828..95144a97b41f2 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -899,6 +899,7 @@ def __init__(self):
self.indecorator = False
self.decoratorhasargs = False
self.last = 1
+ self.body_col0 = None
def tokeneater(self, type, token, srowcol, erowcol, line):
if not self.started and not self.indecorator:
@@ -930,6 +931,8 @@ def tokeneater(self, type, token, srowcol, erowcol, line):
elif self.passline:
pass
elif type == tokenize.INDENT:
+ if self.body_col0 is None and self.started:
+ self.body_col0 = erowcol[1]
self.indent = self.indent + 1
self.passline = True
elif type == tokenize.DEDENT:
@@ -939,6 +942,10 @@ def tokeneater(self, type, token, srowcol, erowcol, line):
# not e.g. for "if: else:" or "try: finally:" blocks)
if self.indent <= 0:
raise EndOfBlock
+ elif type == tokenize.COMMENT:
+ if self.body_col0 is not None and srowcol[1] >= self.body_col0:
+ # Include comments if indented at least as much as the block
+ self.last = srowcol[0]
elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL):
# any other token on the same indentation level end the previous
# block as well, except the pseudo-tokens COMMENT and NL.
diff --git a/Lib/test/inspect_fodder.py b/Lib/test/inspect_fodder.py
index 96a0257bfdf03..e1287a315901c 100644
--- a/Lib/test/inspect_fodder.py
+++ b/Lib/test/inspect_fodder.py
@@ -91,3 +91,25 @@ def as_method_of(self, obj):
custom_method = Callable().as_method_of(42)
del Callable
+
+# line 95
+class WhichComments:
+ # line 97
+ # before f
+ def f(self):
+ # line 100
+ # start f
+ return 1
+ # line 103
+ # end f
+ # line 105
+ # after f
+
+ # before asyncf - line 108
+ async def asyncf(self):
+ # start asyncf
+ return 2
+ # end asyncf
+ # after asyncf - line 113
+ # end of WhichComments - line 114
+ # after WhichComments - line 115
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index ad93f304827fb..39248e7802485 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -392,6 +392,7 @@ def test_getclasses(self):
('ParrotDroppings', mod.ParrotDroppings),
('StupidGit', mod.StupidGit),
('Tit', mod.MalodorousPervert),
+ ('WhichComments', mod.WhichComments),
])
tree = inspect.getclasstree([cls[1] for cls in classes])
self.assertEqual(tree,
@@ -405,7 +406,8 @@ def test_getclasses(self):
[(mod.FesteringGob, (mod.MalodorousPervert,
mod.ParrotDroppings))
]
- ]
+ ],
+ (mod.WhichComments, (object,),)
]
])
tree = inspect.getclasstree([cls[1] for cls in classes], True)
@@ -417,7 +419,8 @@ def test_getclasses(self):
[(mod.FesteringGob, (mod.MalodorousPervert,
mod.ParrotDroppings))
]
- ]
+ ],
+ (mod.WhichComments, (object,),)
]
])
@@ -647,6 +650,18 @@ def test_anonymous(self):
# as argument to another function.
self.assertSourceEqual(mod2.anonymous, 55, 55)
+class TestBlockComments(GetSourceBase):
+ fodderModule = mod
+
+ def test_toplevel_class(self):
+ self.assertSourceEqual(mod.WhichComments, 96, 114)
+
+ def test_class_method(self):
+ self.assertSourceEqual(mod.WhichComments.f, 99, 104)
+
+ def test_class_async_method(self):
+ self.assertSourceEqual(mod.WhichComments.asyncf, 109, 112)
+
class TestBuggyCases(GetSourceBase):
fodderModule = mod2
@@ -3970,8 +3985,8 @@ def test_getsource_reload(self):
def test_main():
run_unittest(
- TestDecorators, TestRetrievingSourceCode, TestOneliners, TestBuggyCases,
- TestInterpreterStack, TestClassesAndFunctions, TestPredicates,
+ TestDecorators, TestRetrievingSourceCode, TestOneliners, TestBlockComments,
+ TestBuggyCases, TestInterpreterStack, TestClassesAndFunctions, TestPredicates,
TestGetcallargsFunctions, TestGetcallargsMethods,
TestGetcallargsUnboundMethods, TestGetattrStatic, TestGetGeneratorState,
TestNoEOL, TestSignatureObject, TestSignatureBind, TestParameterObject,
diff --git a/Misc/NEWS.d/next/Library/2020-12-03-15-42-32.bpo-42116.yIwroP.rst b/Misc/NEWS.d/next/Library/2020-12-03-15-42-32.bpo-42116.yIwroP.rst
new file mode 100644
index 0000000000000..febda89338ddc
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-12-03-15-42-32.bpo-42116.yIwroP.rst
@@ -0,0 +1 @@
+Fix handling of trailing comments by :func:`inspect.getsource`.
\ No newline at end of file
More information about the Python-checkins
mailing list