| [case testInspectTypeBasic] | |
| # inspect2: --include-kind tmp/foo.py:10:13 | |
| # inspect2: --show=type --include-kind tmp/foo.py:10:13 | |
| # inspect2: --include-span -vv tmp/foo.py:12:5 | |
| # inspect2: --include-span --include-kind tmp/foo.py:12:5:12:9 | |
| import foo | |
| [file foo.py] | |
| from typing import TypeVar, Generic | |
| T = TypeVar('T') | |
| class C(Generic[T]): | |
| def __init__(self, x: T) -> None: ... | |
| x: T | |
| def foo(arg: C[T]) -> T: | |
| return arg.x | |
| foo(C(42)) | |
| [out] | |
| == | |
| NameExpr -> "C[T]" | |
| MemberExpr -> "T" | |
| NameExpr -> "C[T]" | |
| MemberExpr -> "T" | |
| 12:5:12:5 -> "type[foo.C[builtins.int]]" | |
| 12:5:12:9 -> "foo.C[builtins.int]" | |
| 12:1:12:10 -> "builtins.int" | |
| CallExpr:12:5:12:9 -> "C[int]" | |
| [case testInspectAttrsBasic] | |
| # inspect2: --show=attrs tmp/foo.py:6:1 | |
| # inspect2: --show=attrs tmp/foo.py:7:1 | |
| # inspect2: --show=attrs tmp/foo.py:10:1 | |
| # inspect2: --show=attrs --include-object-attrs tmp/foo.py:10:1 | |
| import foo | |
| [file foo.py] | |
| from bar import Meta | |
| class C(metaclass=Meta): | |
| x: int | |
| def meth(self) -> None: ... | |
| c: C | |
| C | |
| def foo() -> int: ... | |
| foo | |
| [file bar.py] | |
| class Meta(type): | |
| y: int | |
| [out] | |
| == | |
| {"C": ["meth", "x"]} | |
| {"C": ["meth", "x"], "Meta": ["y"], "type": ["__init__"]} | |
| {"function": ["__name__"]} | |
| {"function": ["__name__"], "object": ["__init__"]} | |
| [case testInspectDefBasic] | |
| # inspect2: --show=definition tmp/foo.py:5:5 | |
| # inspect2: --show=definition --include-kind tmp/foo.py:6:3 | |
| # inspect2: --show=definition --include-span tmp/foo.py:7:5 | |
| # inspect2: --show=definition tmp/foo.py:8:1:8:4 | |
| # inspect2: --show=definition tmp/foo.py:8:6:8:8 | |
| # inspect2: --show=definition tmp/foo.py:9:3 | |
| import foo | |
| [file foo.py] | |
| from bar import var, test, A | |
| from baz import foo | |
| a: A | |
| a.meth() | |
| a.x | |
| A.B.y | |
| test(var) | |
| foo | |
| [file bar.py] | |
| class A: | |
| x: int | |
| @classmethod | |
| def meth(cls) -> None: ... | |
| class B: | |
| y: int | |
| var = 42 | |
| def test(x: int) -> None: ... | |
| [file baz.py] | |
| from typing import overload, Union | |
| @overload | |
| def foo(x: int) -> None: ... | |
| @overload | |
| def foo(x: str) -> None: ... | |
| def foo(x: Union[int, str]) -> None: | |
| pass | |
| [builtins fixtures/classmethod.pyi] | |
| [out] | |
| == | |
| tmp/bar.py:4:0:meth | |
| MemberExpr -> tmp/bar.py:2:5:x | |
| 7:1:7:5 -> tmp/bar.py:6:9:y | |
| tmp/bar.py:9:1:test | |
| tmp/bar.py:8:1:var | |
| tmp/baz.py:3:2:foo | |
| [case testInspectFallbackAttributes] | |
| # inspect2: --show=attrs --include-object-attrs tmp/foo.py:5:1 | |
| # inspect2: --show=attrs tmp/foo.py:8:1 | |
| # inspect2: --show=attrs --include-kind tmp/foo.py:10:1 | |
| # inspect2: --show=attrs --include-kind --include-object-attrs tmp/foo.py:10:1 | |
| import foo | |
| [file foo.py] | |
| class B: ... | |
| class C(B): | |
| x: int | |
| c: C | |
| c # line 5 | |
| t = 42, "foo" | |
| t # line 8 | |
| None | |
| [builtins fixtures/args.pyi] | |
| [out] | |
| == | |
| {"C": ["x"], "object": ["__eq__", "__init__", "__ne__"]} | |
| {"Iterable": ["__iter__"]} | |
| NameExpr -> {} | |
| NameExpr -> {"object": ["__eq__", "__init__", "__ne__"]} | |
| [case testInspectTypeVarBoundAttrs] | |
| # inspect2: --show=attrs tmp/foo.py:8:13 | |
| import foo | |
| [file foo.py] | |
| from typing import TypeVar | |
| class C: | |
| x: int | |
| T = TypeVar('T', bound=C) | |
| def foo(arg: T) -> T: | |
| return arg | |
| [out] | |
| == | |
| {"C": ["x"]} | |
| [case testInspectTypeVarValuesAttrs] | |
| # inspect2: --show=attrs --force-reload tmp/foo.py:13:13 | |
| # inspect2: --show=attrs --force-reload --union-attrs tmp/foo.py:13:13 | |
| # inspect2: --show=attrs tmp/foo.py:16:5 | |
| # inspect2: --show=attrs --union-attrs tmp/foo.py:16:5 | |
| import foo | |
| [file foo.py] | |
| from typing import TypeVar, Generic | |
| class A: | |
| x: int | |
| z: int | |
| class B: | |
| y: int | |
| z: int | |
| T = TypeVar('T', A, B) | |
| def foo(arg: T) -> T: | |
| return arg | |
| class C(Generic[T]): | |
| x: T | |
| [out] | |
| == | |
| {"A": ["z"], "B": ["z"]} | |
| {"A": ["x", "z"], "B": ["y", "z"]} | |
| {"A": ["z"], "B": ["z"]} | |
| {"A": ["x", "z"], "B": ["y", "z"]} | |
| [case testInspectTypeVarBoundDef] | |
| # inspect2: --show=definition tmp/foo.py:9:13 | |
| # inspect2: --show=definition tmp/foo.py:8:9 | |
| import foo | |
| [file foo.py] | |
| from typing import TypeVar | |
| class C: | |
| x: int | |
| T = TypeVar('T', bound=C) | |
| def foo(arg: T) -> T: | |
| arg.x | |
| return arg | |
| [out] | |
| == | |
| tmp/foo.py:7:9:arg | |
| tmp/foo.py:4:5:x | |
| [case testInspectTypeVarValuesDef] | |
| # inspect2: --show=definition --force-reload tmp/foo.py:13:9 | |
| # inspect2: --show=definition --force-reload tmp/foo.py:14:13 | |
| # inspect2: --show=definition tmp/foo.py:18:7 | |
| import foo | |
| [file foo.py] | |
| from typing import TypeVar, Generic | |
| class A: | |
| x: int | |
| z: int | |
| class B: | |
| y: int | |
| z: int | |
| T = TypeVar('T', A, B) | |
| def foo(arg: T) -> T: | |
| arg.z | |
| return arg | |
| class C(Generic[T]): | |
| x: T | |
| x.z | |
| [out] | |
| == | |
| tmp/foo.py:5:5:z, tmp/foo.py:9:5:z | |
| tmp/foo.py:12:9:arg | |
| tmp/foo.py:5:5:z, tmp/foo.py:9:5:z | |
| [case testInspectModuleAttrs] | |
| # inspect2: --show=attrs tmp/foo.py:2:1 | |
| import foo | |
| [file foo.py] | |
| from pack import bar | |
| bar | |
| [file pack/__init__.py] | |
| [file pack/bar.py] | |
| x: int | |
| def bar() -> None: ... | |
| class C: ... | |
| [builtins fixtures/module.pyi] | |
| [out] | |
| == | |
| {"<pack.bar>": ["C", "__annotations__", "__doc__", "__file__", "__name__", "__package__", "__spec__", "bar", "x"], "ModuleType": ["__file__", "__getattr__"]} | |
| [case testInspectModuleDef] | |
| # inspect2: --show=definition --include-kind tmp/foo.py:2:1 | |
| import foo | |
| [file foo.py] | |
| from pack import bar | |
| bar.x | |
| [file pack/__init__.py] | |
| [file pack/bar.py] | |
| pass | |
| if True: | |
| x: int | |
| [out] | |
| == | |
| NameExpr -> tmp/pack/bar.py:1:1:bar | |
| MemberExpr -> tmp/pack/bar.py:3:5:x | |
| [case testInspectFunctionArgDef] | |
| # inspect2: --show=definition --include-span tmp/foo.py:4:13 | |
| # TODO: for now all arguments have line/column set to function definition. | |
| import foo | |
| [file foo.py] | |
| def foo(arg: int) -> int: | |
| pass | |
| pass | |
| return arg | |
| [out] | |
| == | |
| 4:12:4:14 -> tmp/foo.py:1:9:arg |