Skip to content

Commit b8bc2e4

Browse files
committed
improve
1 parent 06ca8f5 commit b8bc2e4

File tree

1 file changed

+20
-18
lines changed

1 file changed

+20
-18
lines changed

crates/ty_python_semantic/src/types.rs

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ use crate::types::constraints::{
4545
use crate::types::context::{LintDiagnosticGuard, LintDiagnosticGuardBuilder};
4646
use crate::types::diagnostic::{INVALID_AWAIT, INVALID_TYPE_FORM, UNSUPPORTED_BOOL_CONVERSION};
4747
pub use crate::types::display::DisplaySettings;
48-
use crate::types::enums::{enum_member_literals, enum_metadata, is_single_member_enum};
48+
use crate::types::enums::{enum_metadata, is_single_member_enum};
4949
use crate::types::function::{
5050
DataclassTransformerParams, FunctionDecorators, FunctionSpans, FunctionType, KnownFunction,
5151
};
@@ -4987,23 +4987,29 @@ impl<'db> Type<'db> {
49874987
}
49884988
Type::StringLiteral(string_literal_ty) => {
49894989
let string_literal = string_literal_ty.value(db);
4990-
if string_literal.len() < MAX_TUPLE_LENGTH {
4991-
return Ok(Cow::Owned(TupleSpec::heterogeneous(
4990+
let spec = if string_literal.len() < MAX_TUPLE_LENGTH {
4991+
TupleSpec::heterogeneous(
49924992
string_literal
49934993
.chars()
49944994
.map(|c| Type::string_literal(db, &c.to_string())),
4995-
)));
4996-
}
4995+
)
4996+
} else {
4997+
TupleSpec::homogeneous(self)
4998+
};
4999+
return Ok(Cow::Owned(spec));
49975000
}
49985001
Type::BytesLiteral(bytes) => {
49995002
let bytes_literal = bytes.value(db);
5000-
if bytes_literal.len() < MAX_TUPLE_LENGTH {
5001-
return Ok(Cow::Owned(TupleSpec::heterogeneous(
5003+
let spec = if bytes_literal.len() < MAX_TUPLE_LENGTH {
5004+
TupleSpec::heterogeneous(
50025005
bytes_literal
50035006
.iter()
50045007
.map(|b| Type::IntLiteral(i64::from(*b))),
5005-
)));
5006-
}
5008+
)
5009+
} else {
5010+
TupleSpec::homogeneous(self)
5011+
};
5012+
return Ok(Cow::Owned(spec));
50075013
}
50085014
Type::Never => {
50095015
// The dunder logic below would have us return `tuple[Never, ...]`, which eagerly
@@ -5028,15 +5034,6 @@ impl<'db> Type<'db> {
50285034
"should not be able to iterate over type variable {} in inferable position",
50295035
self.display(db)
50305036
),
5031-
Type::ClassLiteral(class) => {
5032-
if let Some(enum_members) = enum_member_literals(db, class, None) {
5033-
if enum_metadata(db, class)
5034-
.is_some_and(|metadata| metadata.members.len() < MAX_TUPLE_LENGTH)
5035-
{
5036-
return Ok(Cow::Owned(TupleSpec::heterogeneous(enum_members)));
5037-
}
5038-
}
5039-
}
50405037
Type::Dynamic(_)
50415038
| Type::FunctionLiteral(_)
50425039
| Type::GenericAlias(_)
@@ -5047,6 +5044,11 @@ impl<'db> Type<'db> {
50475044
| Type::DataclassTransformer(_)
50485045
| Type::Callable(_)
50495046
| Type::ModuleLiteral(_)
5047+
// We could infer a precise tuple spec for enum classes with members,
5048+
// but it's not clear whether that's worth the added complexity:
5049+
// you'd have to check that `EnumMeta.__iter__` is not overridden for it to be sound
5050+
// (enums can have `EnumMeta` subclasses as their metaclasses).
5051+
| Type::ClassLiteral(_)
50505052
| Type::SubclassOf(_)
50515053
| Type::ProtocolInstance(_)
50525054
| Type::SpecialForm(_)

0 commit comments

Comments
 (0)