From 5bf5f3682a4c7a26d5cadace58dc7c94414bfe9e Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Tue, 13 May 2025 09:57:53 -0400 Subject: [PATCH] [ty] Add tests for `else` branches of `hasattr()` narrowing (#18067) ## Summary This addresses @sharkdp's post-merge review in https://github.com/astral-sh/ruff/pull/18053#discussion_r2086190617 ## Test Plan `cargo test -p ty_python_semantic` --- .../resources/mdtest/narrow/hasattr.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/crates/ty_python_semantic/resources/mdtest/narrow/hasattr.md b/crates/ty_python_semantic/resources/mdtest/narrow/hasattr.md index 2a231802da..b158912160 100644 --- a/crates/ty_python_semantic/resources/mdtest/narrow/hasattr.md +++ b/crates/ty_python_semantic/resources/mdtest/narrow/hasattr.md @@ -15,12 +15,24 @@ def f(x: Foo): if hasattr(x, "spam"): reveal_type(x) # revealed: Foo & reveal_type(x.spam) # revealed: object + else: + reveal_type(x) # revealed: Foo & ~ + + # TODO: should error and reveal `Unknown` + reveal_type(x.spam) # revealed: @Todo(map_with_boundness: intersections with negative contributions) if hasattr(x, "not-an-identifier"): reveal_type(x) # revealed: Foo + else: + reveal_type(x) # revealed: Foo def y(x: Bar): if hasattr(x, "spam"): reveal_type(x) # revealed: Never reveal_type(x.spam) # revealed: Never + else: + reveal_type(x) # revealed: Bar + + # error: [unresolved-attribute] + reveal_type(x.spam) # revealed: Unknown ```