From 7efaf9a137440f3b2bc273507e9cbedb70701ddb Mon Sep 17 00:00:00 2001 From: "Aleksandr.Govenko" Date: Tue, 1 Jul 2025 18:51:26 +0200 Subject: [PATCH] PY-81861 Pattern matching for dataclasses - allow matching a subset of attributes GitOrigin-RevId: 30a865e64cee7be630567b7d23223fc79eac9dbf --- .../python/psi/impl/PyClassPatternImpl.java | 2 +- .../jetbrains/python/PyPatternTypeTest.java | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyClassPatternImpl.java b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyClassPatternImpl.java index 1c3498194261..85e7d8239092 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyClassPatternImpl.java +++ b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyClassPatternImpl.java @@ -115,7 +115,7 @@ public class PyClassPatternImpl extends PyElementImpl implements PyClassPattern } List matchArgs = getMatchArgs(classType, context); - if (matchArgs == null || matchArgs.size() > arguments.size()) return null; + if (matchArgs == null || index >= matchArgs.size()) return null; final PyTypedElement instanceAttribute = as(resolveTypeMember(classType, matchArgs.get(index), context), PyTypedElement.class); if (instanceAttribute == null) return null; diff --git a/python/testSrc/com/jetbrains/python/PyPatternTypeTest.java b/python/testSrc/com/jetbrains/python/PyPatternTypeTest.java index 3cd469944a00..8ce67ed21d9c 100644 --- a/python/testSrc/com/jetbrains/python/PyPatternTypeTest.java +++ b/python/testSrc/com/jetbrains/python/PyPatternTypeTest.java @@ -672,6 +672,26 @@ match x: assert_type(z, str) """); } + + // PY-81861 + public void testDataclassPartialCapture() { + doTestByText(""" +from dataclasses import dataclass +from typing import assert_type + + +@dataclass +class A: + a: int + b: str + + +x = A(1, "a") +match x: + case A(y): + assert_type(y, int) + """); + } // PY-79832 public void testMatchClassPatternSelfCaptureParameterized() {