diff --git a/crates/red_knot_python_semantic/src/types.rs b/crates/red_knot_python_semantic/src/types.rs index 21278a423291a..f3c9adc920bdd 100644 --- a/crates/red_knot_python_semantic/src/types.rs +++ b/crates/red_knot_python_semantic/src/types.rs @@ -58,9 +58,7 @@ fn symbol_ty_by_id<'db>(db: &'db dyn Db, scope: ScopeId<'db>, symbol: ScopedSymb Some(bindings_ty( db, use_def.public_bindings(symbol), - use_def - .public_may_be_unbound(symbol) - .then_some(Type::Unknown), + use_def.public_may_be_unbound(symbol).then_some(Type::Never), )) } else { None @@ -72,9 +70,7 @@ fn symbol_ty_by_id<'db>(db: &'db dyn Db, scope: ScopeId<'db>, symbol: ScopedSymb bindings_ty( db, use_def.public_bindings(symbol), - use_def - .public_may_be_unbound(symbol) - .then_some(Type::Unbound), + use_def.public_may_be_unbound(symbol).then_some(Type::Never), ) } } diff --git a/crates/red_knot_python_semantic/src/types/infer.rs b/crates/red_knot_python_semantic/src/types/infer.rs index b2a0c3d768dd9..50666e3221502 100644 --- a/crates/red_knot_python_semantic/src/types/infer.rs +++ b/crates/red_knot_python_semantic/src/types/infer.rs @@ -3620,7 +3620,7 @@ mod tests { )?; // TODO: sys.version_info, and need to understand @final and @type_check_only - assert_public_ty(&db, "src/a.py", "x", "Unknown | EllipsisType"); + assert_public_ty(&db, "src/a.py", "x", "EllipsisType | Unknown"); Ok(()) } @@ -3952,6 +3952,40 @@ mod tests { Ok(()) } + #[test] + fn resolve_unbound_public() -> anyhow::Result<()> { + let mut db = setup_db(); + + db.write_dedented( + "src/a.py", + " + if flag: + x: int = 1 + ", + )?; + + assert_public_ty(&db, "src/a.py", "x", "int"); + + Ok(()) + } + + #[test] + fn resolve_unannotated_unbound_public() -> anyhow::Result<()> { + let mut db = setup_db(); + + db.write_dedented( + "src/a.py", + " + if flag: + x = 1 + ", + )?; + + assert_public_ty(&db, "src/a.py", "x", "Literal[1]"); + + Ok(()) + } + #[test] fn literal_int_arithmetic() -> anyhow::Result<()> { let mut db = setup_db(); @@ -5452,7 +5486,7 @@ mod tests { // TODO: once we support `sys.version_info` branches, // we can set `--target-version=py311` in this test // and the inferred type will just be `BaseExceptionGroup` --Alex - assert_public_ty(&db, "src/a.py", "e", "Unknown | BaseExceptionGroup"); + assert_public_ty(&db, "src/a.py", "e", "BaseExceptionGroup"); Ok(()) } @@ -5478,7 +5512,7 @@ mod tests { // and the inferred type will just be `BaseExceptionGroup` --Alex // // TODO more precise would be `ExceptionGroup[OSError]` --Alex - assert_public_ty(&db, "src/a.py", "e", "Unknown | BaseExceptionGroup"); + assert_public_ty(&db, "src/a.py", "e", "BaseExceptionGroup"); Ok(()) } @@ -5504,7 +5538,7 @@ mod tests { // and the inferred type will just be `BaseExceptionGroup` --Alex // // TODO more precise would be `ExceptionGroup[TypeError | AttributeError]` --Alex - assert_public_ty(&db, "src/a.py", "e", "Unknown | BaseExceptionGroup"); + assert_public_ty(&db, "src/a.py", "e", "BaseExceptionGroup"); Ok(()) }