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(); + } }