3.1 --- a/micropython/inspect.py Wed Feb 27 23:17:19 2008 +0100
3.2 +++ b/micropython/inspect.py Tue Mar 04 00:41:53 2008 +0100
3.3 @@ -151,6 +151,10 @@
3.4 attr.assignments = 1
3.5 attr.assignment_values.add(value)
3.6
3.7 + "A specialised set operation for parameters."
3.8 +
3.9 + set_parameter = set_module
3.10 +
3.11 def _set(self, name, value):
3.12
3.13 "The underlying set operation associating 'name' with 'value'."
3.14 @@ -208,9 +212,9 @@
3.15
3.16 def full_name(self):
3.17 if self.name is not None:
3.18 - return self.parent_name + "." + self.name
3.19 + return self.parent.full_name() + "." + self.name
3.20 else:
3.21 - return self.parent_name
3.22 + return self.parent.full_name()
3.23
3.24 # Program data structures.
3.25
3.26 @@ -282,15 +286,16 @@
3.27
3.28 "An inspected class."
3.29
3.30 - def __init__(self, name, parent_name, global_namespace=None, node=None):
3.31 + def __init__(self, name, parent, global_namespace=None, node=None):
3.32 NamespaceDict.__init__(self, global_namespace)
3.33 self.name = name
3.34 - self.parent_name = parent_name
3.35 + self.parent = parent
3.36 self.node = node
3.37
3.38 - # Superclasses and attributes.
3.39 + # Superclasses, descendants and attributes.
3.40
3.41 self.bases = []
3.42 + self.descendants = set()
3.43 self.instattr = set() # instance attributes
3.44 self.relocated = set() # attributes which do not have the same
3.45 # position as those of the same name in
3.46 @@ -312,9 +317,9 @@
3.47
3.48 def __repr__(self):
3.49 if self.location is not None:
3.50 - return "Class(%r, %r, location=%r)" % (self.name, self.parent_name, self.location)
3.51 + return "Class(%r, %r, location=%r)" % (self.name, self.parent, self.location)
3.52 else:
3.53 - return "Class(%r, %r)" % (self.name, self.parent_name)
3.54 + return "Class(%r, %r)" % (self.name, self.parent)
3.55
3.56 def finalise_attributes(self):
3.57
3.58 @@ -327,10 +332,16 @@
3.59
3.60 def add_base(self, base):
3.61 self.bases.append(base)
3.62 + base.add_descendant(self)
3.63
3.64 def add_instance_attribute(self, name):
3.65 self.instattr.add(name)
3.66
3.67 + def add_descendant(self, cls):
3.68 + self.descendants.add(cls)
3.69 + for base in self.bases:
3.70 + base.add_descendant(cls)
3.71 +
3.72 "Return the attribute names provided by this class only."
3.73
3.74 class_attribute_names = NamespaceDict.keys
3.75 @@ -340,7 +351,7 @@
3.76 "Return class attributes provided by this class only."
3.77
3.78 self.finalise_class_attributes()
3.79 - return self
3.80 + return dict(self)
3.81
3.82 def all_class_attribute_names(self):
3.83
3.84 @@ -548,10 +559,10 @@
3.85
3.86 "An inspected function."
3.87
3.88 - def __init__(self, name, parent_name, argnames, has_star, has_dstar, global_namespace=None, node=None):
3.89 + def __init__(self, name, parent, argnames, has_star, has_dstar, global_namespace=None, node=None):
3.90 NamespaceDict.__init__(self, global_namespace)
3.91 self.name = name
3.92 - self.parent_name = parent_name
3.93 + self.parent = parent
3.94 self.argnames = argnames
3.95 self.has_star = has_star
3.96 self.has_dstar = has_dstar
3.97 @@ -575,16 +586,16 @@
3.98 if isinstance(name, tuple):
3.99 self._add_parameters(name)
3.100 else:
3.101 - self[name] = None
3.102 + self.set_parameter(name, None)
3.103
3.104 def __repr__(self):
3.105 if self.location is not None:
3.106 return "Function(%r, %r, %r, %r, %r, location=%r)" % (
3.107 - self.name, self.parent_name, self.argnames, self.has_star, self.has_dstar, self.location
3.108 + self.name, self.parent, self.argnames, self.has_star, self.has_dstar, self.location
3.109 )
3.110 else:
3.111 return "Function(%r, %r, %r, %r, %r)" % (
3.112 - self.name, self.parent_name, self.argnames, self.has_star, self.has_dstar
3.113 + self.name, self.parent, self.argnames, self.has_star, self.has_dstar
3.114 )
3.115
3.116 def make_global(self, name):
3.117 @@ -609,7 +620,7 @@
3.118
3.119 "Return a dictionary mapping names to local and parameter details."
3.120
3.121 - return self
3.122 + return dict(self)
3.123
3.124 def locals(self):
3.125
3.126 @@ -622,7 +633,7 @@
3.127 del self.localnames[name]
3.128 return self.localnames
3.129
3.130 -class UnresolvedName(NamespaceDict, Naming):
3.131 +class UnresolvedName(NamespaceDict):
3.132
3.133 "A module, class or function which was mentioned but could not be imported."
3.134
3.135 @@ -640,6 +651,12 @@
3.136 def __repr__(self):
3.137 return "UnresolvedName(%r, %r)" % (self.name, self.parent_name)
3.138
3.139 + def full_name(self):
3.140 + if self.name is not None:
3.141 + return self.parent_name + "." + self.name
3.142 + else:
3.143 + return self.parent_name
3.144 +
3.145 class Module(NamespaceDict):
3.146
3.147 "An inspected module's core details."
3.148 @@ -685,7 +702,7 @@
3.149
3.150 "Return a dictionary mapping names to module attributes."
3.151
3.152 - return self
3.153 + return dict(self)
3.154
3.155 def constants(self):
3.156
3.157 @@ -850,7 +867,7 @@
3.158 if self.namespaces:
3.159 print "Class %r in %r is not global: ignored." % (node.name, self.namespaces[-1].full_name())
3.160 else:
3.161 - cls = Class(node.name, self.get_parent().full_name(), self, node)
3.162 + cls = Class(node.name, self.get_parent(), self, node)
3.163
3.164 # Visit the base class expressions, attempting to find concrete
3.165 # definitions of classes.
3.166 @@ -946,7 +963,7 @@
3.167 def visitFunction(self, node):
3.168 function = Function(
3.169 node.name,
3.170 - self.get_parent().full_name(),
3.171 + self.get_parent(),
3.172 node.argnames,
3.173 (node.flags & 4 != 0),
3.174 (node.flags & 8 != 0),
3.175 @@ -1151,16 +1168,16 @@
3.176 'frozenset', 'int', # 'list',
3.177 'long', 'object', 'set', 'slice', 'str',
3.178 'tuple', 'type', 'unicode', 'xrange']:
3.179 - self.store(key, Class(key, self.full_name(), self))
3.180 + self.store(key, Class(key, self, self))
3.181
3.182 # NOTE: Temporary measure - provide detailed built-ins.
3.183
3.184 - cls = Class("list", self.full_name(), self)
3.185 - cls.set("__iter__", Function("__iter__", cls.full_name(), [], 0, 0, cls))
3.186 + cls = Class("list", self, self)
3.187 + cls.set("__iter__", Function("__iter__", cls, [], 0, 0, cls))
3.188 self.store("list", cls)
3.189
3.190 - cls = Class("listiterator", self.full_name(), self)
3.191 - cls.set("next", Function("next", cls.full_name(), [], 0, 0, cls))
3.192 + cls = Class("listiterator", self, self)
3.193 + cls.set("next", Function("next", cls, [], 0, 0, cls))
3.194 self.store("listiterator", cls)
3.195
3.196 # NOTE: Incomplete: some functions have more than one parameter.
3.197 @@ -1173,7 +1190,7 @@
3.198 'open', 'ord', 'pow', 'property', 'range', 'raw_input', 'reduce',
3.199 'reload', 'repr', 'reversed', 'round', 'setattr', 'sorted',
3.200 'staticmethod', 'sum', 'super', 'unichr', 'vars', 'zip']:
3.201 - self[key] = Function(key, self.full_name(), ['arg'], 0, 0, self)
3.202 + self[key] = Function(key, self, ['arg'], 0, 0, self)
3.203
3.204 def store(self, name, obj):
3.205 self.set(name, obj)