1.1 --- a/importer.py Sat Nov 12 23:27:04 2016 +0100
1.2 +++ b/importer.py Sat Nov 12 23:29:32 2016 +0100
1.3 @@ -187,7 +187,10 @@
1.4
1.5 "Identify 'name' using stored object and external name records."
1.6
1.7 - return self.objects.get(name) or self.all_name_references.get(name)
1.8 + ref = self.objects.get(name)
1.9 + if not ref or ref.has_kind("<module>"):
1.10 + ref = self.all_name_references.get(name) or ref
1.11 + return ref
1.12
1.13 # Indirect object retrieval.
1.14
1.15 @@ -342,7 +345,7 @@
1.16
1.17 # Record the type of all classes.
1.18
1.19 - self.type_ref = self.get_object("__builtins__.type")
1.20 + self.type_ref = self.get_object("__builtins__.core.type")
1.21
1.22 # Resolve dependencies within the program.
1.23
2.1 --- a/inspector.py Sat Nov 12 23:27:04 2016 +0100
2.2 +++ b/inspector.py Sat Nov 12 23:29:32 2016 +0100
2.3 @@ -134,7 +134,12 @@
2.4 # Find predefined constant names before anything else.
2.5
2.6 if name in predefined_constants:
2.7 - ref = self.get_builtin(name)
2.8 +
2.9 + # Predefined constants are imported within the built-ins.
2.10 +
2.11 + ref = self.get_imported_name(key)
2.12 + if not ref:
2.13 + ref = self.get_builtin(name)
2.14 self.set_name_reference(key, ref)
2.15 continue
2.16
2.17 @@ -152,6 +157,13 @@
2.18 self.set_name_reference(key, ref)
2.19 continue
2.20
2.21 + # Find imported name.
2.22 +
2.23 + ref = self.get_imported_name(key)
2.24 + if ref:
2.25 + self.set_name_reference(key, ref)
2.26 + continue
2.27 +
2.28 # Find presumed built-in definitions.
2.29
2.30 ref = self.get_builtin(name)
2.31 @@ -550,11 +562,11 @@
2.32 if name == "*":
2.33 raise InspectError("Only explicitly specified names can be imported from modules.", path, n)
2.34
2.35 - # Explicit names.
2.36 + # Reference names instead of setting them as locals.
2.37
2.38 ref = self.import_name_from_module(name, module_name)
2.39 - value = ResolvedNameRef(alias or name, ref)
2.40 - self.set_general_local(alias or name, value)
2.41 + self.set_imported_name(alias or name, ref)
2.42 + self.record_name(alias or name)
2.43
2.44 def process_function_node(self, n, name):
2.45
2.46 @@ -857,10 +869,14 @@
2.47 access_number = self.record_access_details(n.name, None, False, False)
2.48 return LocalNameRef(n.name, access_number)
2.49
2.50 - # Possible global or built-in name.
2.51 + # Possible imported, global or built-in name.
2.52
2.53 else:
2.54 - return NameRef(n.name)
2.55 + ref = self.get_imported_name(n.name)
2.56 + if ref:
2.57 + return ResolvedNameRef(n.name, ref)
2.58 + else:
2.59 + return NameRef(n.name)
2.60
2.61 def process_operator_chain(self, nodes, fn):
2.62
2.63 @@ -1281,8 +1297,19 @@
2.64 ref = None
2.65
2.66 if not self.in_function and name not in predefined_constants:
2.67 +
2.68 + # Search for class namespace members.
2.69 +
2.70 if self.in_class:
2.71 ref = self.get_object(self.get_object_path(name), False)
2.72 +
2.73 + # Search for imported names.
2.74 +
2.75 + if not ref:
2.76 + ref = self.get_imported_name(name)
2.77 +
2.78 + # Search for globals or built-in names.
2.79 +
2.80 if not ref:
2.81 ref = self.get_global_or_builtin(name)
2.82
3.1 --- a/modules.py Sat Nov 12 23:27:04 2016 +0100
3.2 +++ b/modules.py Sat Nov 12 23:29:32 2016 +0100
3.3 @@ -38,6 +38,7 @@
3.4 self.imports = set()
3.5 self.required = set()
3.6 self.deferred = []
3.7 + self.imported = {}
3.8
3.9 # Global name information.
3.10
3.11 @@ -338,6 +339,26 @@
3.12 if ref.has_kind("<depends>"):
3.13 self.deferred.append(ref)
3.14
3.15 + def get_imported_name(self, name):
3.16 +
3.17 + "Return a reference for 'name', imported from another module."
3.18 +
3.19 + if "." in name:
3.20 + path = name
3.21 + name = path.rsplit(".", 1)[-1]
3.22 + else:
3.23 + path = self.get_object_path(name)
3.24 +
3.25 + global_path = self.get_global_path(name)
3.26 + return self.imported.get(path) or self.imported.get(global_path)
3.27 +
3.28 + def set_imported_name(self, name, ref):
3.29 +
3.30 + "Establish a reference for 'name' given by 'ref'."
3.31 +
3.32 + path = self.get_object_path(name)
3.33 + self.imported[path] = ref
3.34 +
3.35 class CachedModule(BasicModule):
3.36
3.37 "A cached module."