4.1 --- a/micropython/inspect.py Wed Feb 06 01:28:11 2008 +0100
4.2 +++ b/micropython/inspect.py Sat Feb 09 02:35:57 2008 +0100
4.3 @@ -56,7 +56,9 @@
4.4
4.5 "An inspection error."
4.6
4.7 - pass
4.8 + def __init__(self, node, message):
4.9 + self.node = node
4.10 + self.message = message
4.11
4.12 class AtLeast:
4.13
4.14 @@ -120,21 +122,18 @@
4.15 return self.namespace.get(name, default)
4.16
4.17 def __setitem__(self, name, value):
4.18 -
4.19 - # Use a special method to access the namespace.
4.20 -
4.21 - if name not in self.globals:
4.22 - self.set(name, value)
4.23 - else:
4.24 - self.global_namespace.set(name, value, 0)
4.25 + self.set(name, value)
4.26
4.27 def set(self, name, value, single_assignment=1):
4.28 - attr = self._set(name, value)
4.29 + if name in self.globals:
4.30 + self.global_namespace.set(name, value, 0)
4.31 + else:
4.32 + attr = self._set(name, value)
4.33
4.34 - # NOTE: Insist on assignments with known values.
4.35 + # NOTE: Insist on assignments with known values.
4.36
4.37 - if value is not None:
4.38 - attr.update(value, single_assignment)
4.39 + if value is not None:
4.40 + attr.update(value, single_assignment)
4.41
4.42 def set_module(self, name, value):
4.43 attr = self._set(name, value)
4.44 @@ -175,6 +174,12 @@
4.45 else:
4.46 return None
4.47
4.48 + def to_list(self, d):
4.49 + l = [None] * len(d.keys())
4.50 + for attr in d.values():
4.51 + l[attr.position] = attr
4.52 + return l
4.53 +
4.54 class Naming:
4.55
4.56 "A mix-in providing naming conveniences."
4.57 @@ -230,7 +235,10 @@
4.58 self.location = None
4.59
4.60 def __repr__(self):
4.61 - return "Const(%r, location=%r)" % (self.value, self.location)
4.62 + if self.location is not None:
4.63 + return "Const(%r, location=%r)" % (self.value, self.location)
4.64 + else:
4.65 + return "Const(%r)" % self.value
4.66
4.67 def __eq__(self, other):
4.68 return self.value == other.value
4.69 @@ -264,7 +272,10 @@
4.70 self.code_location = None
4.71
4.72 def __repr__(self):
4.73 - return "Class(%r, %r, location=%r)" % (self.name, self.parent_name, self.location)
4.74 + if self.location is not None:
4.75 + return "Class(%r, %r, location=%r)" % (self.name, self.parent_name, self.location)
4.76 + else:
4.77 + return "Class(%r, %r)" % (self.name, self.parent_name)
4.78
4.79 def add_base(self, base):
4.80 self.bases.append(base)
4.81 @@ -401,9 +412,14 @@
4.82 self[name] = None
4.83
4.84 def __repr__(self):
4.85 - return "Function(%r, %r, %r, %r, %r, location=%r)" % (
4.86 - self.name, self.parent_name, self.argnames, self.has_star, self.has_dstar, self.location
4.87 - )
4.88 + if self.location is not None:
4.89 + return "Function(%r, %r, %r, %r, %r, location=%r)" % (
4.90 + self.name, self.parent_name, self.argnames, self.has_star, self.has_dstar, self.location
4.91 + )
4.92 + else:
4.93 + return "Function(%r, %r, %r, %r, %r)" % (
4.94 + self.name, self.parent_name, self.argnames, self.has_star, self.has_dstar
4.95 + )
4.96
4.97 def make_global(self, name):
4.98 if name not in self.argnames and not self.has_key(name):
4.99 @@ -488,7 +504,10 @@
4.100 return self.name
4.101
4.102 def __repr__(self):
4.103 - return "Module(%r, location=%r)" % (self.name, self.location)
4.104 + if self.location is not None:
4.105 + return "Module(%r, location=%r)" % (self.name, self.location)
4.106 + else:
4.107 + return "Module(%r)" % self.name
4.108
4.109 # Attribute methods.
4.110
4.111 @@ -666,15 +685,19 @@
4.112 print "Class %r in %r is not global: ignored." % (node.name, self)
4.113 else:
4.114 cls = Class(node.name, self.get_parent().full_name(), self, node)
4.115 +
4.116 + # Visit the base class expressions, attempting to find concrete
4.117 + # definitions of classes.
4.118 +
4.119 for base in node.bases:
4.120 expr = self.dispatch(base)
4.121 if isinstance(expr, Attr):
4.122 if expr.assignments != 1:
4.123 - print "Base class %r for class %r in %r may not be constant." % (base, cls, self)
4.124 + raise InspectError(node, "Base class %r for %r in %r is not constant." % (base, cls, self))
4.125 else:
4.126 cls.add_base(expr.value)
4.127 else: # if expr is None:
4.128 - raise InspectError, "Base class %r for class %r in %r is not found: it may be hidden in some way." % (base, cls, self)
4.129 + raise InspectError(node, "Base class %r for %r in %r is not found: it may be hidden in some way." % (base, cls, self))
4.130
4.131 # Make a back reference from the node for code generation.
4.132
4.133 @@ -722,7 +745,7 @@
4.134
4.135 def visitFrom(self, node):
4.136 if self.importer is None:
4.137 - raise InspectError, "Please use the micropython.Importer class for code which uses the 'from' statement."
4.138 + raise InspectError(node, "Please use the micropython.Importer class for code which uses the 'from' statement.")
4.139
4.140 module = self.importer.load(node.modname, 1)
4.141
4.142 @@ -803,6 +826,9 @@
4.143 if self.namespaces:
4.144 for name in node.names:
4.145 self.namespaces[-1].make_global(name)
4.146 +
4.147 + # Record a global entry for the name in the module.
4.148 +
4.149 if not self.has_key(name):
4.150 self[name] = Global()
4.151
4.152 @@ -817,7 +843,7 @@
4.153
4.154 def visitImport(self, node):
4.155 if self.importer is None:
4.156 - raise InspectError, "Please use the micropython.Importer class for code which uses the 'import' statement."
4.157 + raise InspectError(node, "Please use the micropython.Importer class for code which uses the 'import' statement.")
4.158
4.159 for name, alias in node.names:
4.160 if alias is not None: