1.1 --- a/micropython/inspect.py Wed Feb 27 23:17:19 2008 +0100
1.2 +++ b/micropython/inspect.py Tue Mar 04 00:41:53 2008 +0100
1.3 @@ -151,6 +151,10 @@
1.4 attr.assignments = 1
1.5 attr.assignment_values.add(value)
1.6
1.7 + "A specialised set operation for parameters."
1.8 +
1.9 + set_parameter = set_module
1.10 +
1.11 def _set(self, name, value):
1.12
1.13 "The underlying set operation associating 'name' with 'value'."
1.14 @@ -208,9 +212,9 @@
1.15
1.16 def full_name(self):
1.17 if self.name is not None:
1.18 - return self.parent_name + "." + self.name
1.19 + return self.parent.full_name() + "." + self.name
1.20 else:
1.21 - return self.parent_name
1.22 + return self.parent.full_name()
1.23
1.24 # Program data structures.
1.25
1.26 @@ -282,15 +286,16 @@
1.27
1.28 "An inspected class."
1.29
1.30 - def __init__(self, name, parent_name, global_namespace=None, node=None):
1.31 + def __init__(self, name, parent, global_namespace=None, node=None):
1.32 NamespaceDict.__init__(self, global_namespace)
1.33 self.name = name
1.34 - self.parent_name = parent_name
1.35 + self.parent = parent
1.36 self.node = node
1.37
1.38 - # Superclasses and attributes.
1.39 + # Superclasses, descendants and attributes.
1.40
1.41 self.bases = []
1.42 + self.descendants = set()
1.43 self.instattr = set() # instance attributes
1.44 self.relocated = set() # attributes which do not have the same
1.45 # position as those of the same name in
1.46 @@ -312,9 +317,9 @@
1.47
1.48 def __repr__(self):
1.49 if self.location is not None:
1.50 - return "Class(%r, %r, location=%r)" % (self.name, self.parent_name, self.location)
1.51 + return "Class(%r, %r, location=%r)" % (self.name, self.parent, self.location)
1.52 else:
1.53 - return "Class(%r, %r)" % (self.name, self.parent_name)
1.54 + return "Class(%r, %r)" % (self.name, self.parent)
1.55
1.56 def finalise_attributes(self):
1.57
1.58 @@ -327,10 +332,16 @@
1.59
1.60 def add_base(self, base):
1.61 self.bases.append(base)
1.62 + base.add_descendant(self)
1.63
1.64 def add_instance_attribute(self, name):
1.65 self.instattr.add(name)
1.66
1.67 + def add_descendant(self, cls):
1.68 + self.descendants.add(cls)
1.69 + for base in self.bases:
1.70 + base.add_descendant(cls)
1.71 +
1.72 "Return the attribute names provided by this class only."
1.73
1.74 class_attribute_names = NamespaceDict.keys
1.75 @@ -340,7 +351,7 @@
1.76 "Return class attributes provided by this class only."
1.77
1.78 self.finalise_class_attributes()
1.79 - return self
1.80 + return dict(self)
1.81
1.82 def all_class_attribute_names(self):
1.83
1.84 @@ -548,10 +559,10 @@
1.85
1.86 "An inspected function."
1.87
1.88 - def __init__(self, name, parent_name, argnames, has_star, has_dstar, global_namespace=None, node=None):
1.89 + def __init__(self, name, parent, argnames, has_star, has_dstar, global_namespace=None, node=None):
1.90 NamespaceDict.__init__(self, global_namespace)
1.91 self.name = name
1.92 - self.parent_name = parent_name
1.93 + self.parent = parent
1.94 self.argnames = argnames
1.95 self.has_star = has_star
1.96 self.has_dstar = has_dstar
1.97 @@ -575,16 +586,16 @@
1.98 if isinstance(name, tuple):
1.99 self._add_parameters(name)
1.100 else:
1.101 - self[name] = None
1.102 + self.set_parameter(name, None)
1.103
1.104 def __repr__(self):
1.105 if self.location is not None:
1.106 return "Function(%r, %r, %r, %r, %r, location=%r)" % (
1.107 - self.name, self.parent_name, self.argnames, self.has_star, self.has_dstar, self.location
1.108 + self.name, self.parent, self.argnames, self.has_star, self.has_dstar, self.location
1.109 )
1.110 else:
1.111 return "Function(%r, %r, %r, %r, %r)" % (
1.112 - self.name, self.parent_name, self.argnames, self.has_star, self.has_dstar
1.113 + self.name, self.parent, self.argnames, self.has_star, self.has_dstar
1.114 )
1.115
1.116 def make_global(self, name):
1.117 @@ -609,7 +620,7 @@
1.118
1.119 "Return a dictionary mapping names to local and parameter details."
1.120
1.121 - return self
1.122 + return dict(self)
1.123
1.124 def locals(self):
1.125
1.126 @@ -622,7 +633,7 @@
1.127 del self.localnames[name]
1.128 return self.localnames
1.129
1.130 -class UnresolvedName(NamespaceDict, Naming):
1.131 +class UnresolvedName(NamespaceDict):
1.132
1.133 "A module, class or function which was mentioned but could not be imported."
1.134
1.135 @@ -640,6 +651,12 @@
1.136 def __repr__(self):
1.137 return "UnresolvedName(%r, %r)" % (self.name, self.parent_name)
1.138
1.139 + def full_name(self):
1.140 + if self.name is not None:
1.141 + return self.parent_name + "." + self.name
1.142 + else:
1.143 + return self.parent_name
1.144 +
1.145 class Module(NamespaceDict):
1.146
1.147 "An inspected module's core details."
1.148 @@ -685,7 +702,7 @@
1.149
1.150 "Return a dictionary mapping names to module attributes."
1.151
1.152 - return self
1.153 + return dict(self)
1.154
1.155 def constants(self):
1.156
1.157 @@ -850,7 +867,7 @@
1.158 if self.namespaces:
1.159 print "Class %r in %r is not global: ignored." % (node.name, self.namespaces[-1].full_name())
1.160 else:
1.161 - cls = Class(node.name, self.get_parent().full_name(), self, node)
1.162 + cls = Class(node.name, self.get_parent(), self, node)
1.163
1.164 # Visit the base class expressions, attempting to find concrete
1.165 # definitions of classes.
1.166 @@ -946,7 +963,7 @@
1.167 def visitFunction(self, node):
1.168 function = Function(
1.169 node.name,
1.170 - self.get_parent().full_name(),
1.171 + self.get_parent(),
1.172 node.argnames,
1.173 (node.flags & 4 != 0),
1.174 (node.flags & 8 != 0),
1.175 @@ -1151,16 +1168,16 @@
1.176 'frozenset', 'int', # 'list',
1.177 'long', 'object', 'set', 'slice', 'str',
1.178 'tuple', 'type', 'unicode', 'xrange']:
1.179 - self.store(key, Class(key, self.full_name(), self))
1.180 + self.store(key, Class(key, self, self))
1.181
1.182 # NOTE: Temporary measure - provide detailed built-ins.
1.183
1.184 - cls = Class("list", self.full_name(), self)
1.185 - cls.set("__iter__", Function("__iter__", cls.full_name(), [], 0, 0, cls))
1.186 + cls = Class("list", self, self)
1.187 + cls.set("__iter__", Function("__iter__", cls, [], 0, 0, cls))
1.188 self.store("list", cls)
1.189
1.190 - cls = Class("listiterator", self.full_name(), self)
1.191 - cls.set("next", Function("next", cls.full_name(), [], 0, 0, cls))
1.192 + cls = Class("listiterator", self, self)
1.193 + cls.set("next", Function("next", cls, [], 0, 0, cls))
1.194 self.store("listiterator", cls)
1.195
1.196 # NOTE: Incomplete: some functions have more than one parameter.
1.197 @@ -1173,7 +1190,7 @@
1.198 'open', 'ord', 'pow', 'property', 'range', 'raw_input', 'reduce',
1.199 'reload', 'repr', 'reversed', 'round', 'setattr', 'sorted',
1.200 'staticmethod', 'sum', 'super', 'unichr', 'vars', 'zip']:
1.201 - self[key] = Function(key, self.full_name(), ['arg'], 0, 0, self)
1.202 + self[key] = Function(key, self, ['arg'], 0, 0, self)
1.203
1.204 def store(self, name, obj):
1.205 self.set(name, obj)