mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	* Use ast module to find class definition * Add NEWS entry * Fix class with multiple children and move decorator code to the method * Fix PR comments 1. Use node.decorator_list to select decorators 2. Remove unwanted variables in ClassVisitor 3. Simplify stack management as per review * Add test for nested functions and async calls * Fix pydoc test since comments are returned now correctly * Set event loop policy as None to fix environment related change * Refactor visit_AsyncFunctionDef and tests * Refactor to use local variables and fix tests * Add patch attribution * Use self.addCleanup for asyncio * Rename ClassVisitor to ClassFinder and fix asyncio cleanup * Return first class inside conditional in case of multiple definitions. Remove decorator for class source. * Add docstring to make the test correct * Modify NEWS entry regarding decorators * Return decorators too for bpo-15856 * Move ast and the class source code to top. Use proper Exception.
		
			
				
	
	
		
			261 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			261 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# line 1
 | 
						|
def wrap(foo=None):
 | 
						|
    def wrapper(func):
 | 
						|
        return func
 | 
						|
    return wrapper
 | 
						|
 | 
						|
# line 7
 | 
						|
def replace(func):
 | 
						|
    def insteadfunc():
 | 
						|
        print('hello')
 | 
						|
    return insteadfunc
 | 
						|
 | 
						|
# line 13
 | 
						|
@wrap()
 | 
						|
@wrap(wrap)
 | 
						|
def wrapped():
 | 
						|
    pass
 | 
						|
 | 
						|
# line 19
 | 
						|
@replace
 | 
						|
def gone():
 | 
						|
    pass
 | 
						|
 | 
						|
# line 24
 | 
						|
oll = lambda m: m
 | 
						|
 | 
						|
# line 27
 | 
						|
tll = lambda g: g and \
 | 
						|
g and \
 | 
						|
g
 | 
						|
 | 
						|
# line 32
 | 
						|
tlli = lambda d: d and \
 | 
						|
    d
 | 
						|
 | 
						|
# line 36
 | 
						|
def onelinefunc(): pass
 | 
						|
 | 
						|
# line 39
 | 
						|
def manyargs(arg1, arg2,
 | 
						|
arg3, arg4): pass
 | 
						|
 | 
						|
# line 43
 | 
						|
def twolinefunc(m): return m and \
 | 
						|
m
 | 
						|
 | 
						|
# line 47
 | 
						|
a = [None,
 | 
						|
     lambda x: x,
 | 
						|
     None]
 | 
						|
 | 
						|
# line 52
 | 
						|
def setfunc(func):
 | 
						|
    globals()["anonymous"] = func
 | 
						|
setfunc(lambda x, y: x*y)
 | 
						|
 | 
						|
# line 57
 | 
						|
def with_comment():  # hello
 | 
						|
    world
 | 
						|
 | 
						|
# line 61
 | 
						|
multiline_sig = [
 | 
						|
    lambda x, \
 | 
						|
            y: x+y,
 | 
						|
    None,
 | 
						|
    ]
 | 
						|
 | 
						|
# line 68
 | 
						|
def func69():
 | 
						|
    class cls70:
 | 
						|
        def func71():
 | 
						|
            pass
 | 
						|
    return cls70
 | 
						|
extra74 = 74
 | 
						|
 | 
						|
# line 76
 | 
						|
def func77(): pass
 | 
						|
(extra78, stuff78) = 'xy'
 | 
						|
extra79 = 'stop'
 | 
						|
 | 
						|
# line 81
 | 
						|
class cls82:
 | 
						|
    def func83(): pass
 | 
						|
(extra84, stuff84) = 'xy'
 | 
						|
extra85 = 'stop'
 | 
						|
 | 
						|
# line 87
 | 
						|
def func88():
 | 
						|
    # comment
 | 
						|
    return 90
 | 
						|
 | 
						|
# line 92
 | 
						|
def f():
 | 
						|
    class X:
 | 
						|
        def g():
 | 
						|
            "doc"
 | 
						|
            return 42
 | 
						|
    return X
 | 
						|
method_in_dynamic_class = f().g
 | 
						|
 | 
						|
#line 101
 | 
						|
def keyworded(*arg1, arg2=1):
 | 
						|
    pass
 | 
						|
 | 
						|
#line 105
 | 
						|
def annotated(arg1: list):
 | 
						|
    pass
 | 
						|
 | 
						|
#line 109
 | 
						|
def keyword_only_arg(*, arg):
 | 
						|
    pass
 | 
						|
 | 
						|
@wrap(lambda: None)
 | 
						|
