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 b208adcb721e..06fb9518be48 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 @@ -17,9 +17,7 @@ import com.intellij.util.text.CharArrayUtil; import com.jetbrains.python.PyNames; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.resolve.PyResolveContext; -import com.jetbrains.python.psi.types.PyCallableParameter; -import com.jetbrains.python.psi.types.PyClassType; -import com.jetbrains.python.psi.types.TypeEvalContext; +import com.jetbrains.python.psi.types.*; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -162,7 +160,16 @@ public final class PyFStringLikeCompletionContributor extends CompletionContribu } return ContainerUtil.all(call.multiMapArguments(PyResolveContext.defaultContext(typeEvalContext)), mapping -> { PyCallableParameter param = mapping.getMappedParameters().get(callArgument); - return param != null && templateType.equals(param.getType(typeEvalContext)); + if (param == null) return false; + PyType paramType = param.getType(typeEvalContext); + if (param.isPositionalContainer() && paramType instanceof PyTupleType tupleType && tupleType.isHomogeneous()) { + paramType = tupleType.getElementTypes().get(0); + } + else if (param.isKeywordContainer() && paramType instanceof PyCollectionType dictType && + PyNames.DICT.equals(dictType.getPyClass().getName())) { + paramType = ContainerUtil.getOrElse(dictType.getElementTypes(), 1, null); + } + return templateType.equals(paramType); }); } } diff --git a/python/testData/completion/fStringLikeCompletionAddsTPrefixWhereTemplateStringIsExpectedAsKeywordVarargArgument.after.py b/python/testData/completion/fStringLikeCompletionAddsTPrefixWhereTemplateStringIsExpectedAsKeywordVarargArgument.after.py new file mode 100644 index 000000000000..08b270461ada --- /dev/null +++ b/python/testData/completion/fStringLikeCompletionAddsTPrefixWhereTemplateStringIsExpectedAsKeywordVarargArgument.after.py @@ -0,0 +1,7 @@ +from string.templatelib import Template + +def html(**chunks: Template): + ... + +variable = 42 +html(query=t"{variable}") \ No newline at end of file diff --git a/python/testData/completion/fStringLikeCompletionAddsTPrefixWhereTemplateStringIsExpectedAsKeywordVarargArgument.py b/python/testData/completion/fStringLikeCompletionAddsTPrefixWhereTemplateStringIsExpectedAsKeywordVarargArgument.py new file mode 100644 index 000000000000..b7677060a369 --- /dev/null +++ b/python/testData/completion/fStringLikeCompletionAddsTPrefixWhereTemplateStringIsExpectedAsKeywordVarargArgument.py @@ -0,0 +1,7 @@ +from string.templatelib import Template + +def html(**chunks: Template): + ... + +variable = 42 +html(query="{vari") \ No newline at end of file diff --git a/python/testData/completion/fStringLikeCompletionAddsTPrefixWhereTemplateStringIsExpectedAsPositionalVarargArgument.after.py b/python/testData/completion/fStringLikeCompletionAddsTPrefixWhereTemplateStringIsExpectedAsPositionalVarargArgument.after.py new file mode 100644 index 000000000000..3b2a1def8043 --- /dev/null +++ b/python/testData/completion/fStringLikeCompletionAddsTPrefixWhereTemplateStringIsExpectedAsPositionalVarargArgument.after.py @@ -0,0 +1,7 @@ +from string.templatelib import Template + +def html(*chunks: Template): + ... + +variable = 42 +html(t"{variable}") \ No newline at end of file diff --git a/python/testData/completion/fStringLikeCompletionAddsTPrefixWhereTemplateStringIsExpectedAsPositionalVarargArgument.py b/python/testData/completion/fStringLikeCompletionAddsTPrefixWhereTemplateStringIsExpectedAsPositionalVarargArgument.py new file mode 100644 index 000000000000..ee1c97553302 --- /dev/null +++ b/python/testData/completion/fStringLikeCompletionAddsTPrefixWhereTemplateStringIsExpectedAsPositionalVarargArgument.py @@ -0,0 +1,7 @@ +from string.templatelib import Template + +def html(*chunks: Template): + ... + +variable = 42 +html("{vari") \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/Py3CompletionTest.java b/python/testSrc/com/jetbrains/python/Py3CompletionTest.java index 144e27b2b414..a27d1d035ce8 100644 --- a/python/testSrc/com/jetbrains/python/Py3CompletionTest.java +++ b/python/testSrc/com/jetbrains/python/Py3CompletionTest.java @@ -516,6 +516,17 @@ public class Py3CompletionTest extends PyTestCase { doTest(); } + // PY-80850 + public void testFStringLikeCompletionAddsTPrefixWhereTemplateStringIsExpectedAsPositionalVarargArgument() { + doTest(); + } + + + // PY-80850 + public void testFStringLikeCompletionAddsTPrefixWhereTemplateStringIsExpectedAsKeywordVarargArgument() { + doTest(); + } + // PY-80850 public void testFStringLikeCompletionAddsTPrefixWhereTemplateStringIsExpectedAsAssignedValue() { doTest();