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() {