1.1 --- a/micropython/inspect.py Wed Feb 06 01:28:11 2008 +0100
1.2 +++ b/micropython/inspect.py Sat Feb 09 02:35:57 2008 +0100
1.3 @@ -56,7 +56,9 @@
1.4
1.5 "An inspection error."
1.6
1.7 - pass
1.8 + def __init__(self, node, message):
1.9 + self.node = node
1.10 + self.message = message
1.11
1.12 class AtLeast:
1.13
1.14 @@ -120,21 +122,18 @@
1.15 return self.namespace.get(name, default)
1.16
1.17 def __setitem__(self, name, value):
1.18 -
1.19 - # Use a special method to access the namespace.
1.20 -
1.21 - if name not in self.globals:
1.22 - self.set(name, value)
1.23 - else:
1.24 - self.global_namespace.set(name, value, 0)
1.25 + self.set(name, value)
1.26
1.27 def set(self, name, value, single_assignment=1):
1.28 - attr = self._set(name, value)
1.29 + if name in self.globals:
1.30 + self.global_namespace.set(name, value, 0)
1.31 + else:
1.32 + attr = self._set(name, value)
1.33
1.34 - # NOTE: Insist on assignments with known values.
1.35 + # NOTE: Insist on assignments with known values.
1.36
1.37 - if value is not None:
1.38 - attr.update(value, single_assignment)
1.39 + if value is not None:
1.40 + attr.update(value, single_assignment)
1.41
1.42 def set_module(self, name, value):
1.43 attr = self._set(name, value)
1.44 @@ -175,6 +174,12 @@
1.45 else:
1.46 return None
1.47
1.48 + def to_list(self, d):
1.49 + l = [None] * len(d.keys())
1.50 + for attr in d.values():
1.51 + l[attr.position] = attr
1.52 + return l
1.53 +
1.54 class Naming:
1.55
1.56 "A mix-in providing naming conveniences."
1.57 @@ -230,7 +235,10 @@
1.58 self.location = None
1.59
1.60 def __repr__(self):
1.61 - return "Const(%r, location=%r)" % (self.value, self.location)
1.62 + if self.location is not None:
1.63 + return "Const(%r, location=%r)" % (self.value, self.location)
1.64 + else:
1.65 + return "Const(%r)" % self.value
1.66
1.67 def __eq__(self, other):
1.68 return self.value == other.value
1.69 @@ -264,7 +272,10 @@
1.70 self.code_location = None
1.71
1.72 def __repr__(self):
1.73 - return "Class(%r, %r, location=%r)" % (self.name, self.parent_name, self.location)
1.74 + if self.location is not None:
1.75 + return "Class(%r, %r, location=%r)" % (self.name, self.parent_name, self.location)
1.76 + else:
1.77 + return "Class(%r, %r)" % (self.name, self.parent_name)
1.78
1.79 def add_base(self, base):
1.80 self.bases.append(base)
1.81 @@ -401,9 +412,14 @@
1.82 self[name] = None
1.83
1.84 def __repr__(self):
1.85 - return "Function(%r, %r, %r, %r, %r, location=%r)" % (
1.86 - self.name, self.parent_name, self.argnames, self.has_star, self.has_dstar, self.location
1.87 - )
1.88 + if self.location is not None:
1.89 + return "Function(%r, %r, %r, %r, %r, location=%r)" % (
1.90 + self.name, self.parent_name, self.argnames, self.has_star, self.has_dstar, self.location
1.91 + )
1.92 + else:
1.93 + return "Function(%r, %r, %r, %r, %r)" % (
1.94 + self.name, self.parent_name, self.argnames, self.has_star, self.has_dstar
1.95 + )
1.96
1.97 def make_global(self, name):
1.98 if name not in self.argnames and not self.has_key(name):
1.99 @@ -488,7 +504,10 @@
1.100 return self.name
1.101
1.102 def __repr__(self):
1.103 - return "Module(%r, location=%r)" % (self.name, self.location)
1.104 + if self.location is not None:
1.105 + return "Module(%r, location=%r)" % (self.name, self.location)
1.106 + else:
1.107 + return "Module(%r)" % self.name
1.108
1.109 # Attribute methods.
1.110
1.111 @@ -666,15 +685,19 @@
1.112 print "Class %r in %r is not global: ignored." % (node.name, self)
1.113 else:
1.114 cls = Class(node.name, self.get_parent().full_name(), self, node)
1.115 +
1.116 + # Visit the base class expressions, attempting to find concrete
1.117 + # definitions of classes.
1.118 +
1.119 for base in node.bases:
1.120 expr = self.dispatch(base)
1.121 if isinstance(expr, Attr):
1.122 if expr.assignments != 1:
1.123 - print "Base class %r for class %r in %r may not be constant." % (base, cls, self)
1.124 + raise InspectError(node, "Base class %r for %r in %r is not constant." % (base, cls, self))
1.125 else:
1.126 cls.add_base(expr.value)
1.127 else: # if expr is None:
1.128 - raise InspectError, "Base class %r for class %r in %r is not found: it may be hidden in some way." % (base, cls, self)
1.129 + raise InspectError(node, "Base class %r for %r in %r is not found: it may be hidden in some way." % (base, cls, self))
1.130
1.131 # Make a back reference from the node for code generation.
1.132
1.133 @@ -722,7 +745,7 @@
1.134
1.135 def visitFrom(self, node):
1.136 if self.importer is None:
1.137 - raise InspectError, "Please use the micropython.Importer class for code which uses the 'from' statement."
1.138 + raise InspectError(node, "Please use the micropython.Importer class for code which uses the 'from' statement.")
1.139
1.140 module = self.importer.load(node.modname, 1)
1.141
1.142 @@ -803,6 +826,9 @@
1.143 if self.namespaces:
1.144 for name in node.names:
1.145 self.namespaces[-1].make_global(name)
1.146 +
1.147 + # Record a global entry for the name in the module.
1.148 +
1.149 if not self.has_key(name):
1.150 self[name] = Global()
1.151
1.152 @@ -817,7 +843,7 @@
1.153
1.154 def visitImport(self, node):
1.155 if self.importer is None:
1.156 - raise InspectError, "Please use the micropython.Importer class for code which uses the 'import' statement."
1.157 + raise InspectError(node, "Please use the micropython.Importer class for code which uses the 'import' statement.")
1.158
1.159 for name, alias in node.names:
1.160 if alias is not None: