From 65dee450b842517b0a8dec6baef8c51b2867c14f Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Tue, 23 Mar 2021 00:16:05 +0300 Subject: [PATCH] PY-45368 Fixed completing 'None' in type annotations GitOrigin-RevId: fc7e7ff0a03ce41373bac2eedbf3e8b7aaa2ce4d --- .../completion/PyKeywordCompletionContributor.java | 8 ++++++++ .../noneInParameterAnnotation.after.py | 5 +++++ .../keywordCompletion/noneInParameterAnnotation.py | 5 +++++ .../keywordCompletion/noneInReturnAnnotation.after.py | 1 + .../keywordCompletion/noneInReturnAnnotation.py | 1 + .../jetbrains/python/PythonKeywordCompletionTest.java | 10 ++++++++++ 6 files changed, 30 insertions(+) create mode 100644 python/testData/keywordCompletion/noneInParameterAnnotation.after.py create mode 100644 python/testData/keywordCompletion/noneInParameterAnnotation.py create mode 100644 python/testData/keywordCompletion/noneInReturnAnnotation.after.py create mode 100644 python/testData/keywordCompletion/noneInReturnAnnotation.py diff --git a/python/python-psi-impl/src/com/jetbrains/python/codeInsight/completion/PyKeywordCompletionContributor.java b/python/python-psi-impl/src/com/jetbrains/python/codeInsight/completion/PyKeywordCompletionContributor.java index 432703496257..ba732681028f 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/codeInsight/completion/PyKeywordCompletionContributor.java +++ b/python/python-psi-impl/src/com/jetbrains/python/codeInsight/completion/PyKeywordCompletionContributor.java @@ -323,6 +323,9 @@ public class PyKeywordCompletionContributor extends CompletionContributor implem private static final PsiElementPattern.Capture IN_ELSE_BODY_OF_TRY = psiElement().inside(psiElement(PyStatementList.class).inside(psiElement(PyElsePart.class).inside(PyTryExceptStatement.class))); + private static final PsiElementPattern.Capture IN_ANNOTATION = + psiElement().inside(psiElement(PyAnnotation.class)); + private static final PsiElementPattern.Capture AFTER_IF = afterStatement(psiElement(PyIfStatement.class).withLastChild( psiElement(PyIfPart.class))); private static final PsiElementPattern.Capture AFTER_TRY = afterStatement(psiElement(PyTryExceptStatement.class)); @@ -644,6 +647,11 @@ public class PyKeywordCompletionContributor extends CompletionContributor implem .and(PY35) .afterLeaf(psiElement().withElementType(PyTokenTypes.IDENTIFIER).withText(PyNames.ASYNC)), new PyKeywordCompletionProvider(PyNames.DEF, PyNames.WITH, PyNames.FOR)); + extend(CompletionType.BASIC, + psiElement() + .withLanguage(PythonLanguage.getInstance()) + .and(IN_ANNOTATION), + new PyKeywordCompletionProvider(TailType.NONE, PyNames.NONE)); } private void addAs() { diff --git a/python/testData/keywordCompletion/noneInParameterAnnotation.after.py b/python/testData/keywordCompletion/noneInParameterAnnotation.after.py new file mode 100644 index 000000000000..7a34d52773ce --- /dev/null +++ b/python/testData/keywordCompletion/noneInParameterAnnotation.after.py @@ -0,0 +1,5 @@ +from typing import Union + + +def foo(x: Union[int, None]): + pass diff --git a/python/testData/keywordCompletion/noneInParameterAnnotation.py b/python/testData/keywordCompletion/noneInParameterAnnotation.py new file mode 100644 index 000000000000..5d4612f6b7ff --- /dev/null +++ b/python/testData/keywordCompletion/noneInParameterAnnotation.py @@ -0,0 +1,5 @@ +from typing import Union + + +def foo(x: Union[int, Non]): + pass diff --git a/python/testData/keywordCompletion/noneInReturnAnnotation.after.py b/python/testData/keywordCompletion/noneInReturnAnnotation.after.py new file mode 100644 index 000000000000..ab8a1058f401 --- /dev/null +++ b/python/testData/keywordCompletion/noneInReturnAnnotation.after.py @@ -0,0 +1 @@ +def foo() -> None diff --git a/python/testData/keywordCompletion/noneInReturnAnnotation.py b/python/testData/keywordCompletion/noneInReturnAnnotation.py new file mode 100644 index 000000000000..4e664dbdb980 --- /dev/null +++ b/python/testData/keywordCompletion/noneInReturnAnnotation.py @@ -0,0 +1 @@ +def foo() -> Non diff --git a/python/testSrc/com/jetbrains/python/PythonKeywordCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonKeywordCompletionTest.java index 011b5de1ba58..40bf2b6cd760 100644 --- a/python/testSrc/com/jetbrains/python/PythonKeywordCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonKeywordCompletionTest.java @@ -248,4 +248,14 @@ public class PythonKeywordCompletionTest extends PyTestCase { public void testNoForAndYieldInCommentContext() { assertDoesntContain(doTestByTestName(), "for", "yield"); } + + // PY-45368 + public void testNoneInParameterAnnotation() { + doTest(); + } + + // PY-45368 + public void testNoneInReturnAnnotation() { + doTest(); + } }