1.1 --- a/inspector.py Sun Sep 04 19:24:17 2016 +0200
1.2 +++ b/inspector.py Sun Sep 04 20:41:09 2016 +0200
1.3 @@ -466,7 +466,7 @@
1.4 if module_name == self.name:
1.5 raise InspectError("Cannot import from the current module.", path, n)
1.6
1.7 - self.importer.queue_module(module_name, self)
1.8 + self.queue_module(module_name)
1.9
1.10 # Attempt to obtain the referenced objects.
1.11
1.12 @@ -645,7 +645,7 @@
1.13 raise InspectError("Imported modules must be aliased unless a simple module is imported.", path, n)
1.14
1.15 self.set_module(alias or name.split(".")[-1], name)
1.16 - self.importer.queue_module(name, self, True)
1.17 + self.queue_module(name, True)
1.18
1.19 def process_invocation_node(self, n):
1.20
2.1 --- a/modules.py Sun Sep 04 19:24:17 2016 +0200
2.2 +++ b/modules.py Sun Sep 04 20:41:09 2016 +0200
2.3 @@ -33,6 +33,11 @@
2.4 def __init__(self, name, importer):
2.5 CommonModule.__init__(self, name, importer)
2.6
2.7 + # Import details, primarily for cache output.
2.8 +
2.9 + self.imports = set()
2.10 + self.required = set()
2.11 +
2.12 # Global name information.
2.13
2.14 self.objects = {}
2.15 @@ -235,7 +240,7 @@
2.16
2.17 "Return a reference to the built-in with the given 'name'."
2.18
2.19 - self.importer.queue_module("__builtins__", self)
2.20 + self.queue_module("__builtins__")
2.21 return Reference("<depends>", "__builtins__.%s" % name)
2.22
2.23 def get_builtin_class(self, name):
2.24 @@ -271,9 +276,22 @@
2.25 "Import 'name' from the module having the given 'module_name'."
2.26
2.27 if module_name != self.name:
2.28 - self.importer.queue_module(module_name, self)
2.29 + self.queue_module(module_name)
2.30 return Reference("<depends>", "%s.%s" % (module_name, name))
2.31
2.32 + def queue_module(self, name, required=False):
2.33 +
2.34 + """
2.35 + Queue the module with the given 'name'. If 'required' is true (it is
2.36 + false by default), indicate that the module is required in the final
2.37 + program.
2.38 + """
2.39 +
2.40 + self.importer.queue_module(name, self, required)
2.41 + if required:
2.42 + self.required.add(name)
2.43 + self.imports.add(name)
2.44 +
2.45 class CachedModule(BasicModule):
2.46
2.47 "A cached module."
2.48 @@ -300,6 +318,7 @@
2.49
2.50 f.readline() # (empty line)
2.51
2.52 + self._get_imports(f)
2.53 self._get_members(f)
2.54 self._get_class_relationships(f)
2.55 self._get_instance_attrs(f)
2.56 @@ -329,6 +348,19 @@
2.57 def complete(self):
2.58 self.propagate()
2.59
2.60 + def _get_imports(self, f):
2.61 + f.readline() # "imports:"
2.62 + line = f.readline().strip()
2.63 + self.required = line != "{}" and set(line.split(", ")) or set()
2.64 + line = f.readline().strip()
2.65 + self.imports = line != "{}" and set(line.split(", ")) or set()
2.66 + f.readline()
2.67 +
2.68 + for name in self.required:
2.69 + self.queue_module(name, True)
2.70 + for name in self.imports:
2.71 + self.queue_module(name)
2.72 +
2.73 def _get_members(self, f):
2.74 f.readline() # "members:"
2.75 line = f.readline().rstrip()
2.76 @@ -588,6 +620,9 @@
2.77
2.78 filename
2.79 (empty line)
2.80 + "imports:"
2.81 + required module names
2.82 + possibly required module names
2.83 "members:"
2.84 zero or more: qualified name " " reference
2.85 (empty line)
2.86 @@ -684,6 +719,15 @@
2.87 print >>f, self.filename
2.88
2.89 print >>f
2.90 + print >>f, "imports:"
2.91 + required = list(self.required)
2.92 + required.sort()
2.93 + print >>f, required and ", ".join(required) or "{}"
2.94 + imports = list(self.imports)
2.95 + imports.sort()
2.96 + print >>f, imports and ", ".join(imports) or "{}"
2.97 +
2.98 + print >>f
2.99 print >>f, "members:"
2.100 objects = self.objects.keys()
2.101 objects.sort()