1.1 --- a/importer.py Thu Dec 15 23:52:11 2016 +0100
1.2 +++ b/importer.py Fri Dec 16 00:51:05 2016 +0100
1.3 @@ -400,6 +400,7 @@
1.4
1.5 self.waiting = {}
1.6 self.depends = {}
1.7 + self.depend_refs = {}
1.8
1.9 for module in self.modules.values():
1.10
1.11 @@ -476,6 +477,7 @@
1.12
1.13 if not ref.static() or self.uses_dynamic_callable(ref):
1.14 self.add_provider(module_name, provider)
1.15 + self.add_dependency(module_name, provider, ref)
1.16
1.17 def add_provider(self, module_name, provider):
1.18
1.19 @@ -484,6 +486,13 @@
1.20 init_item(self.depends, module_name, set)
1.21 self.depends[module_name].add(provider)
1.22
1.23 + def add_dependency(self, module_name, provider, ref):
1.24 +
1.25 + "Add dependency details for 'module_name' and 'provider' involving 'ref'."
1.26 +
1.27 + init_item(self.depend_refs, (module_name, provider), set)
1.28 + self.depend_refs[(module_name, provider)].add(ref)
1.29 +
1.30 def require_providers(self, module_name):
1.31
1.32 """
1.33 @@ -555,11 +564,11 @@
1.34 for module_name in module_names:
1.35 usage[module_name] = 0
1.36
1.37 - for module_name, depend_names in self.depends.items():
1.38 + for module_name, depends in self.depends.items():
1.39 if module_name in module_names:
1.40 - for depend_name in depend_names:
1.41 - if depend_name in module_names:
1.42 - usage[depend_name] += 1
1.43 + for provider in depends:
1.44 + if provider in module_names:
1.45 + usage[provider] += 1
1.46
1.47 # Produce an ordering by obtaining exposed modules (required by modules
1.48 # already processed) and putting them at the start of the list.
1.49 @@ -614,7 +623,11 @@
1.50 l = []
1.51
1.52 for module_name, provider in mutual:
1.53 - l.append("(%s <-> %s)" % (module_name, provider))
1.54 + refs = self.depend_refs.get((module_name, provider)) or set()
1.55 + refs.update(self.depend_refs.get((provider, module_name)) or set())
1.56 + refs = list(refs)
1.57 + refs.sort()
1.58 + l.append("%s <-> %s\n %s" % (module_name, provider, "\n ".join(map(str, refs))))
1.59
1.60 raise ProgramError, "Modules may not depend on each other for non-static objects:\n%s" % "\n".join(l)
1.61