diff --git a/jedi/plugins/stdlib.py b/jedi/plugins/stdlib.py index 6d83d2c6..1018e808 100644 --- a/jedi/plugins/stdlib.py +++ b/jedi/plugins/stdlib.py @@ -24,6 +24,7 @@ from jedi.inference.value.instance import \ from jedi.inference.base_value import ContextualizedNode, \ NO_VALUES, ValueSet, ValueWrapper, LazyValueWrapper from jedi.inference.value import ClassValue, ModuleValue +from jedi.inference.value.decorator import Decoratee from jedi.inference.value.klass import DataclassWrapper, DataclassDecorator from jedi.inference.value.function import FunctionMixin from jedi.inference.value import iterable @@ -597,7 +598,7 @@ def _dataclass(value, arguments, callback): """ for c in _follow_param(value.inference_state, arguments, 0): if c.is_class(): - # Decorate a class + # Decorate a dataclass / base dataclass dataclass_init = ( # Customized decorator, init may be disabled not value.has_dataclass_init_false @@ -606,17 +607,22 @@ def _dataclass(value, arguments, callback): else True ) + is_dataclass_transform = ( + value.name.string_name == "dataclass_transform" + # The decorator function from dataclass_transform acting as the + # dataclass decorator. + and not isinstance(value, Decoratee) + ) + return ValueSet( [ DataclassWrapper( c, dataclass_init, - is_dataclass_transform=value.name.string_name - == "dataclass_transform", + is_dataclass_transform, ) ] ) - else: # Decorator customization return ValueSet( diff --git a/test/test_inference/test_signature.py b/test/test_inference/test_signature.py index 1b7e2d4d..3aeca0bb 100644 --- a/test/test_inference/test_signature.py +++ b/test/test_inference/test_signature.py @@ -450,8 +450,8 @@ dataclass_transform_cases = [ # Decorator based [dedent(''' @dataclass_transform - def create_model(cls): - return cls + def create_model(): + pass @create_model class X:'''), [], True], # Metaclass based