# HG changeset patch # User Paul Boddie # Date 1473014469 -7200 # Node ID 96af70f89c46d7a31bea22e77fdaeb6660e3eeca # Parent 363caea72ee4511ed6ee90e378f0f6333b0417c1 Re-introduced import information to modules to assist cached module loading. diff -r 363caea72ee4 -r 96af70f89c46 inspector.py --- a/inspector.py Sun Sep 04 19:24:17 2016 +0200 +++ b/inspector.py Sun Sep 04 20:41:09 2016 +0200 @@ -466,7 +466,7 @@ if module_name == self.name: raise InspectError("Cannot import from the current module.", path, n) - self.importer.queue_module(module_name, self) + self.queue_module(module_name) # Attempt to obtain the referenced objects. @@ -645,7 +645,7 @@ raise InspectError("Imported modules must be aliased unless a simple module is imported.", path, n) self.set_module(alias or name.split(".")[-1], name) - self.importer.queue_module(name, self, True) + self.queue_module(name, True) def process_invocation_node(self, n): diff -r 363caea72ee4 -r 96af70f89c46 modules.py --- a/modules.py Sun Sep 04 19:24:17 2016 +0200 +++ b/modules.py Sun Sep 04 20:41:09 2016 +0200 @@ -33,6 +33,11 @@ def __init__(self, name, importer): CommonModule.__init__(self, name, importer) + # Import details, primarily for cache output. + + self.imports = set() + self.required = set() + # Global name information. self.objects = {} @@ -235,7 +240,7 @@ "Return a reference to the built-in with the given 'name'." - self.importer.queue_module("__builtins__", self) + self.queue_module("__builtins__") return Reference("", "__builtins__.%s" % name) def get_builtin_class(self, name): @@ -271,9 +276,22 @@ "Import 'name' from the module having the given 'module_name'." if module_name != self.name: - self.importer.queue_module(module_name, self) + self.queue_module(module_name) return Reference("", "%s.%s" % (module_name, name)) + def queue_module(self, name, required=False): + + """ + Queue the module with the given 'name'. If 'required' is true (it is + false by default), indicate that the module is required in the final + program. + """ + + self.importer.queue_module(name, self, required) + if required: + self.required.add(name) + self.imports.add(name) + class CachedModule(BasicModule): "A cached module." @@ -300,6 +318,7 @@ f.readline() # (empty line) + self._get_imports(f) self._get_members(f) self._get_class_relationships(f) self._get_instance_attrs(f) @@ -329,6 +348,19 @@ def complete(self): self.propagate() + def _get_imports(self, f): + f.readline() # "imports:" + line = f.readline().strip() + self.required = line != "{}" and set(line.split(", ")) or set() + line = f.readline().strip() + self.imports = line != "{}" and set(line.split(", ")) or set() + f.readline() + + for name in self.required: + self.queue_module(name, True) + for name in self.imports: + self.queue_module(name) + def _get_members(self, f): f.readline() # "members:" line = f.readline().rstrip() @@ -588,6 +620,9 @@ filename (empty line) + "imports:" + required module names + possibly required module names "members:" zero or more: qualified name " " reference (empty line) @@ -684,6 +719,15 @@ print >>f, self.filename print >>f + print >>f, "imports:" + required = list(self.required) + required.sort() + print >>f, required and ", ".join(required) or "{}" + imports = list(self.imports) + imports.sort() + print >>f, imports and ", ".join(imports) or "{}" + + print >>f print >>f, "members:" objects = self.objects.keys() objects.sort()