From a52486fc98d62575f8ba571aa9093c163b1ddce1 Mon Sep 17 00:00:00 2001 From: Douglas Creager Date: Fri, 27 Dec 2024 15:14:33 -0500 Subject: [PATCH] Special-case ClassLiteral | ClassLiteral --- .../resources/mdtest/binary/classes.md | 2 +- crates/red_knot_python_semantic/src/types/infer.rs | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/crates/red_knot_python_semantic/resources/mdtest/binary/classes.md b/crates/red_knot_python_semantic/resources/mdtest/binary/classes.md index 464b2d3e7db92..9e25cc1f68ee7 100644 --- a/crates/red_knot_python_semantic/resources/mdtest/binary/classes.md +++ b/crates/red_knot_python_semantic/resources/mdtest/binary/classes.md @@ -13,7 +13,7 @@ python-version = "3.10" class A: ... class B: ... -reveal_type(A | B) # revealed: UnionType +reveal_type(A | B) # revealed: Literal[A, B] ``` ## Union of two classes (prior to 3.10) diff --git a/crates/red_knot_python_semantic/src/types/infer.rs b/crates/red_knot_python_semantic/src/types/infer.rs index cc98d293fc29f..00a838e137ece 100644 --- a/crates/red_knot_python_semantic/src/types/infer.rs +++ b/crates/red_knot_python_semantic/src/types/infer.rs @@ -70,7 +70,7 @@ use crate::types::{ }; use crate::unpack::Unpack; use crate::util::subscript::{PyIndex, PySlice}; -use crate::Db; +use crate::{Db, Program, PythonVersion}; use super::context::{InferContext, WithDiagnostics}; use super::diagnostic::{ @@ -3361,6 +3361,12 @@ impl<'db> TypeInferenceBuilder<'db> { (Type::Never, _, _) | (_, Type::Never, _) => Some(Type::Never), (Type::Unknown, _, _) | (_, Type::Unknown, _) => Some(Type::Unknown), + (Type::ClassLiteral(_), Type::ClassLiteral(_), ast::Operator::BitOr) + if Program::get(self.db()).python_version(self.db()) >= PythonVersion::PY310 => + { + Some(UnionType::from_elements(self.db(), [left_ty, right_ty])) + } + (Type::IntLiteral(n), Type::IntLiteral(m), ast::Operator::Add) => Some( n.checked_add(m) .map(Type::IntLiteral)