1.1 --- a/micropython/inspect.py Mon Nov 16 00:34:47 2009 +0100
1.2 +++ b/micropython/inspect.py Sun Nov 22 04:15:05 2009 +0100
1.3 @@ -151,6 +151,9 @@
1.4
1.5 for node, namespaces in self.functions:
1.6 self._visitFunctionBody(node, namespaces)
1.7 + self.finalise_namespace(namespaces[-1])
1.8 +
1.9 + self.finalise_namespace(self)
1.10
1.11 # Add references to other modules declared using the __all__ global.
1.12
1.13 @@ -177,6 +180,15 @@
1.14 else:
1.15 self.process_globals(n)
1.16
1.17 + def finalise_namespace(self, namespace):
1.18 +
1.19 + "Finalise the given 'namespace'."
1.20 +
1.21 + for names in namespace.get_all_attribute_usage():
1.22 + self.importer.use_names(names, namespace.full_name())
1.23 + for name in namespace.get_active_attributes():
1.24 + self.importer.use_name(name, namespace.full_name())
1.25 +
1.26 def vacuum(self):
1.27
1.28 """
1.29 @@ -202,7 +214,8 @@
1.30 # Only consider deleting entire unused objects or things accessible
1.31 # via names which are never used.
1.32
1.33 - if delete_all or not self.importer.uses_name(name):
1.34 + if delete_all or not self.importer.uses_attribute(obj, name):
1.35 + print "Deleting", obj.full_name(), name
1.36 del obj[name]
1.37
1.38 # Delete any unambiguous attribute value. Such values can only
1.39 @@ -304,7 +317,7 @@
1.40 "Use the given 'name' within the current namespace/unit."
1.41
1.42 unit = self.get_namespace()
1.43 - self.importer.use_name(name, unit.name)
1.44 + self.importer.use_name(name, unit.full_name())
1.45
1.46 # Attribute usage methods.
1.47 # These are convenience methods which refer to the specific namespace's
1.48 @@ -334,8 +347,8 @@
1.49 def reset_all_attributes(self):
1.50 self.get_namespace()._reset_all_attributes()
1.51
1.52 - def use_attribute(self, attr, attrname):
1.53 - return self.get_namespace()._use_attribute(attr, attrname)
1.54 + def use_attribute(self, name, attrname):
1.55 + return self.get_namespace()._use_attribute(name, attrname)
1.56
1.57 # Visitor methods.
1.58
1.59 @@ -469,7 +482,7 @@
1.60 # Note usage of the attribute.
1.61
1.62 if expr.parent is self.get_namespace():
1.63 - node._attrnames = self.use_attribute(expr, node.attrname)
1.64 + node._attrnames = self.use_attribute(expr.name, node.attrname)
1.65
1.66 return None
1.67
1.68 @@ -492,7 +505,7 @@
1.69
1.70 self.store(node.name, self.expr)
1.71 self.define_attribute_user(node)
1.72 - self.use_name(node.name)
1.73 + self.use_attribute(None, node.name) # ensure the presence of the given name
1.74 return None
1.75
1.76 visitAssTuple = visitAssList
1.77 @@ -717,16 +730,17 @@
1.78 # Note usage of the attribute.
1.79
1.80 if expr.parent is self.get_namespace():
1.81 - node._attrnames = self.use_attribute(expr, attrname)
1.82 + node._attrnames = self.use_attribute(expr.name, attrname)
1.83 + else:
1.84 + self.use_name(attrname)
1.85
1.86 elif self.builtins is not None:
1.87 attr = self.builtins.get(attrname)
1.88 + self.use_name(attrname)
1.89 +
1.90 else:
1.91 attr = UnresolvedName(attrname, value.full_name(), self)
1.92 -
1.93 - # Accounting.
1.94 -
1.95 - self.use_name(attrname)
1.96 + self.use_name(attrname)
1.97
1.98 return attr
1.99
1.100 @@ -811,18 +825,44 @@
1.101 def visitName(self, node):
1.102 name = node.name
1.103
1.104 + # Constants.
1.105 +
1.106 if self.importer.predefined_constants.has_key(name):
1.107 attr = self.importer.get_predefined_constant(name)
1.108 +
1.109 + # Locals.
1.110 +
1.111 elif self.namespaces and self.namespaces[-1].has_key(name):
1.112 attr = self.namespaces[-1][name]
1.113 +
1.114 + # Note usage of the local (potentially a class attribute).
1.115 +
1.116 + node._attrnames = self.use_attribute(None, name)
1.117 +
1.118 + # Globals.
1.119 +
1.120 elif self.has_key(name):
1.121 attr = self[name]
1.122 +
1.123 + # Note usage of the module attribute.
1.124 +
1.125 + node._attrnames = self.use_attribute(None, name)
1.126 +
1.127 + # Builtins.
1.128 +
1.129 elif self.builtins is not None and self.builtins.has_key(name):
1.130 attr = self.builtins[name]
1.131 +
1.132 + # Note usage of the module attribute.
1.133 +
1.134 + node._attrnames = self.builtins.use_attribute(None, name)
1.135 +
1.136 + # Unknown.
1.137 +
1.138 else:
1.139 attr = None
1.140 + self.use_name(name)
1.141
1.142 - self.use_name(name)
1.143 return attr
1.144
1.145 visitNot = OP