1.1 --- a/importer.py Tue Sep 06 17:18:11 2016 +0200
1.2 +++ b/importer.py Tue Sep 06 23:38:05 2016 +0200
1.3 @@ -336,32 +336,51 @@
1.4
1.5 "Resolve dependencies between modules."
1.6
1.7 - for d in [self.objects, self.all_name_references]:
1.8 - resolved = {}
1.9 + self.waiting = {}
1.10 +
1.11 + for module in self.modules.values():
1.12 +
1.13 + # Resolve all deferred references in each module.
1.14
1.15 - for name, ref in d.items():
1.16 - if ref.has_kind("<depends>"):
1.17 - found = self.find_dependency(ref)
1.18 - if found:
1.19 - resolved[name] = found
1.20 - else:
1.21 - print >>sys.stderr, "Name %s references an unknown object: %s" % (name, ref.get_origin())
1.22 + for ref in module.deferred:
1.23 + found = self.find_dependency(ref)
1.24 + if not found:
1.25 + print >>sys.stderr, "Module %s references an unknown object: %s" % (module.name, ref.get_origin())
1.26 +
1.27 + # Record the resolved names and identify required modules.
1.28
1.29 - # Record the resolved names and identify required modules.
1.30 + else:
1.31 + ref.mutate(found)
1.32 +
1.33 + # Find the providing module of this reference.
1.34 +
1.35 + provider = self.get_module_provider(ref)
1.36 + if provider:
1.37
1.38 - for name, ref in resolved.items():
1.39 - d[name] = ref
1.40 + module.required.add(provider)
1.41 + self.accessing_modules[provider].add(module.name)
1.42 +
1.43 + # Postpone any inclusion of the provider until this
1.44 + # module becomes required.
1.45
1.46 - # Find the providing module of this reference.
1.47 + if module.name not in self.required:
1.48 + init_item(self.waiting, module.name, set)
1.49 + self.waiting[module.name].add(provider)
1.50 +
1.51 + # Make this module required in the accessing module.
1.52
1.53 - module_name = self.get_module_provider(ref)
1.54 - if module_name:
1.55 - self.required.add(module_name)
1.56 + else:
1.57 + self.required.add(provider)
1.58 +
1.59 + for module_name in self.waiting.keys():
1.60 + self.require_providers(module_name)
1.61
1.62 - # Make this module required in all accessing modules.
1.63 -
1.64 - for accessor_name in self.accessing_modules[module_name]:
1.65 - self.modules[accessor_name].required.add(module_name)
1.66 + def require_providers(self, module_name):
1.67 + if module_name in self.required and self.waiting.has_key(module_name):
1.68 + for provider in self.waiting[module_name]:
1.69 + if provider not in self.required:
1.70 + self.required.add(provider)
1.71 + self.require_providers(provider)
1.72
1.73 def find_dependency(self, ref):
1.74
1.75 @@ -370,7 +389,7 @@
1.76 found = set()
1.77 while ref and ref.has_kind("<depends>") and not ref in found:
1.78 found.add(ref)
1.79 - ref = self.objects.get(ref.get_origin())
1.80 + ref = self.identify(ref.get_origin())
1.81 return ref
1.82
1.83 def get_module_provider(self, ref):