2121 name -- name of the object;
2222 file -- file in which the object is defined;
2323 lineno -- line in the file where the object's definition starts;
24+ end_lineno -- line in the file where the object's definition ends;
2425 parent -- parent of this object, if any;
2526 children -- nested objects contained in this object.
2627The 'children' attribute is a dictionary mapping names to objects.
5253
5354class _Object :
5455 "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 ):
5657 self .module = module
5758 self .name = name
5859 self .file = file
5960 self .lineno = lineno
61+ self .end_lineno = end_lineno
6062 self .parent = parent
6163 self .children = {}
6264 if parent is not None :
6365 parent .children [name ] = self
6466
67+
68+ # Odd Function and Class signatures are for back-compatibility.
6569class Function (_Object ):
6670 "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 )
6974 self .is_async = is_async
7075 if isinstance (parent , Class ):
7176 parent .methods [name ] = lineno
7277
78+
7379class Class (_Object ):
7480 "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 )
7784 self .super = super_ or []
7885 self .methods = {}
7986
87+
8088# These 2 functions are used in these tests
8189# 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 ):
8391 "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 )
8594
86- def _nest_class (ob , class_name , lineno , super = None ):
95+ def _nest_class (ob , class_name , lineno , end_lineno , super = None ):
8796 "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+
89100
90101def readmodule (module , path = None ):
91102 """Return Class objects for the top-level classes in module.
@@ -108,6 +119,7 @@ def readmodule_ex(module, path=None):
108119 """
109120 return _readmodule (module , path or [])
110121
122+
111123def _readmodule (module , path , inpackage = None ):
112124 """Do the hard work for readmodule[_ex].
113125
@@ -198,9 +210,8 @@ def visit_ClassDef(self, node):
198210 bases .append (name )
199211
200212 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 )
204215 if parent is None :
205216 self .tree [node .name ] = class_
206217 self .stack .append (class_ )
@@ -209,9 +220,8 @@ def visit_ClassDef(self, node):
209220
210221 def visit_FunctionDef (self , node , * , is_async = False ):
211222 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 )
215225 if parent is None :
216226 self .tree [node .name ] = function
217227 self .stack .append (function )
0 commit comments