mirror of
https://github.com/python/cpython
synced 2024-10-14 11:03:18 +00:00
gh-83035: handle decorator with nested parens in inspect.getsource (#99654)
This commit is contained in:
parent
b11a384dc7
commit
68e41295b8
|
@ -1160,7 +1160,6 @@ def __init__(self):
|
||||||
self.started = False
|
self.started = False
|
||||||
self.passline = False
|
self.passline = False
|
||||||
self.indecorator = False
|
self.indecorator = False
|
||||||
self.decoratorhasargs = False
|
|
||||||
self.last = 1
|
self.last = 1
|
||||||
self.body_col0 = None
|
self.body_col0 = None
|
||||||
|
|
||||||
|
@ -1175,13 +1174,6 @@ def tokeneater(self, type, token, srowcol, erowcol, line):
|
||||||
self.islambda = True
|
self.islambda = True
|
||||||
self.started = True
|
self.started = True
|
||||||
self.passline = True # skip to the end of the line
|
self.passline = True # skip to the end of the line
|
||||||
elif token == "(":
|
|
||||||
if self.indecorator:
|
|
||||||
self.decoratorhasargs = True
|
|
||||||
elif token == ")":
|
|
||||||
if self.indecorator:
|
|
||||||
self.indecorator = False
|
|
||||||
self.decoratorhasargs = False
|
|
||||||
elif type == tokenize.NEWLINE:
|
elif type == tokenize.NEWLINE:
|
||||||
self.passline = False # stop skipping when a NEWLINE is seen
|
self.passline = False # stop skipping when a NEWLINE is seen
|
||||||
self.last = srowcol[0]
|
self.last = srowcol[0]
|
||||||
|
@ -1189,7 +1181,7 @@ def tokeneater(self, type, token, srowcol, erowcol, line):
|
||||||
raise EndOfBlock
|
raise EndOfBlock
|
||||||
# hitting a NEWLINE when in a decorator without args
|
# hitting a NEWLINE when in a decorator without args
|
||||||
# ends the decorator
|
# ends the decorator
|
||||||
if self.indecorator and not self.decoratorhasargs:
|
if self.indecorator:
|
||||||
self.indecorator = False
|
self.indecorator = False
|
||||||
elif self.passline:
|
elif self.passline:
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -259,3 +259,17 @@ def all_markers_with_args_and_kwargs(a, b, /, c, d, *args, e, f, **kwargs):
|
||||||
#line 259
|
#line 259
|
||||||
def all_markers_with_defaults(a, b=1, /, c=2, d=3, *, e=4, f=5):
|
def all_markers_with_defaults(a, b=1, /, c=2, d=3, *, e=4, f=5):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# line 263
|
||||||
|
def deco_factory(**kwargs):
|
||||||
|
def deco(f):
|
||||||
|
@wraps(f)
|
||||||
|
def wrapper(*a, **kwd):
|
||||||
|
kwd.update(kwargs)
|
||||||
|
return f(*a, **kwd)
|
||||||
|
return wrapper
|
||||||
|
return deco
|
||||||
|
|
||||||
|
@deco_factory(foo=(1 + 2), bar=lambda: 1)
|
||||||
|
def complex_decorated(foo=0, bar=lambda: 0):
|
||||||
|
return foo + bar()
|
||||||
|
|
|
@ -886,6 +886,12 @@ def test_class(self):
|
||||||
self.assertSourceEqual(self.fodderModule.X, 1, 2)
|
self.assertSourceEqual(self.fodderModule.X, 1, 2)
|
||||||
|
|
||||||
|
|
||||||
|
class TestComplexDecorator(GetSourceBase):
|
||||||
|
fodderModule = mod2
|
||||||
|
|
||||||
|
def test_parens_in_decorator(self):
|
||||||
|
self.assertSourceEqual(self.fodderModule.complex_decorated, 273, 275)
|
||||||
|
|
||||||
class _BrokenDataDescriptor(object):
|
class _BrokenDataDescriptor(object):
|
||||||
"""
|
"""
|
||||||
A broken data descriptor. See bug #1785.
|
A broken data descriptor. See bug #1785.
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fix :func:`inspect.getsource` handling of decorator calls with nested parentheses.
|
Loading…
Reference in a new issue