1.1 --- a/importer.py Mon Dec 12 22:33:15 2016 +0100
1.2 +++ b/importer.py Mon Dec 12 23:33:28 2016 +0100
1.3 @@ -405,7 +405,16 @@
1.4
1.5 # Resolve all deferred references in each module.
1.6
1.7 + original_deferred = []
1.8 +
1.9 for ref in module.deferred:
1.10 +
1.11 + # Retain original references for caching.
1.12 +
1.13 + original_deferred.append(ref.copy())
1.14 +
1.15 + # Update references throughout the program.
1.16 +
1.17 found = self.find_dependency(ref)
1.18 if not found:
1.19 self.missing.add((module.name, ref.get_origin()))
1.20 @@ -450,6 +459,8 @@
1.21 init_item(self.depends, module.name, set)
1.22 self.depends[module.name].add(provider)
1.23
1.24 + module.deferred = original_deferred
1.25 +
1.26 # Check modules again to see if they are now required and should now
1.27 # cause the inclusion of other modules providing objects to the program.
1.28
2.1 --- a/modules.py Mon Dec 12 22:33:15 2016 +0100
2.2 +++ b/modules.py Mon Dec 12 23:33:28 2016 +0100
2.3 @@ -378,6 +378,7 @@
2.4 f.readline() # (empty line)
2.5
2.6 self._get_imports(f)
2.7 + self._get_deferred(f)
2.8 self._get_special(f)
2.9 self._get_members(f)
2.10 self._get_class_relationships(f)
2.11 @@ -420,6 +421,12 @@
2.12 for name in self.imports:
2.13 self.queue_module(name)
2.14
2.15 + def _get_deferred(self, f):
2.16 + f.readline() # "deferred:"
2.17 + line = f.readline().rstrip()
2.18 + self.deferred = map(decode_reference, line.split(" "))
2.19 + f.readline()
2.20 +
2.21 def _get_special(self, f):
2.22 f.readline() # "special:"
2.23 line = f.readline().rstrip()
2.24 @@ -684,6 +691,8 @@
2.25 "imports:"
2.26 required module names
2.27 possibly required module names
2.28 + "deferred:"
2.29 + deferred references
2.30 "special:"
2.31 zero or more: special name " " reference
2.32 (empty line)
2.33 @@ -789,6 +798,10 @@
2.34 print >>f, imports and ", ".join(imports) or "{}"
2.35
2.36 print >>f
2.37 + print >>f, "deferred:"
2.38 + print >>f, " ".join(map(str, self.deferred))
2.39 +
2.40 + print >>f
2.41 print >>f, "special:"
2.42 names = self.special.keys()
2.43 names.sort()
3.1 --- a/referencing.py Mon Dec 12 22:33:15 2016 +0100
3.2 +++ b/referencing.py Mon Dec 12 23:33:28 2016 +0100
3.3 @@ -143,6 +143,12 @@
3.4
3.5 return Reference("<var>", None, self.name)
3.6
3.7 + def copy(self):
3.8 +
3.9 + "Copy this reference."
3.10 +
3.11 + return Reference(self.get_kind(), self.get_origin(), self.get_name())
3.12 +
3.13 def alias(self, name):
3.14
3.15 "Alias this reference employing 'name'."