1.1 --- a/inspector.py Thu Sep 08 18:07:42 2016 +0200
1.2 +++ b/inspector.py Thu Sep 08 18:34:23 2016 +0200
1.3 @@ -135,25 +135,36 @@
1.4 key = "%s.%s" % (path, name)
1.5 ref = self.get_resolved_object(key)
1.6 if ref:
1.7 - self.importer.all_name_references[key] = self.name_references[key] = ref
1.8 + self.set_name_reference(key, ref)
1.9 continue
1.10
1.11 - # Find global or built-in definitions.
1.12 + # Find global or known built-in definitions.
1.13
1.14 ref = self.get_resolved_global_or_builtin(name)
1.15 if ref:
1.16 - self.importer.all_name_references[key] = self.name_references[key] = ref
1.17 + self.set_name_reference(key, ref)
1.18 continue
1.19
1.20 - print >>sys.stderr, "Name not recognised: %s in %s" % (name, path)
1.21 - init_item(self.names_missing, path, set)
1.22 - self.names_missing[path].add(name)
1.23 + # Find presumed built-in definitions.
1.24 +
1.25 + ref = self.get_builtin(name)
1.26 + self.set_name_reference(key, ref)
1.27 +
1.28 + def set_name_reference(self, path, ref):
1.29 +
1.30 + "Map the given name 'path' to 'ref'."
1.31 +
1.32 + self.importer.all_name_references[path] = self.name_references[path] = ref
1.33
1.34 def get_resolved_global_or_builtin(self, name):
1.35
1.36 "Return the resolved global or built-in object with the given 'name'."
1.37
1.38 - return self.get_global(name) or self.importer.get_object("__builtins__.%s" % name)
1.39 + # In some circumstances, the name is neither global nor recognised by
1.40 + # the importer. It is then assumed to be a general built-in.
1.41 +
1.42 + return self.get_global(name) or \
1.43 + self.importer.get_object("__builtins__.%s" % name)
1.44
1.45 # Module structure traversal.
1.46
1.47 @@ -795,7 +806,7 @@
1.48 if ref:
1.49 return ResolvedNameRef(n.name, ref)
1.50
1.51 - # Global name.
1.52 + # Explicitly-declared global names.
1.53
1.54 elif self.in_function and n.name in self.scope_globals[path]:
1.55 return NameRef(n.name)
1.56 @@ -823,7 +834,7 @@
1.57 access_number = self.record_access_details(n.name, None, False)
1.58 return LocalNameRef(n.name, access_number)
1.59
1.60 - # Possible global name.
1.61 + # Possible global or built-in name.
1.62
1.63 else:
1.64 return NameRef(n.name)
2.1 --- a/modules.py Thu Sep 08 18:07:42 2016 +0200
2.2 +++ b/modules.py Thu Sep 08 18:34:23 2016 +0200
2.3 @@ -55,10 +55,9 @@
2.4 self.instance_attr_constants = {}
2.5 self.module_attrs = set()
2.6
2.7 - # Names used and missing.
2.8 + # Names used in each namespace.
2.9
2.10 self.names_used = {}
2.11 - self.names_missing = {}
2.12
2.13 # Function details.
2.14
2.15 @@ -363,7 +362,6 @@
2.16 self._get_instance_attrs(f)
2.17 self._get_instance_attr_constants(f)
2.18 self.from_lines(f, self.names_used) # "names used:"
2.19 - self.from_lines(f, self.names_missing) # "names missing:"
2.20 self._get_name_references(f)
2.21 self._get_initialised_names(f)
2.22 self._get_aliased_names(f)
2.23 @@ -797,7 +795,6 @@
2.24 print >>f, name, attrname, ref
2.25
2.26 self.to_lines(f, "names used:", self.names_used)
2.27 - self.to_lines(f, "names missing:", self.names_missing)
2.28
2.29 print >>f
2.30 print >>f, "name references:"
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
3.2 +++ b/tests/builtin_names.py Thu Sep 08 18:34:23 2016 +0200
3.3 @@ -0,0 +1,2 @@
3.4 +def f():
3.5 + StopIteration
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
4.2 +++ b/tests/builtin_names_bad.py Thu Sep 08 18:34:23 2016 +0200
4.3 @@ -0,0 +1,2 @@
4.4 +def f():
4.5 + StartIteration