diff --git a/jedi/inference/__init__.py b/jedi/inference/__init__.py index 56016a0b..1f548422 100644 --- a/jedi/inference/__init__.py +++ b/jedi/inference/__init__.py @@ -149,6 +149,10 @@ class InferenceState: def typing_tuple(self): return self.typing_module.py__getattribute__("Tuple") + @inference_state_function_cache() + def typing_type(self): + return self.typing_module.py__getattribute__("Type") + def reset_recursion_limitations(self): self.recursion_detector = recursion.RecursionDetector() self.execution_recursion_detector = recursion.ExecutionRecursionDetector(self) diff --git a/jedi/inference/value/klass.py b/jedi/inference/value/klass.py index 5f4d690a..54eabddf 100644 --- a/jedi/inference/value/klass.py +++ b/jedi/inference/value/klass.py @@ -285,7 +285,6 @@ class ClassMixin: if not is_instance and include_type_when_class: from jedi.inference.compiled import builtin_from_name type_ = builtin_from_name(self.inference_state, 'type') - assert isinstance(type_, ClassValue) if type_ != self: # We are not using execute_with_values here, because the # plugin function for type would get executed instead of an diff --git a/jedi/plugins/stdlib.py b/jedi/plugins/stdlib.py index 6d6db47a..bf753097 100644 --- a/jedi/plugins/stdlib.py +++ b/jedi/plugins/stdlib.py @@ -918,6 +918,15 @@ class TupleClassWrapper(ValueWrapper): ) +# Make sure type[...] behaves like Type[...] +class TypeClassWrapper(ValueWrapper): + def py__getitem__(self, index_value_set, contextualized_node): + return self.inference_state.typing_type().py__getitem__( + index_value_set, + contextualized_node, + ) + + def tree_name_to_values(func): def wrapper(inference_state, context, tree_name): if tree_name.value == 'sep' \ @@ -929,5 +938,9 @@ def tree_name_to_values(func): and context.is_module() and context.py__name__() == 'builtins': tup, = func(inference_state, context, tree_name) return ValueSet([TupleClassWrapper(tup)]) + if tree_name.value == 'type' \ + and context.is_module() and context.py__name__() == 'builtins': + tup, = func(inference_state, context, tree_name) + return ValueSet([TypeClassWrapper(tup)]) return func(inference_state, context, tree_name) return wrapper diff --git a/test/completion/pep0484_basic.py b/test/completion/pep0484_basic.py index db7f45e5..35edcb8c 100644 --- a/test/completion/pep0484_basic.py +++ b/test/completion/pep0484_basic.py @@ -225,3 +225,8 @@ def check_newstyle_unions(u1: int | str, u2: list[int] | list[str]): u2 #? int() str() u2[1] + +def use_type_with_annotation() -> type[int]: ... + +#? int +use_type_with_annotation()