diff --git a/python/python-psi-impl/src/com/jetbrains/python/codeInsight/completion/PyFStringLikeCompletionContributor.java b/python/python-psi-impl/src/com/jetbrains/python/codeInsight/completion/PyFStringLikeCompletionContributor.java index 5ec0c4c2bea5..8c731afac349 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/codeInsight/completion/PyFStringLikeCompletionContributor.java +++ b/python/python-psi-impl/src/com/jetbrains/python/codeInsight/completion/PyFStringLikeCompletionContributor.java @@ -65,7 +65,12 @@ public class PyFStringLikeCompletionContributor extends CompletionContributor { return; } String completionPrefix = stringElemText.substring(braceOffset + 1, relOffset); - if (!PyNames.isIdentifier(completionPrefix)) { + boolean autoPopupAfterOpeningBrace = completionPrefix.isEmpty() && parameters.isAutoPopup(); + if (autoPopupAfterOpeningBrace) { + return; + } + boolean impossibleReferencePrefix = !completionPrefix.isEmpty() && !PyNames.isIdentifier(completionPrefix); + if (impossibleReferencePrefix) { return; } PyExpression fString = PyUtil.createExpressionFromFragment("f" + stringElemText, stringLiteral.getParent()); diff --git a/python/testData/completion/fStringLikeCompletionAvailableRightAfterOpeningBrace.py b/python/testData/completion/fStringLikeCompletionAvailableRightAfterOpeningBrace.py new file mode 100644 index 000000000000..6fadbe71ecd2 --- /dev/null +++ b/python/testData/completion/fStringLikeCompletionAvailableRightAfterOpeningBrace.py @@ -0,0 +1,2 @@ +my_expr = 42 +s = 'foo{' diff --git a/python/testSrc/com/jetbrains/python/Py3CompletionTest.java b/python/testSrc/com/jetbrains/python/Py3CompletionTest.java index 61d5adbc85e2..5fe1f896d835 100644 --- a/python/testSrc/com/jetbrains/python/Py3CompletionTest.java +++ b/python/testSrc/com/jetbrains/python/Py3CompletionTest.java @@ -7,6 +7,7 @@ import com.intellij.openapi.module.Module; import com.intellij.testFramework.LightProjectDescriptor; import com.intellij.testFramework.PsiTestUtil; import com.intellij.testFramework.TestDataPath; +import com.intellij.util.containers.ContainerUtil; import com.jetbrains.python.fixtures.PyTestCase; import com.jetbrains.python.inspections.PyMethodParametersInspection; import com.jetbrains.python.psi.LanguageLevel; @@ -477,6 +478,17 @@ public class Py3CompletionTest extends PyTestCase { runWithLanguageLevel(LanguageLevel.getLatest(), this::doNegativeTest); } + // PY-45459 + public void testFStringLikeCompletionAvailableRightAfterOpeningBrace() { + runWithLanguageLevel(LanguageLevel.getLatest(), () -> { + myFixture.configureByFile(getTestName(true) + ".py"); + LookupElement[] variants = myFixture.completeBasic(); + assertNotNull(variants); + assertTrue(variants.length > 0); + assertTrue(ContainerUtil.exists(variants, v -> v.getLookupString().equals("my_expr"))); + }); + } + @Override protected String getTestDataPath() { return super.getTestDataPath() + "/completion";