def _combine_multiple_returns(self, signatures): """Combines multiple return types. Args: signatures: The candidate signatures. Returns: The combined return type. """ options = [] for sig, _, _ in signatures: t = sig.pytd_sig.return_type params = pytd_utils.GetTypeParameters(t) if params: replacement = {} for param_type in params: replacement[param_type] = pytd.AnythingType() replace_visitor = visitors.ReplaceTypeParameters(replacement) t = t.Visit(replace_visitor) options.append(t) if len(set(options)) == 1: return options[0] # Optimizing and then removing unions allows us to preserve as much # precision as possible while avoiding false positives. ret_type = optimize.Optimize(pytd_utils.JoinTypes(options)) return ret_type.Visit(visitors.ReplaceUnionsWithAny())
def testAnyReplacement(self): union = pytd.UnionType((pytd.NamedType("a"), pytd.NamedType("b"))) self.assertEqual( union.Visit(visitors.ReplaceUnionsWithAny()), pytd.AnythingType())