obey no_type_check when inferring params/return

This commit is contained in:
Douglas Creager 2025-12-10 16:02:03 -05:00
parent 5a0b99ffba
commit 69cfe4aed6
2 changed files with 16 additions and 2 deletions

View File

@ -177,8 +177,8 @@ impl<'db, 'ast> InferContext<'db, 'ast> {
std::mem::replace(&mut self.multi_inference, multi_inference) std::mem::replace(&mut self.multi_inference, multi_inference)
} }
pub(super) fn set_in_no_type_check(&mut self, no_type_check: InNoTypeCheck) { pub(super) fn set_in_no_type_check(&mut self, no_type_check: InNoTypeCheck) -> InNoTypeCheck {
self.no_type_check = no_type_check; std::mem::replace(&mut self.no_type_check, no_type_check)
} }
fn is_in_no_type_check(&self) -> bool { fn is_in_no_type_check(&self) -> bool {

View File

@ -2938,6 +2938,20 @@ impl<'db, 'ast> TypeInferenceBuilder<'db, 'ast> {
definition: Definition<'db>, definition: Definition<'db>,
function: &ast::StmtFunctionDef, 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); let previous_typevar_binding_context = self.typevar_binding_context.replace(definition);
self.infer_return_type_annotation( self.infer_return_type_annotation(
function.returns.as_deref(), function.returns.as_deref(),