From 69cfe4aed62759f2b7c740545fcd04270264b86d Mon Sep 17 00:00:00 2001 From: Douglas Creager Date: Wed, 10 Dec 2025 16:02:03 -0500 Subject: [PATCH] obey no_type_check when inferring params/return --- crates/ty_python_semantic/src/types/context.rs | 4 ++-- .../ty_python_semantic/src/types/infer/builder.rs | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/crates/ty_python_semantic/src/types/context.rs b/crates/ty_python_semantic/src/types/context.rs index 7eb84e0d01..662b38b302 100644 --- a/crates/ty_python_semantic/src/types/context.rs +++ b/crates/ty_python_semantic/src/types/context.rs @@ -177,8 +177,8 @@ impl<'db, 'ast> InferContext<'db, 'ast> { std::mem::replace(&mut self.multi_inference, multi_inference) } - pub(super) fn set_in_no_type_check(&mut self, no_type_check: InNoTypeCheck) { - self.no_type_check = no_type_check; + pub(super) fn set_in_no_type_check(&mut self, no_type_check: InNoTypeCheck) -> InNoTypeCheck { + std::mem::replace(&mut self.no_type_check, no_type_check) } fn is_in_no_type_check(&self) -> bool { diff --git a/crates/ty_python_semantic/src/types/infer/builder.rs b/crates/ty_python_semantic/src/types/infer/builder.rs index b585e3b5df..7dbd3d4fe9 100644 --- a/crates/ty_python_semantic/src/types/infer/builder.rs +++ b/crates/ty_python_semantic/src/types/infer/builder.rs @@ -2938,6 +2938,20 @@ impl<'db, 'ast> TypeInferenceBuilder<'db, 'ast> { definition: Definition<'db>, function: &ast::StmtFunctionDef, ) { + let mut prev_in_no_type_check = self.context.set_in_no_type_check(InNoTypeCheck::Yes); + for decorator in &function.decorator_list { + let decorator_type = self.infer_decorator(decorator); + if let Type::FunctionLiteral(function) = decorator_type + && let Some(KnownFunction::NoTypeCheck) = function.known(self.db()) + { + // If the function is decorated with the `no_type_check` decorator, + // we need to suppress any errors that come after the decorators. + prev_in_no_type_check = InNoTypeCheck::Yes; + break; + } + } + self.context.set_in_no_type_check(prev_in_no_type_check); + let previous_typevar_binding_context = self.typevar_binding_context.replace(definition); self.infer_return_type_annotation( function.returns.as_deref(),