21
21
name -- name of the object;
22
22
file -- file in which the object is defined;
23
23
lineno -- line in the file where the object's definition starts;
24
+ end_lineno -- line in the file where the object's definition ends;
24
25
parent -- parent of this object, if any;
25
26
children -- nested objects contained in this object.
26
27
The 'children' attribute is a dictionary mapping names to objects.
52
53
53
54
class _Object :
54
55
"Information about Python class or function."
55
- def __init__ (self , module , name , file , lineno , parent ):
56
+ def __init__ (self , module , name , file , lineno , end_lineno , parent ):
56
57
self .module = module
57
58
self .name = name
58
59
self .file = file
59
60
self .lineno = lineno
61
+ self .end_lineno = end_lineno
60
62
self .parent = parent
61
63
self .children = {}
62
64
if parent is not None :
63
65
parent .children [name ] = self
64
66
67
+
68
+ # Odd Function and Class signatures are for back-compatibility.
65
69
class Function (_Object ):
66
70
"Information about a Python function, including methods."
67
- def __init__ (self , module , name , file , lineno , parent = None , is_async = False ):
68
- super ().__init__ (module , name , file , lineno , parent )
71
+ def __init__ (self , module , name , file , lineno ,
72
+ parent = None , is_async = False , * , end_lineno = None ):
73
+ super ().__init__ (module , name , file , lineno , end_lineno , parent )
69
74
self .is_async = is_async
70
75
if isinstance (parent , Class ):
71
76
parent .methods [name ] = lineno
72
77
78
+
73
79
class Class (_Object ):
74
80
"Information about a Python class."
75
- def __init__ (self , module , name , super_ , file , lineno , parent = None ):
76
- super ().__init__ (module , name , file , lineno , parent )
81
+ def __init__ (self , module , name , super_ , file , lineno ,
82
+ parent = None , * , end_lineno = None ):
83
+ super ().__init__ (module , name , file , lineno , end_lineno , parent )
77
84
self .super = super_ or []
78
85
self .methods = {}
79
86
87
+
80
88
# These 2 functions are used in these tests
81
89
# Lib/test/test_pyclbr, Lib/idlelib/idle_test/test_browser.py
82
- def _nest_function (ob , func_name , lineno , is_async = False ):
90
+ def _nest_function (ob , func_name , lineno , end_lineno , is_async = False ):
83
91
"Return a Function after nesting within ob."
84
- return Function (ob .module , func_name , ob .file , lineno , ob , is_async )
92
+ return Function (ob .module , func_name , ob .file , lineno ,
93
+ parent = ob , is_async = is_async , end_lineno = end_lineno )
85
94
86
- def _nest_class (ob , class_name , lineno , super = None ):
95
+ def _nest_class (ob , class_name , lineno , end_lineno , super = None ):
87
96
"Return a Class after nesting within ob."
88
- return Class (ob .module , class_name , super , ob .file , lineno , ob )
97
+ return Class (ob .module , class_name , super , ob .file , lineno ,
98
+ parent = ob , end_lineno = end_lineno )
99
+
89
100
90
101
def readmodule (module , path = None ):
91
102
"""Return Class objects for the top-level classes in module.
@@ -108,6 +119,7 @@ def readmodule_ex(module, path=None):
108
119
"""
109
120
return _readmodule (module , path or [])
110
121
122
+
111
123
def _readmodule (module , path , inpackage = None ):
112
124
"""Do the hard work for readmodule[_ex].
113
125
@@ -198,9 +210,8 @@ def visit_ClassDef(self, node):
198
210
bases .append (name )
199
211
200
212
parent = self .stack [- 1 ] if self .stack else None
201
- class_ = Class (
202
- self .module , node .name , bases , self .file , node .lineno , parent
203
- )
213
+ class_ = Class (self .module , node .name , bases , self .file , node .lineno ,
214
+ parent = parent , end_lineno = node .end_lineno )
204
215
if parent is None :
205
216
self .tree [node .name ] = class_
206
217
self .stack .append (class_ )
@@ -209,9 +220,8 @@ def visit_ClassDef(self, node):
209
220
210
221
def visit_FunctionDef (self , node , * , is_async = False ):
211
222
parent = self .stack [- 1 ] if self .stack else None
212
- function = Function (
213
- self .module , node .name , self .file , node .lineno , parent , is_async
214
- )
223
+ function = Function (self .module , node .name , self .file , node .lineno ,
224
+ parent , is_async , end_lineno = node .end_lineno )
215
225
if parent is None :
216
226
self .tree [node .name ] = function
217
227
self .stack .append (function )
0 commit comments