[ty] Only consider a type T a subtype of a protocol P if all of P's members are fully bound on T (#18466)

## Summary

Fixes https://github.com/astral-sh/ty/issues/578

## Test Plan

mdtests
This commit is contained in:
Alex Waygood 2025-06-04 20:39:14 +01:00 committed by GitHub
parent 3a8191529c
commit 5a8cdab771
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 29 additions and 8 deletions

View file

@ -4,7 +4,7 @@ use std::marker::PhantomData;
use super::protocol_class::ProtocolInterface;
use super::{ClassType, KnownClass, SubclassOfType, Type};
use crate::symbol::{Symbol, SymbolAndQualifiers};
use crate::symbol::{Boundness, Symbol, SymbolAndQualifiers};
use crate::types::{ClassLiteral, TypeMapping, TypeVarInstance};
use crate::{Db, FxOrderSet};
@ -45,12 +45,12 @@ impl<'db> Type<'db> {
protocol: ProtocolInstanceType<'db>,
) -> bool {
// TODO: this should consider the types of the protocol members
// as well as whether each member *exists* on `self`.
protocol
.inner
.interface(db)
.members(db)
.all(|member| !self.member(db, member.name()).symbol.is_unbound())
protocol.inner.interface(db).members(db).all(|member| {
matches!(
self.member(db, member.name()).symbol,
Symbol::Type(_, Boundness::Bound)
)
})
}
}