def func114():
 | 
						|
    return 115
 | 
						|
 | 
						|
class ClassWithMethod:
 | 
						|
    def method(self):
 | 
						|
        pass
 | 
						|
 | 
						|
from functools import wraps
 | 
						|
 | 
						|
def decorator(func):
 | 
						|
    @wraps(func)
 | 
						|
    def fake():
 | 
						|
        return 42
 | 
						|
    return fake
 | 
						|
 | 
						|
#line 129
 | 
						|
@decorator
 | 
						|
def real():
 | 
						|
    return 20
 | 
						|
 | 
						|
#line 134
 | 
						|
class cls135:
 | 
						|
    def func136():
 | 
						|
        def func137():
 | 
						|
            never_reached1
 | 
						|
            never_reached2
 | 
						|
 | 
						|
# line 141
 | 
						|
class cls142:
 | 
						|
    a = """
 | 
						|
class cls149:
 | 
						|
    ...
 | 
						|
"""
 | 
						|
 | 
						|
# line 148
 | 
						|
class cls149:
 | 
						|
 | 
						|
    def func151(self):
 | 
						|
        pass
 | 
						|
 | 
						|
'''
 | 
						|
class cls160:
 | 
						|
    pass
 | 
						|
'''
 | 
						|
 | 
						|
# line 159
 | 
						|
class cls160:
 | 
						|
 | 
						|
    def func162(self):
 | 
						|
        pass
 | 
						|
 | 
						|
# line 165
 | 
						|
class cls166:
 | 
						|
    a = '''
 | 
						|
    class cls175:
 | 
						|
        ...
 | 
						|
    '''
 | 
						|
 | 
						|
# line 172
 | 
						|
class cls173:
 | 
						|
 | 
						|
    class cls175:
 | 
						|
        pass
 | 
						|
 | 
						|
# line 178
 | 
						|
class cls179:
 | 
						|
    pass
 | 
						|
 | 
						|
# line 182
 | 
						|
class cls183:
 | 
						|
 | 
						|
    class cls185:
 | 
						|
 | 
						|
        def func186(self):
 | 
						|
            pass
 | 
						|
 | 
						|
def class_decorator(cls):
 | 
						|
    return cls
 | 
						|
 | 
						|
# line 193
 | 
						|
@class_decorator
 | 
						|
@class_decorator
 | 
						|
class cls196:
 | 
						|
 | 
						|
    @class_decorator
 | 
						|
    @class_decorator
 | 
						|
    class cls200:
 | 
						|
        pass
 | 
						|
 | 
						|
class cls203:
 | 
						|
    class cls204:
 | 
						|
        class cls205:
 | 
						|
            pass
 | 
						|
    class cls207:
 | 
						|
        class cls205:
 | 
						|
            pass
 | 
						|
 | 
						|
# line 211
 | 
						|
def func212():
 | 
						|
    class cls213:
 | 
						|
        pass
 | 
						|
    return cls213
 | 
						|
 | 
						|
# line 217
 | 
						|
class cls213:
 | 
						|
    def func219(self):
 | 
						|
        class cls220:
 | 
						|
            pass
 | 
						|
        return cls220
 | 
						|
 | 
						|
# line 224
 | 
						|
async def func225():
 | 
						|
    class cls226:
 | 
						|
        pass
 | 
						|
    return cls226
 | 
						|
 | 
						|
# line 230
 | 
						|
class cls226:
 | 
						|
    async def func232(self):
 | 
						|
        class cls233:
 | 
						|
            pass
 | 
						|
        return cls233
 | 
						|
 | 
						|
if True:
 | 
						|
    class cls238:
 | 
						|
        class cls239:
 | 
						|
            '''if clause cls239'''
 | 
						|
else:
 | 
						|
    class cls238:
 | 
						|
        class cls239:
 | 
						|
            '''else clause 239'''
 | 
						|
            pass
 | 
						|
 | 
						|
#line 247
 | 
						|
def positional_only_arg(a, /):
 | 
						|
    pass
 | 
						|
 | 
						|
#line 251
 | 
						|
def all_markers(a, b, /, c, d, *, e, f):
 | 
						|
    pass
 | 
						|
 | 
						|
# line 255
 | 
						|
def all_markers_with_args_and_kwargs(a, b, /, c, d, *args, e, f, **kwargs):
 | 
						|
    pass
 | 
						|
 | 
						|
#line 259
 | 
						|
def all_markers_with_defaults(a, b=1, /, c=2, d=3, *, e=4, f=5):
 | 
						|
    pass
 |