1.1 --- a/modules.py Sun Sep 04 19:24:17 2016 +0200
1.2 +++ b/modules.py Sun Sep 04 20:41:09 2016 +0200
1.3 @@ -33,6 +33,11 @@
1.4 def __init__(self, name, importer):
1.5 CommonModule.__init__(self, name, importer)
1.6
1.7 + # Import details, primarily for cache output.
1.8 +
1.9 + self.imports = set()
1.10 + self.required = set()
1.11 +
1.12 # Global name information.
1.13
1.14 self.objects = {}
1.15 @@ -235,7 +240,7 @@
1.16
1.17 "Return a reference to the built-in with the given 'name'."
1.18
1.19 - self.importer.queue_module("__builtins__", self)
1.20 + self.queue_module("__builtins__")
1.21 return Reference("<depends>", "__builtins__.%s" % name)
1.22
1.23 def get_builtin_class(self, name):
1.24 @@ -271,9 +276,22 @@
1.25 "Import 'name' from the module having the given 'module_name'."
1.26
1.27 if module_name != self.name:
1.28 - self.importer.queue_module(module_name, self)
1.29 + self.queue_module(module_name)
1.30 return Reference("<depends>", "%s.%s" % (module_name, name))
1.31
1.32 + def queue_module(self, name, required=False):
1.33 +
1.34 + """
1.35 + Queue the module with the given 'name'. If 'required' is true (it is
1.36 + false by default), indicate that the module is required in the final
1.37 + program.
1.38 + """
1.39 +
1.40 + self.importer.queue_module(name, self, required)
1.41 + if required:
1.42 + self.required.add(name)
1.43 + self.imports.add(name)
1.44 +
1.45 class CachedModule(BasicModule):
1.46
1.47 "A cached module."
1.48 @@ -300,6 +318,7 @@
1.49
1.50 f.readline() # (empty line)
1.51
1.52 + self._get_imports(f)
1.53 self._get_members(f)
1.54 self._get_class_relationships(f)
1.55 self._get_instance_attrs(f)
1.56 @@ -329,6 +348,19 @@
1.57 def complete(self):
1.58 self.propagate()
1.59
1.60 + def _get_imports(self, f):
1.61 + f.readline() # "imports:"
1.62 + line = f.readline().strip()
1.63 + self.required = line != "{}" and set(line.split(", ")) or set()
1.64 + line = f.readline().strip()
1.65 + self.imports = line != "{}" and set(line.split(", ")) or set()
1.66 + f.readline()
1.67 +
1.68 + for name in self.required:
1.69 + self.queue_module(name, True)
1.70 + for name in self.imports:
1.71 + self.queue_module(name)
1.72 +
1.73 def _get_members(self, f):
1.74 f.readline() # "members:"
1.75 line = f.readline().rstrip()
1.76 @@ -588,6 +620,9 @@
1.77
1.78 filename
1.79 (empty line)
1.80 + "imports:"
1.81 + required module names
1.82 + possibly required module names
1.83 "members:"
1.84 zero or more: qualified name " " reference
1.85 (empty line)
1.86 @@ -684,6 +719,15 @@
1.87 print >>f, self.filename
1.88
1.89 print >>f
1.90 + print >>f, "imports:"
1.91 + required = list(self.required)
1.92 + required.sort()
1.93 + print >>f, required and ", ".join(required) or "{}"
1.94 + imports = list(self.imports)
1.95 + imports.sort()
1.96 + print >>f, imports and ", ".join(imports) or "{}"
1.97 +
1.98 + print >>f
1.99 print >>f, "members:"
1.100 objects = self.objects.keys()
1.101 objects.sort()