# HG changeset patch # User Paul Boddie # Date 1473352463 -7200 # Node ID 1c505a028b7eaba98a1c8e65dbe9bd2d22320a5b # Parent 452b048ec4e93ba7295c64269eed02936a065a65 Fixed built-in name identification in functions, also removing the missing name recording in modules since unidentified names are considered as built-in names until all deferred references are identified. diff -r 452b048ec4e9 -r 1c505a028b7e inspector.py --- a/inspector.py Thu Sep 08 18:07:42 2016 +0200 +++ b/inspector.py Thu Sep 08 18:34:23 2016 +0200 @@ -135,25 +135,36 @@ key = "%s.%s" % (path, name) ref = self.get_resolved_object(key) if ref: - self.importer.all_name_references[key] = self.name_references[key] = ref + self.set_name_reference(key, ref) continue - # Find global or built-in definitions. + # Find global or known built-in definitions. ref = self.get_resolved_global_or_builtin(name) if ref: - self.importer.all_name_references[key] = self.name_references[key] = ref + self.set_name_reference(key, ref) continue - print >>sys.stderr, "Name not recognised: %s in %s" % (name, path) - init_item(self.names_missing, path, set) - self.names_missing[path].add(name) + # Find presumed built-in definitions. + + ref = self.get_builtin(name) + self.set_name_reference(key, ref) + + def set_name_reference(self, path, ref): + + "Map the given name 'path' to 'ref'." + + self.importer.all_name_references[path] = self.name_references[path] = ref def get_resolved_global_or_builtin(self, name): "Return the resolved global or built-in object with the given 'name'." - return self.get_global(name) or self.importer.get_object("__builtins__.%s" % name) + # In some circumstances, the name is neither global nor recognised by + # the importer. It is then assumed to be a general built-in. + + return self.get_global(name) or \ + self.importer.get_object("__builtins__.%s" % name) # Module structure traversal. @@ -795,7 +806,7 @@ if ref: return ResolvedNameRef(n.name, ref) - # Global name. + # Explicitly-declared global names. elif self.in_function and n.name in self.scope_globals[path]: return NameRef(n.name) @@ -823,7 +834,7 @@ access_number = self.record_access_details(n.name, None, False) return LocalNameRef(n.name, access_number) - # Possible global name. + # Possible global or built-in name. else: return NameRef(n.name) diff -r 452b048ec4e9 -r 1c505a028b7e modules.py --- a/modules.py Thu Sep 08 18:07:42 2016 +0200 +++ b/modules.py Thu Sep 08 18:34:23 2016 +0200 @@ -55,10 +55,9 @@ self.instance_attr_constants = {} self.module_attrs = set() - # Names used and missing. + # Names used in each namespace. self.names_used = {} - self.names_missing = {} # Function details. @@ -363,7 +362,6 @@ self._get_instance_attrs(f) self._get_instance_attr_constants(f) self.from_lines(f, self.names_used) # "names used:" - self.from_lines(f, self.names_missing) # "names missing:" self._get_name_references(f) self._get_initialised_names(f) self._get_aliased_names(f) @@ -797,7 +795,6 @@ print >>f, name, attrname, ref self.to_lines(f, "names used:", self.names_used) - self.to_lines(f, "names missing:", self.names_missing) print >>f print >>f, "name references:" diff -r 452b048ec4e9 -r 1c505a028b7e tests/builtin_names.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/builtin_names.py Thu Sep 08 18:34:23 2016 +0200 @@ -0,0 +1,2 @@ +def f(): + StopIteration diff -r 452b048ec4e9 -r 1c505a028b7e tests/builtin_names_bad.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/builtin_names_bad.py Thu Sep 08 18:34:23 2016 +0200 @@ -0,0 +1,2 @@ +def f(): + StartIteration