babby's first test

This commit is contained in:
Douglas Creager 2025-11-12 18:27:09 -05:00
parent 65d02e05c8
commit cad4a38ddf
3 changed files with 68 additions and 8 deletions

View file

@ -0,0 +1,16 @@
# Creating a specialization from a constraint set
```toml
[environment]
python-version = "3.12"
```
## initial tests
```py
from ty_extensions import ConstraintSet, generic_context
def f[T]():
# revealed: ty_extensions.Specialization[T@f = object]
reveal_type(generic_context(f).specialize_constrained(ConstraintSet.always()))
```

View file

@ -8220,7 +8220,7 @@ impl<'db> KnownInstanceType<'db> {
write!( write!(
f, f,
"ty_extensions.Specialization{}", "ty_extensions.Specialization{}",
specialization.display(self.db) specialization.display_full(self.db)
) )
} }
KnownInstanceType::UnionType(_) => f.write_str("types.UnionType"), KnownInstanceType::UnionType(_) => f.write_str("types.UnionType"),

View file

@ -991,37 +991,50 @@ impl Display for DisplayGenericContext<'_> {
} }
impl<'db> Specialization<'db> { impl<'db> Specialization<'db> {
pub fn display(&'db self, db: &'db dyn Db) -> DisplaySpecialization<'db> { pub fn display(self, db: &'db dyn Db) -> DisplaySpecialization<'db> {
self.display_short(db, TupleSpecialization::No, DisplaySettings::default()) self.display_short(db, TupleSpecialization::No, DisplaySettings::default())
} }
pub(crate) fn display_full(self, db: &'db dyn Db) -> DisplaySpecialization<'db> {
DisplaySpecialization {
specialization: self,
db,
tuple_specialization: TupleSpecialization::No,
settings: DisplaySettings::default(),
full: true,
}
}
/// Renders the specialization as it would appear in a subscript expression, e.g. `[int, str]`. /// Renders the specialization as it would appear in a subscript expression, e.g. `[int, str]`.
pub fn display_short( pub fn display_short(
&'db self, self,
db: &'db dyn Db, db: &'db dyn Db,
tuple_specialization: TupleSpecialization, tuple_specialization: TupleSpecialization,
settings: DisplaySettings<'db>, settings: DisplaySettings<'db>,
) -> DisplaySpecialization<'db> { ) -> DisplaySpecialization<'db> {
DisplaySpecialization { DisplaySpecialization {
types: self.types(db), specialization: self,
db, db,
tuple_specialization, tuple_specialization,
settings, settings,
full: false,
} }
} }
} }
pub struct DisplaySpecialization<'db> { pub struct DisplaySpecialization<'db> {
types: &'db [Type<'db>], specialization: Specialization<'db>,
db: &'db dyn Db, db: &'db dyn Db,
tuple_specialization: TupleSpecialization, tuple_specialization: TupleSpecialization,
settings: DisplaySettings<'db>, settings: DisplaySettings<'db>,
full: bool,
} }
impl Display for DisplaySpecialization<'_> { impl DisplaySpecialization<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { fn fmt_normal(&self, f: &mut Formatter<'_>) -> fmt::Result {
f.write_char('[')?; f.write_char('[')?;
for (idx, ty) in self.types.iter().enumerate() { let types = self.specialization.types(self.db);
for (idx, ty) in types.iter().enumerate() {
if idx > 0 { if idx > 0 {
f.write_str(", ")?; f.write_str(", ")?;
} }
@ -1032,6 +1045,37 @@ impl Display for DisplaySpecialization<'_> {
} }
f.write_char(']') f.write_char(']')
} }
fn fmt_full(&self, f: &mut Formatter<'_>) -> fmt::Result {
f.write_char('[')?;
let variables = self
.specialization
.generic_context(self.db)
.variables(self.db);
let types = self.specialization.types(self.db);
for (idx, (bound_typevar, ty)) in variables.zip(types).enumerate() {
if idx > 0 {
f.write_str(", ")?;
}
write!(
f,
"{} = {}",
bound_typevar.identity(self.db).display(self.db),
ty.display_with(self.db, self.settings.clone()),
)?;
}
f.write_char(']')
}
}
impl Display for DisplaySpecialization<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
if self.full {
self.fmt_full(f)
} else {
self.fmt_normal(f)
}
}
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]