1.1 --- a/micropython/inspect.py Tue Oct 16 01:29:33 2007 +0200
1.2 +++ b/micropython/inspect.py Wed Oct 17 01:00:30 2007 +0200
1.3 @@ -56,19 +56,26 @@
1.4
1.5 "An inspected module."
1.6
1.7 - def __init__(self, importer=None):
1.8 + def __init__(self, name, importer=None):
1.9 ASTVisitor.__init__(self)
1.10 self.visitor = self
1.11
1.12 + self.name = name
1.13 self.importer = importer
1.14
1.15 + # Module namespace.
1.16 +
1.17 self.namespace = {}
1.18 self.namespace.update(builtins_namespace)
1.19
1.20 + # Current expression state.
1.21 +
1.22 + self.expr = None
1.23 +
1.24 + # Namespace state.
1.25 +
1.26 self.in_global = 1
1.27 self.in_init = 0
1.28 - self.expr = None
1.29 -
1.30 self.classes = []
1.31 self.module = None
1.32
1.33 @@ -78,10 +85,16 @@
1.34
1.35 def process(self, module):
1.36 self.module = module
1.37 - return self.dispatch(module)
1.38 + processed = self.dispatch(module)
1.39 + if self.namespace.has_key("__all__"):
1.40 + all = self.namespace["__all__"]
1.41 + if isinstance(all, compiler.ast.List):
1.42 + for n in all.nodes:
1.43 + self.namespace[n.value] = self.importer.add_module(self.name + "." + n.value)
1.44 + return processed
1.45
1.46 def default(self, node, *args):
1.47 - raise InspectError, (None, node)
1.48 + raise InspectError, node.__class__
1.49
1.50 def dispatch(self, node, *args):
1.51 return ASTVisitor.dispatch(self, node, *args)
1.52 @@ -100,6 +113,8 @@
1.53 def NOP(self, node):
1.54 return node
1.55
1.56 + visitAdd = NOP
1.57 +
1.58 visitAnd = NOP
1.59
1.60 def visitAssign(self, node):
1.61 @@ -131,7 +146,7 @@
1.62 if not self.in_global:
1.63 raise InspectError, "Class is %s not global: cannot handle this reasonably." % node.name
1.64 else:
1.65 - cls = Class(node)
1.66 + cls = Class(node.name)
1.67 for base in node.bases:
1.68 base_ref = self.dispatch(base)
1.69 if base_ref is None:
1.70 @@ -168,7 +183,7 @@
1.71
1.72 for name, alias in node.names:
1.73 if name != "*":
1.74 - self.namespace[alias] = module.namespace[name]
1.75 + self.namespace[alias or name] = module.namespace[name]
1.76 else:
1.77 for n in module.namespace.keys():
1.78 self.namespace[n] = module.namespace[n]
1.79 @@ -206,10 +221,12 @@
1.80 raise InspectError, "Please use the micropython.Importer class for code which uses the 'import' statement."
1.81
1.82 for name, alias in node.names:
1.83 - self.namespace[alias] = self.importer.load(name, 1)
1.84 + self.namespace[alias or name] = self.importer.load(name, 1)
1.85
1.86 return None
1.87
1.88 + visitLeftShift = NOP
1.89 +
1.90 visitList = NOP
1.91
1.92 def visitModule(self, node):
1.93 @@ -232,6 +249,8 @@
1.94
1.95 visitRaise = NOP
1.96
1.97 + visitRightShift = NOP
1.98 +
1.99 def visitStmt(self, node):
1.100 for n in node.nodes:
1.101 self.dispatch(n)
1.102 @@ -247,6 +266,8 @@
1.103 self.dispatch(node.else_)
1.104 return None
1.105
1.106 + visitTuple = NOP
1.107 +
1.108 class Self:
1.109
1.110 "A reference to an object within a method."
1.111 @@ -267,7 +288,7 @@
1.112 'TabError', 'True', 'TypeError', 'UnboundLocalError',
1.113 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError',
1.114 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
1.115 - 'ValueError', 'Warning', 'ZeroDivisionError']:
1.116 + 'ValueError', 'Warning', 'ZeroDivisionError', 'object']:
1.117 builtins_namespace[key] = Class(key)
1.118
1.119 # vim: tabstop=4 expandtab shiftwidth=4