diff --git a/crates/ty_ide/src/inlay_hints.rs b/crates/ty_ide/src/inlay_hints.rs index 3b7c351632..26ae12a844 100644 --- a/crates/ty_ide/src/inlay_hints.rs +++ b/crates/ty_ide/src/inlay_hints.rs @@ -1422,6 +1422,26 @@ mod tests { 5 | self.y[: Unknown] = y | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:5:18 + | + 3 | def __init__(self, y): + 4 | self.x[: int] = int(1) + 5 | self.y[: Unknown] = y + | ^^^^^^^ + 6 | + 7 | a[: A] = A([y=]2) + | + info[inlay-hint-location]: Inlay Hint Target --> main.py:2:7 | @@ -1659,6 +1679,24 @@ mod tests { 4 | c[: list[Unknown | bool]] = [True, False] | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:2:10 + | + 2 | a[: list[Unknown | int]] = [1, 2] + | ^^^^^^^ + 3 | b[: list[Unknown | float]] = [1.0, 2.0] + 4 | c[: list[Unknown | bool]] = [True, False] + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:348:7 | @@ -1695,6 +1733,25 @@ mod tests { 5 | d[: list[Unknown | None]] = [None, None] | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:3:10 + | + 2 | a[: list[Unknown | int]] = [1, 2] + 3 | b[: list[Unknown | float]] = [1.0, 2.0] + | ^^^^^^^ + 4 | c[: list[Unknown | bool]] = [True, False] + 5 | d[: list[Unknown | None]] = [None, None] + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:661:7 | @@ -1732,6 +1789,26 @@ mod tests { 6 | e[: list[Unknown | str]] = ["hel", "lo"] | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:4:10 + | + 2 | a[: list[Unknown | int]] = [1, 2] + 3 | b[: list[Unknown | float]] = [1.0, 2.0] + 4 | c[: list[Unknown | bool]] = [True, False] + | ^^^^^^^ + 5 | d[: list[Unknown | None]] = [None, None] + 6 | e[: list[Unknown | str]] = ["hel", "lo"] + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:2591:7 | @@ -1771,6 +1848,26 @@ mod tests { 7 | f[: list[Unknown | str]] = ['the', 're'] | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:5:10 + | + 3 | b[: list[Unknown | float]] = [1.0, 2.0] + 4 | c[: list[Unknown | bool]] = [True, False] + 5 | d[: list[Unknown | None]] = [None, None] + | ^^^^^^^ + 6 | e[: list[Unknown | str]] = ["hel", "lo"] + 7 | f[: list[Unknown | str]] = ['the', 're'] + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/types.pyi:950:11 | @@ -1810,6 +1907,26 @@ mod tests { 8 | g[: list[Unknown | str]] = [f"{ft}", f"{ft}"] | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:6:10 + | + 4 | c[: list[Unknown | bool]] = [True, False] + 5 | d[: list[Unknown | None]] = [None, None] + 6 | e[: list[Unknown | str]] = ["hel", "lo"] + | ^^^^^^^ + 7 | f[: list[Unknown | str]] = ['the', 're'] + 8 | g[: list[Unknown | str]] = [f"{ft}", f"{ft}"] + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:915:7 | @@ -1849,6 +1966,26 @@ mod tests { 9 | h[: list[Unknown | Template]] = [t"wow %d", t"wow %d"] | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:7:10 + | + 5 | d[: list[Unknown | None]] = [None, None] + 6 | e[: list[Unknown | str]] = ["hel", "lo"] + 7 | f[: list[Unknown | str]] = ['the', 're'] + | ^^^^^^^ + 8 | g[: list[Unknown | str]] = [f"{ft}", f"{ft}"] + 9 | h[: list[Unknown | Template]] = [t"wow %d", t"wow %d"] + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:915:7 | @@ -1888,6 +2025,26 @@ mod tests { 10 | i[: list[Unknown | bytes]] = [b'/x01', b'/x02'] | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:8:10 + | + 6 | e[: list[Unknown | str]] = ["hel", "lo"] + 7 | f[: list[Unknown | str]] = ['the', 're'] + 8 | g[: list[Unknown | str]] = [f"{ft}", f"{ft}"] + | ^^^^^^^ + 9 | h[: list[Unknown | Template]] = [t"wow %d", t"wow %d"] + 10 | i[: list[Unknown | bytes]] = [b'/x01', b'/x02'] + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:915:7 | @@ -1927,6 +2084,26 @@ mod tests { 11 | j[: list[Unknown | int | float]] = [+1, +2.0] | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:9:10 + | + 7 | f[: list[Unknown | str]] = ['the', 're'] + 8 | g[: list[Unknown | str]] = [f"{ft}", f"{ft}"] + 9 | h[: list[Unknown | Template]] = [t"wow %d", t"wow %d"] + | ^^^^^^^ + 10 | i[: list[Unknown | bytes]] = [b'/x01', b'/x02'] + 11 | j[: list[Unknown | int | float]] = [+1, +2.0] + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/string/templatelib.pyi:10:7 | @@ -1965,6 +2142,26 @@ mod tests { 12 | k[: list[Unknown | int | float]] = [-1, -2.0] | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:10:10 + | + 8 | g[: list[Unknown | str]] = [f"{ft}", f"{ft}"] + 9 | h[: list[Unknown | Template]] = [t"wow %d", t"wow %d"] + 10 | i[: list[Unknown | bytes]] = [b'/x01', b'/x02'] + | ^^^^^^^ + 11 | j[: list[Unknown | int | float]] = [+1, +2.0] + 12 | k[: list[Unknown | int | float]] = [-1, -2.0] + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:1448:7 | @@ -2003,6 +2200,25 @@ mod tests { 12 | k[: list[Unknown | int | float]] = [-1, -2.0] | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:11:10 + | + 9 | h[: list[Unknown | Template]] = [t"wow %d", t"wow %d"] + 10 | i[: list[Unknown | bytes]] = [b'/x01', b'/x02'] + 11 | j[: list[Unknown | int | float]] = [+1, +2.0] + | ^^^^^^^ + 12 | k[: list[Unknown | int | float]] = [-1, -2.0] + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:348:7 | @@ -2057,6 +2273,24 @@ mod tests { | ^^^^ | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:12:10 + | + 10 | i[: list[Unknown | bytes]] = [b'/x01', b'/x02'] + 11 | j[: list[Unknown | int | float]] = [+1, +2.0] + 12 | k[: list[Unknown | int | float]] = [-1, -2.0] + | ^^^^^^^ + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:348:7 | @@ -2312,6 +2546,26 @@ mod tests { 9 | a[: MyClass[Unknown | int, str]], b[: MyClass[Unknown | int, str]] = MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "b… | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:7:13 + | + 5 | self.y[: tuple[U@MyClass, U@MyClass]] = y + 6 | + 7 | x[: MyClass[Unknown | int, str]] = MyClass([x=][42], [y=]("a", "b")) + | ^^^^^^^ + 8 | y[: tuple[MyClass[Unknown | int, str], MyClass[Unknown | int, str]]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a",… + 9 | a[: MyClass[Unknown | int, str]], b[: MyClass[Unknown | int, str]] = MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "b… + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:348:7 | @@ -2410,6 +2664,25 @@ mod tests { 10 | c[: MyClass[Unknown | int, str]], d[: MyClass[Unknown | int, str]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "… | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:8:19 + | + 7 | x[: MyClass[Unknown | int, str]] = MyClass([x=][42], [y=]("a", "b")) + 8 | y[: tuple[MyClass[Unknown | int, str], MyClass[Unknown | int, str]]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a",… + | ^^^^^^^ + 9 | a[: MyClass[Unknown | int, str]], b[: MyClass[Unknown | int, str]] = MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "b… + 10 | c[: MyClass[Unknown | int, str]], d[: MyClass[Unknown | int, str]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "… + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:348:7 | @@ -2466,6 +2739,25 @@ mod tests { 10 | c[: MyClass[Unknown | int, str]], d[: MyClass[Unknown | int, str]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "… | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:8:48 + | + 7 | x[: MyClass[Unknown | int, str]] = MyClass([x=][42], [y=]("a", "b")) + 8 | y[: tuple[MyClass[Unknown | int, str], MyClass[Unknown | int, str]]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a",… + | ^^^^^^^ + 9 | a[: MyClass[Unknown | int, str]], b[: MyClass[Unknown | int, str]] = MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "b… + 10 | c[: MyClass[Unknown | int, str]], d[: MyClass[Unknown | int, str]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "… + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:348:7 | @@ -2598,6 +2890,25 @@ mod tests { 10 | c[: MyClass[Unknown | int, str]], d[: MyClass[Unknown | int, str]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "… | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:9:13 + | + 7 | x[: MyClass[Unknown | int, str]] = MyClass([x=][42], [y=]("a", "b")) + 8 | y[: tuple[MyClass[Unknown | int, str], MyClass[Unknown | int, str]]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a",… + 9 | a[: MyClass[Unknown | int, str]], b[: MyClass[Unknown | int, str]] = MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "b… + | ^^^^^^^ + 10 | c[: MyClass[Unknown | int, str]], d[: MyClass[Unknown | int, str]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "… + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:348:7 | @@ -2654,6 +2965,25 @@ mod tests { 10 | c[: MyClass[Unknown | int, str]], d[: MyClass[Unknown | int, str]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "… | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:9:47 + | + 7 | x[: MyClass[Unknown | int, str]] = MyClass([x=][42], [y=]("a", "b")) + 8 | y[: tuple[MyClass[Unknown | int, str], MyClass[Unknown | int, str]]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a",… + 9 | a[: MyClass[Unknown | int, str]], b[: MyClass[Unknown | int, str]] = MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "b… + | ^^^^^^^ + 10 | c[: MyClass[Unknown | int, str]], d[: MyClass[Unknown | int, str]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "… + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:348:7 | @@ -2785,6 +3115,24 @@ mod tests { | ^^^^^^^ | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:10:13 + | + 8 | y[: tuple[MyClass[Unknown | int, str], MyClass[Unknown | int, str]]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a",… + 9 | a[: MyClass[Unknown | int, str]], b[: MyClass[Unknown | int, str]] = MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "b… + 10 | c[: MyClass[Unknown | int, str]], d[: MyClass[Unknown | int, str]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "… + | ^^^^^^^ + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:348:7 | @@ -2838,6 +3186,24 @@ mod tests { | ^^^^^^^ | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:10:47 + | + 8 | y[: tuple[MyClass[Unknown | int, str], MyClass[Unknown | int, str]]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a",… + 9 | a[: MyClass[Unknown | int, str]], b[: MyClass[Unknown | int, str]] = MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "b… + 10 | c[: MyClass[Unknown | int, str]], d[: MyClass[Unknown | int, str]] = (MyClass([x=][42], [y=]("a", "b")), MyClass([x=][42], [y=]("a", "… + | ^^^^^^^ + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:348:7 | @@ -3347,6 +3713,24 @@ mod tests { 4 | y[: list[Unknown | int]] = [2] | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:3:10 + | + 2 | def foo(x: int): pass + 3 | x[: list[Unknown | int]] = [1] + | ^^^^^^^ + 4 | y[: list[Unknown | int]] = [2] + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:348:7 | @@ -3384,6 +3768,26 @@ mod tests { 6 | foo(x[0]) | + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:4:10 + | + 2 | def foo(x: int): pass + 3 | x[: list[Unknown | int]] = [1] + 4 | y[: list[Unknown | int]] = [2] + | ^^^^^^^ + 5 | + 6 | foo(x[0]) + | + info[inlay-hint-location]: Inlay Hint Target --> stdlib/builtins.pyi:348:7 | @@ -4349,6 +4753,43 @@ mod tests { bar[: (a, b) -> Unknown] = lambda a, b: a + b foo([x=]5) bar([a=]1, [b=]2) + --------------------------------------------- + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:2:14 + | + 2 | foo[: (x) -> Unknown] = lambda x: x * 2 + | ^^^^^^^ + 3 | bar[: (a, b) -> Unknown] = lambda a, b: a + b + 4 | foo([x=]5) + | + + info[inlay-hint-location]: Inlay Hint Target + --> stdlib/ty_extensions.pyi:20:1 + | + 19 | # Types + 20 | Unknown = object() + | ^^^^^^^ + 21 | AlwaysTruthy = object() + 22 | AlwaysFalsy = object() + | + info: Source + --> main2.py:3:17 + | + 2 | foo[: (x) -> Unknown] = lambda x: x * 2 + 3 | bar[: (a, b) -> Unknown] = lambda a, b: a + b + | ^^^^^^^ + 4 | foo([x=]5) + 5 | bar([a=]1, [b=]2) + | "); } diff --git a/crates/ty_python_semantic/src/types/display.rs b/crates/ty_python_semantic/src/types/display.rs index d73f61c2d7..a396f13e9f 100644 --- a/crates/ty_python_semantic/src/types/display.rs +++ b/crates/ty_python_semantic/src/types/display.rs @@ -612,16 +612,19 @@ impl Display for DisplayRepresentation<'_> { impl<'db> FmtDetailed<'db> for DisplayRepresentation<'db> { fn fmt_detailed(&self, f: &mut TypeWriter<'_, '_, 'db>) -> fmt::Result { match self.ty { - Type::Dynamic(dynamic) => { - if let DynamicType::Any = dynamic { - write!( - f.with_detail(TypeDetail::Type(Type::SpecialForm(SpecialFormType::Any))), - "{dynamic}" - ) - } else { - write!(f, "{dynamic}") - } - } + Type::Dynamic(dynamic) => match dynamic { + DynamicType::Any => write!( + f.with_detail(TypeDetail::Type(Type::SpecialForm(SpecialFormType::Any))), + "{dynamic}" + ), + DynamicType::Unknown => write!( + f.with_detail(TypeDetail::Type(Type::SpecialForm( + SpecialFormType::Unknown + ))), + "{dynamic}" + ), + _ => write!(f, "{dynamic}"), + }, Type::Never => f.with_detail(TypeDetail::Type(self.ty)).write_str("Never"), Type::NominalInstance(instance) => { let class = instance.class(self.db);