1.1 --- a/micropython/inspect.py Sun Nov 22 21:21:41 2009 +0100
1.2 +++ b/micropython/inspect.py Sun Nov 22 22:53:24 2009 +0100
1.3 @@ -186,8 +186,6 @@
1.4
1.5 for names in namespace.get_all_attribute_usage():
1.6 self.importer.use_names(names, namespace.full_name())
1.7 - for name in namespace.get_active_attributes():
1.8 - self.importer.use_specific_name(name, namespace.full_name())
1.9
1.10 def vacuum(self):
1.11
1.12 @@ -237,8 +235,7 @@
1.13 "Finalise the module."
1.14
1.15 for obj in self.all_objects:
1.16 - if isinstance(obj, (Class, Function)): # NOTE: Perhaps not required.
1.17 - obj.finalise_attributes(reset=1)
1.18 + obj.finalise_attributes(reset=1)
1.19
1.20 def add_object(self, obj, any_scope=0):
1.21
1.22 @@ -349,6 +346,14 @@
1.23 def use_attribute(self, name, attrname):
1.24 return self.get_namespace()._use_attribute(name, attrname)
1.25
1.26 + # Specific attribute usage, nominating specific attributes which can be
1.27 + # resolved during inspection.
1.28 +
1.29 + def use_specific_attribute(self, objname, attrname):
1.30 + from_name = self.get_namespace().full_name()
1.31 + objname = objname or from_name
1.32 + self.importer.use_specific_name(objname, attrname, from_name)
1.33 +
1.34 # Visitor methods.
1.35
1.36 def default(self, node, *args):
1.37 @@ -478,7 +483,7 @@
1.38 self.store_module_attr(node.attrname, expr.get_value())
1.39 print "Warning: attribute %r of module %r set outside the module." % (node.attrname, expr.get_value().name)
1.40
1.41 - # Note usage of the attribute.
1.42 + # Note usage of the attribute where a local is involved.
1.43
1.44 if expr.parent is self.get_namespace():
1.45 node._attrnames = self.use_attribute(expr.name, node.attrname)
1.46 @@ -504,7 +509,10 @@
1.47
1.48 self.store(node.name, self.expr)
1.49 self.define_attribute_user(node)
1.50 - self.use_attribute(None, node.name) # ensure the presence of the given name
1.51 +
1.52 + # Ensure the presence of the given name in this namespace.
1.53 +
1.54 + self.use_specific_attribute(None, node.name)
1.55 return None
1.56
1.57 visitAssTuple = visitAssList
1.58 @@ -681,7 +689,7 @@
1.59
1.60 for name, alias in node.names:
1.61 if name != "*":
1.62 - if module is not None and module.namespace.has_key(name):
1.63 + if module is not None and module.has_key(name):
1.64 attr = module[name]
1.65 self.store(alias or name, attr)
1.66 if isinstance(attr.get_value(), Module) and not attr.get_value().loaded:
1.67 @@ -693,7 +701,7 @@
1.68 self.store(alias or name, UnresolvedName(name, node.modname, self))
1.69 else:
1.70 if module is not None:
1.71 - for n in module.namespace.keys():
1.72 + for n in module.keys():
1.73 attr = module[n]
1.74 self.store(n, attr)
1.75 if isinstance(attr.get_value(), Module) and not attr.get_value().loaded:
1.76 @@ -720,27 +728,32 @@
1.77
1.78 if isinstance(expr, Attr):
1.79 value = expr.get_value()
1.80 +
1.81 + # Get the attribute and record its usage.
1.82 +
1.83 if isinstance(value, (Class, Module)):
1.84 - attr = value.namespace.get(attrname)
1.85 + attr = value.get(attrname)
1.86 + self.use_specific_attribute(value.full_name(), attrname)
1.87 +
1.88 elif isinstance(value, UnresolvedName):
1.89 attr = UnresolvedName(attrname, value.full_name(), self)
1.90 +
1.91 else:
1.92 attr = None
1.93
1.94 - # Note usage of the attribute.
1.95 + # Note usage of the attribute where a local is involved.
1.96
1.97 - if expr.parent is self.get_namespace():
1.98 - node._attrnames = self.use_attribute(expr.name, attrname)
1.99 - else:
1.100 - self.use_name(attrname)
1.101 + if expr.parent is self.get_namespace():
1.102 + node._attrnames = self.use_attribute(expr.name, attrname)
1.103 + else:
1.104 + self.use_name(attrname)
1.105
1.106 elif self.builtins is not None:
1.107 attr = self.builtins.get(attrname)
1.108 - self.use_name(attrname)
1.109 + self.use_specific_attribute(self.builtins.full_name(), attrname)
1.110
1.111 else:
1.112 attr = UnresolvedName(attrname, value.full_name(), self)
1.113 - self.use_name(attrname)
1.114
1.115 return attr
1.116
1.117 @@ -837,7 +850,7 @@
1.118
1.119 # Note usage of the local (potentially a class attribute).
1.120
1.121 - node._attrnames = self.use_attribute(None, name)
1.122 + self.use_specific_attribute(None, name)
1.123
1.124 # Globals.
1.125
1.126 @@ -846,16 +859,13 @@
1.127
1.128 # Note usage of the module attribute.
1.129
1.130 - node._attrnames = self.use_attribute(None, name)
1.131 + self.use_specific_attribute(self.full_name(), name)
1.132
1.133 # Builtins.
1.134
1.135 elif self.builtins is not None and self.builtins.has_key(name):
1.136 attr = self.builtins[name]
1.137 -
1.138 - # Note usage of the module attribute.
1.139 -
1.140 - node._attrnames = self.builtins.use_attribute(None, name)
1.141 + self.use_specific_attribute(self.builtins.full_name(), name)
1.142
1.143 # Unknown.
1.144