1.1 --- a/micropython/inspect.py Tue Aug 31 00:59:16 2010 +0200
1.2 +++ b/micropython/inspect.py Sat Sep 04 00:55:37 2010 +0200
1.3 @@ -416,7 +416,7 @@
1.4 module = attr.get_value()
1.5 return module
1.6
1.7 - def _visitUnary(self, node):
1.8 + def _visitOperator(self, node):
1.9
1.10 "Accounting method for the operator 'node'."
1.11
1.12 @@ -425,7 +425,45 @@
1.13 self.use_specific_attribute(operator_module.full_name(), operator_fn)
1.14 return self.OP(node)
1.15
1.16 - _visitBinary = _visitUnary
1.17 + _visitBinary = _visitOperator
1.18 + _visitUnary = _visitOperator
1.19 +
1.20 + def _visitAttr(self, expr, attrname, node):
1.21 +
1.22 + # Attempt to identify the nature of the attribute.
1.23 +
1.24 + if isinstance(expr, Attr):
1.25 + value = expr.get_value()
1.26 +
1.27 + # Get the attribute and record its usage.
1.28 +
1.29 + if isinstance(value, (Class, Module)):
1.30 + attr = value.get(attrname)
1.31 + self.use_specific_attribute(value.full_name(), attrname)
1.32 +
1.33 + elif isinstance(value, UnresolvedName):
1.34 + attr = UnresolvedName(attrname, value.full_name(), self)
1.35 +
1.36 + else:
1.37 + attr = None
1.38 +
1.39 + # Note usage of the attribute where a local is involved.
1.40 +
1.41 + if expr.parent is self.get_namespace():
1.42 + node._attrusers = self.use_attribute(expr.name, attrname)
1.43 + node._username = expr.name
1.44 + else:
1.45 + self.use_name(attrname, node.expr)
1.46 +
1.47 + elif self.builtins is not None:
1.48 + attr = self.builtins.get(attrname)
1.49 + self.use_specific_attribute(self.builtins.full_name(), attrname)
1.50 +
1.51 + else:
1.52 + attr = None
1.53 + self.use_name(attrname, node)
1.54 +
1.55 + return attr
1.56
1.57 def _visitFunction(self, node, name):
1.58
1.59 @@ -806,40 +844,7 @@
1.60 def visitGetattr(self, node):
1.61 expr = self.dispatch(node.expr)
1.62 attrname = node.attrname
1.63 -
1.64 - # Attempt to identify the nature of the attribute.
1.65 -
1.66 - if isinstance(expr, Attr):
1.67 - value = expr.get_value()
1.68 -
1.69 - # Get the attribute and record its usage.
1.70 -
1.71 - if isinstance(value, (Class, Module)):
1.72 - attr = value.get(attrname)
1.73 - self.use_specific_attribute(value.full_name(), attrname)
1.74 -
1.75 - elif isinstance(value, UnresolvedName):
1.76 - attr = UnresolvedName(attrname, value.full_name(), self)
1.77 -
1.78 - else:
1.79 - attr = None
1.80 -
1.81 - # Note usage of the attribute where a local is involved.
1.82 -
1.83 - if expr.parent is self.get_namespace():
1.84 - node._attrusers = self.use_attribute(expr.name, attrname)
1.85 - node._username = expr.name
1.86 - else:
1.87 - self.use_name(attrname, node.expr)
1.88 -
1.89 - elif self.builtins is not None:
1.90 - attr = self.builtins.get(attrname)
1.91 - self.use_specific_attribute(self.builtins.full_name(), attrname)
1.92 -
1.93 - else:
1.94 - attr = UnresolvedName(attrname, value.full_name(), self)
1.95 -
1.96 - return attr
1.97 + return self._visitAttr(expr, attrname, node)
1.98
1.99 def visitGlobal(self, node):
1.100 if self.namespaces:
1.101 @@ -972,9 +977,15 @@
1.102 visitRightShift = _visitBinary
1.103
1.104 def visitSlice(self, node):
1.105 + expr = self.dispatch(node.expr)
1.106 + self._visitAttr(expr, "__getitem__", node)
1.107 +
1.108 + if node.lower is not None:
1.109 + self.dispatch(node.lower)
1.110 + if node.upper is not None:
1.111 + self.dispatch(node.upper)
1.112 +
1.113 self.use_specific_attribute("__builtins__", "slice")
1.114 - self.use_name("__getitem__", node)
1.115 - self.OP(node)
1.116
1.117 visitSliceobj = OP
1.118
1.119 @@ -986,8 +997,11 @@
1.120 visitSub = _visitBinary
1.121
1.122 def visitSubscript(self, node):
1.123 - self.use_name("__getitem__", node)
1.124 - self.OP(node)
1.125 + expr = self.dispatch(node.expr)
1.126 + self._visitAttr(expr, "__getitem__", node)
1.127 +
1.128 + for sub in node.subs:
1.129 + self.dispatch(sub)
1.130
1.131 def visitTryExcept(self, node):
1.132 self.dispatch(node.body)