# HG changeset patch # User Paul Boddie # Date 1489338248 -3600 # Node ID 07bc2bf9377f85e707403b91c2cde845c2b27535 # Parent 8453ca48a9802964db68ee2e1c42e2e602324954 Propagate return values, making use of them in deduction. diff -r 8453ca48a980 -r 07bc2bf9377f deducer.py --- a/deducer.py Sun Mar 12 18:03:25 2017 +0100 +++ b/deducer.py Sun Mar 12 18:04:08 2017 +0100 @@ -1775,8 +1775,13 @@ "Convert 'ref' to a provider appropriate to its invocation result." - if ref and ref.has_kind(""): - return ref + if ref: + if ref.has_kind(""): + return ref + elif ref.has_kind(""): + refs = self.importer.all_return_values.get(ref.get_origin()) + if refs and len(refs) == 1: + return first(refs) return Reference("") @@ -1793,8 +1798,13 @@ "Convert 'ref' to its invocation result." - if ref and ref.has_kind(""): - return ref.instance_of() + if ref: + if ref.has_kind(""): + return ref.instance_of() + elif ref.has_kind(""): + refs = self.importer.all_return_values.get(ref.get_origin()) + if refs and len(refs) == 1: + return first(refs) return Reference("") diff -r 8453ca48a980 -r 07bc2bf9377f importer.py --- a/importer.py Sun Mar 12 18:03:25 2017 +0100 +++ b/importer.py Sun Mar 12 18:04:08 2017 +0100 @@ -116,6 +116,10 @@ self.all_constants = {} self.all_constant_values = {} + # Return values. + + self.all_return_values = {} + self.make_cache() def give_warning(self, name): diff -r 8453ca48a980 -r 07bc2bf9377f modules.py --- a/modules.py Sun Mar 12 18:03:25 2017 +0100 +++ b/modules.py Sun Mar 12 18:04:08 2017 +0100 @@ -115,6 +115,7 @@ self.propagate_name_references() self.propagate_attr_accesses() self.propagate_constants() + self.propagate_return_values() def unpropagate(self): @@ -151,6 +152,7 @@ remove_items(self.importer.all_attr_access_modifiers, self.attr_access_modifiers) remove_items(self.importer.all_constants, self.constants) remove_items(self.importer.all_constant_values, self.constant_values) + remove_items(self.importer.all_return_values, self.return_values) # Remove this module's objects from the importer. Objects are # automatically propagated when defined. @@ -220,6 +222,12 @@ self.importer.all_instance_attrs[name] = self.instance_attrs.get(name) or {} self.importer.all_instance_attr_constants[name] = self.instance_attr_constants.get(name) or {} + def propagate_return_values(self): + + "Propagate return values for the module." + + self.importer.all_return_values.update(self.return_values) + def set_object(self, name, value=None): "Set an object with the given 'name' and the given 'value'."