Commit 8721b791 authored by Guido van Rossum's avatar Guido van Rossum

Co-production with Tim Peters, implementing a suggestion by Mark

Hammond: record top-level functions (as Function instances, a simple
subclass of Class).  You must use the new interface readmodule_ex() to
get these, though.
parent 825b8368
...@@ -116,7 +116,27 @@ class Class: ...@@ -116,7 +116,27 @@ class Class:
def _addmethod(self, name, lineno): def _addmethod(self, name, lineno):
self.methods[name] = lineno self.methods[name] = lineno
class Function(Class):
'''Class to represent a top-level Python function'''
def __init__(self, module, name, file, lineno):
Class.__init__(self, module, name, None, file, lineno)
def _addmethod(self, name, lineno):
assert 0, "Function._addmethod() shouldn't be called"
def readmodule(module, path=[], inpackage=0): def readmodule(module, path=[], inpackage=0):
'''Backwards compatible interface.
Like readmodule_ex() but strips Function objects from the
resulting dictionary.'''
dict = readmodule_ex(module, path, inpackage)
res = {}
for key, value in dict.items():
if not isinstance(value, Function):
res[key] = value
return res
def readmodule_ex(module, path=[], inpackage=0):
'''Read a module file and return a dictionary of classes. '''Read a module file and return a dictionary of classes.
Search for MODULE in PATH and sys.path, read and parse the Search for MODULE in PATH and sys.path, read and parse the
...@@ -189,19 +209,24 @@ def readmodule(module, path=[], inpackage=0): ...@@ -189,19 +209,24 @@ def readmodule(module, path=[], inpackage=0):
if m.start("Method") >= 0: if m.start("Method") >= 0:
# found a method definition or function # found a method definition or function
thisindent = _indent(m.group("MethodIndent")) thisindent = _indent(m.group("MethodIndent"))
meth_name = m.group("MethodName")
lineno = lineno + \
countnl(src, '\n',
last_lineno_pos, start)
last_lineno_pos = start
# close all classes indented at least as much # close all classes indented at least as much
while classstack and \ while classstack and \
classstack[-1][1] >= thisindent: classstack[-1][1] >= thisindent:
del classstack[-1] del classstack[-1]
if classstack: if classstack:
# and we know the class it belongs to # it's a class method
meth_name = m.group("MethodName")
lineno = lineno + \
countnl(src, '\n',
last_lineno_pos, start)
last_lineno_pos = start
cur_class = classstack[-1][0] cur_class = classstack[-1][0]
cur_class._addmethod(meth_name, lineno) cur_class._addmethod(meth_name, lineno)
else:
# it's a function
f = Function(module, meth_name,
file, lineno)
dict[meth_name] = f
elif m.start("String") >= 0: elif m.start("String") >= 0:
pass pass
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment