diff --git a/crates/ty_python_semantic/resources/mdtest/dataclasses.md b/crates/ty_python_semantic/resources/mdtest/dataclasses.md index a74c125b5d..4616e59e22 100644 --- a/crates/ty_python_semantic/resources/mdtest/dataclasses.md +++ b/crates/ty_python_semantic/resources/mdtest/dataclasses.md @@ -797,7 +797,20 @@ C(1) < C(2) # ok ### Using `dataclass` as a function -To do +```py +from dataclasses import dataclass + +class B: + x: int + +# error: [missing-argument] +dataclass(B)() + +# error: [invalid-argument-type] +dataclass(B)("a") + +reveal_type(dataclass(B)(3).x) # revealed: int +``` ## Internals diff --git a/crates/ty_python_semantic/src/types/call/bind.rs b/crates/ty_python_semantic/src/types/call/bind.rs index b49343c12d..2eab02c9c7 100644 --- a/crates/ty_python_semantic/src/types/call/bind.rs +++ b/crates/ty_python_semantic/src/types/call/bind.rs @@ -22,8 +22,8 @@ use crate::types::function::{DataclassTransformerParams, FunctionDecorators, Kno use crate::types::generics::{Specialization, SpecializationBuilder, SpecializationError}; use crate::types::signatures::{Parameter, ParameterForm}; use crate::types::{ - BoundMethodType, DataclassParams, KnownClass, KnownInstanceType, MethodWrapperKind, - PropertyInstanceType, SpecialFormType, TupleType, TypeMapping, UnionType, + BoundMethodType, ClassLiteral, DataclassParams, KnownClass, KnownInstanceType, + MethodWrapperKind, PropertyInstanceType, SpecialFormType, TupleType, TypeMapping, UnionType, WrapperDescriptorKind, ide_support, todo_type, }; use ruff_db::diagnostic::{Annotation, Diagnostic, Severity, SubDiagnostic}; @@ -839,6 +839,21 @@ impl<'db> Bindings<'db> { overload.set_return_type(Type::DataclassDecorator(params)); } + + // `dataclass` being used as a non-decorator + if let [Some(Type::ClassLiteral(class_literal))] = + overload.parameter_types() + { + let params = DataclassParams::default(); + overload.set_return_type(Type::from(ClassLiteral::new( + db, + class_literal.name(db), + class_literal.body_scope(db), + class_literal.known(db), + Some(params), + class_literal.dataclass_transformer_params(db), + ))); + } } Some(KnownFunction::DataclassTransform) => {