1.1 --- a/micropython/data.py Sun Oct 27 01:00:27 2013 +0200
1.2 +++ b/micropython/data.py Sun Oct 27 01:02:05 2013 +0200
1.3 @@ -550,21 +550,39 @@
1.4 def __init__(self, position, parent, name, nodes):
1.5 BaseAttr.__init__(self, position, parent, name)
1.6 self.nodes = nodes or set()
1.7 + self.users = None
1.8 +
1.9 + def _get_defining_users(self):
1.10 + if self.users is None:
1.11 + users = set()
1.12 + visited = set()
1.13 + for node in self.nodes:
1.14 + self._get_defining_users_for_node(node, visited, users)
1.15 + self.users = users
1.16 + return self.users
1.17 +
1.18 + def _get_defining_users_for_node(self, node, visited, users):
1.19 + if node in visited:
1.20 + return
1.21 + visited.add(node)
1.22 + if not node._attrrevbranches:
1.23 + if node._values and node._values.has_key(self.name):
1.24 + users.add(node)
1.25 + return
1.26 + for n in node._attrrevbranches:
1.27 + self._get_defining_users_for_node(n, visited, users)
1.28
1.29 def get_assignments(self):
1.30 - # NOTE: Needs to consider loops.
1.31 - return len(self.nodes)
1.32 + return len(self._get_defining_users())
1.33
1.34 def get_context_values(self):
1.35 context_values = set()
1.36 - for node in self.nodes:
1.37 - for def_user in node._attrdefs or [node]:
1.38 - if def_user._values and def_user._values.has_key(self.name):
1.39 - attr = def_user._values[self.name]
1.40 - if isinstance(attr, BaseAttr):
1.41 - context_values.update(attr.get_context_values())
1.42 - else:
1.43 - context_values.add(get_context_and_value(attr))
1.44 + for def_user in self._get_defining_users():
1.45 + attr = def_user._values[self.name]
1.46 + if isinstance(attr, BaseAttr):
1.47 + context_values.update(attr.get_context_values())
1.48 + else:
1.49 + context_values.add(get_context_and_value(attr))
1.50 return context_values
1.51
1.52 class Attr(BaseAttr):