From 4dbe727d87e42f0923aabf065441c46aec18c182 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Thu, 18 Nov 2021 23:20:18 +0200 Subject: [PATCH] EA-404000 Fix NPE in case of unresolved class names in class patterns GitOrigin-RevId: c1805f264367e026c22b12a714eb97b6acd8edec --- .../psi/impl/references/PyKeywordPatternReference.java | 9 ++++----- ...ssPatternLeadsToNothingSuggestedForKeywordPatterns.py | 3 +++ .../testSrc/com/jetbrains/python/Py3CompletionTest.java | 5 +++++ 3 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 python/testData/completion/unresolvedClassPatternLeadsToNothingSuggestedForKeywordPatterns.py diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/references/PyKeywordPatternReference.java b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/references/PyKeywordPatternReference.java index 48853cb96e79..10487cba9919 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/references/PyKeywordPatternReference.java +++ b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/references/PyKeywordPatternReference.java @@ -13,9 +13,8 @@ import com.jetbrains.python.PythonCodeStyleService; import com.jetbrains.python.codeInsight.completion.OverwriteEqualsInsertHandler; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.resolve.PyResolveContext; +import com.jetbrains.python.psi.types.PyClassLikeType; import com.jetbrains.python.psi.types.PyInstantiableType; -import com.jetbrains.python.psi.types.PyType; -import com.jetbrains.python.psi.types.PyTypeUtil; import com.jetbrains.python.psi.types.TypeEvalContext; import one.util.streamex.StreamEx; import org.jetbrains.annotations.NotNull; @@ -90,15 +89,15 @@ public final class PyKeywordPatternReference extends PsiReferenceBase.Poly resolveToClassTypes(@NotNull PyClassPattern classPattern, @NotNull PyResolveContext resolveContext) { List elements = PyUtil.multiResolveTopPriority(classPattern.getClassNameReference(), resolveContext); return StreamEx.of(elements) .select(PyClass.class) .map(e -> e.getType(resolveContext.getTypeEvalContext())) .nonNull() .map(PyInstantiableType::toInstance) - .collect(PyTypeUtil.toUnion()); + .toList(); } private static class KeywordAttributeLookupDecorator extends LookupElementDecorator { diff --git a/python/testData/completion/unresolvedClassPatternLeadsToNothingSuggestedForKeywordPatterns.py b/python/testData/completion/unresolvedClassPatternLeadsToNothingSuggestedForKeywordPatterns.py new file mode 100644 index 000000000000..8461f336f6aa --- /dev/null +++ b/python/testData/completion/unresolvedClassPatternLeadsToNothingSuggestedForKeywordPatterns.py @@ -0,0 +1,3 @@ +match x: + case MyClass(attr): + pass diff --git a/python/testSrc/com/jetbrains/python/Py3CompletionTest.java b/python/testSrc/com/jetbrains/python/Py3CompletionTest.java index dbdf9d6cee89..d088e2615d23 100644 --- a/python/testSrc/com/jetbrains/python/Py3CompletionTest.java +++ b/python/testSrc/com/jetbrains/python/Py3CompletionTest.java @@ -616,6 +616,11 @@ public class Py3CompletionTest extends PyTestCase { doNegativeTest(); } + // EA-404000 + public void testUnresolvedClassPatternLeadsToNothingSuggestedForKeywordPatterns() { + doNegativeTest(); + } + // PY-48012 public void testAttributesOfDataclassSuggestedForKeywordPatterns() { final String testName = getTestName(true);