mirror of
https://github.com/astral-sh/ruff.git
synced 2025-11-24 05:50:21 +00:00
babby's first test
This commit is contained in:
parent
65d02e05c8
commit
cad4a38ddf
3 changed files with 68 additions and 8 deletions
|
|
@ -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()))
|
||||||
|
```
|
||||||
|
|
@ -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"),
|
||||||
|
|
|
||||||
|
|
@ -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)]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue