PY-77433 Don't report mutable field defaults in dataclass_transform-based dataclasses

Some dataclass implementations, such as Pydantic, allow declaring fields with
mutable defaults, deep-copying them under the hood.

See https://docs.pydantic.dev/latest/concepts/models/#fields-with-non-hashable-default-values


(cherry picked from commit e495621858950976226731dddbb01af4012704fa)

IJ-CR-151192

GitOrigin-RevId: 7412272584a4c26e404d3d84e6150f974027eca7
This commit is contained in:
Mikhail Golubev
2024-12-09 14:51:06 +02:00
committed by intellij-monorepo-bot
parent 19d6ad45a2
commit 6e515ed9b8
2 changed files with 18 additions and 9 deletions

View File

@@ -60,8 +60,17 @@ class PyDataclassInspection : PyInspection() {
val dataclassParameters = parseDataclassParameters(node, myTypeEvalContext)
if (dataclassParameters != null) {
if (dataclassParameters.type.asPredefinedType == PyDataclassParameters.PredefinedType.STD ||
dataclassParameters.type.asPredefinedType == PyDataclassParameters.PredefinedType.DATACLASS_TRANSFORM) {
if (dataclassParameters.type.asPredefinedType == PyDataclassParameters.PredefinedType.DATACLASS_TRANSFORM) {
processDataclassParameters(node, dataclassParameters)
node.processClassLevelDeclarations { element, _ ->
if (element is PyTargetExpression) {
processFieldFunctionCall(node, dataclassParameters, element)
}
true
}
}
else if (dataclassParameters.type.asPredefinedType == PyDataclassParameters.PredefinedType.STD) {
processDataclassParameters(node, dataclassParameters)
val postInit = node.findMethodByName(Dataclasses.DUNDER_POST_INIT, false, myTypeEvalContext)