PY-58374 Fix dict keys completion when editing an existing key

GitOrigin-RevId: 41434300f6ea0f776a115a869fb9578a84015471
This commit is contained in:
lada.gagina
2023-01-11 21:49:10 +01:00
committed by intellij-monorepo-bot
parent 42820a0311
commit f3da5e58ae
3 changed files with 27 additions and 3 deletions

View File

@@ -31,7 +31,10 @@ private class DictLiteralCompletionProvider : CompletionProvider<CompletionParam
override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, result: CompletionResultSet) {
val originalElement = parameters.originalPosition?.parent ?: return
val possibleSequenceExpr = if (originalElement is PyStringLiteralExpression) originalElement.parent else originalElement
var possibleSequenceExpr = if (originalElement is PyStringLiteralExpression) originalElement.parent else originalElement
if (possibleSequenceExpr is PyKeyValueExpression) {
possibleSequenceExpr = possibleSequenceExpr.parent
}
if (possibleSequenceExpr is PyDictLiteralExpression || possibleSequenceExpr is PySetLiteralExpression) { // it's set literal when user is typing the first key
addCompletionToCallExpression(originalElement, possibleSequenceExpr as PySequenceExpression, result)
addCompletionToAssignment(originalElement, possibleSequenceExpr, result)

View File

@@ -0,0 +1,10 @@
from typing import TypedDict
class Point(TypedDict):
coordinateX: int
coordinateY: int
coordinateZ: int
p: Point = {'coo<caret>': 42, 'coordinateY': 42}

View File

@@ -67,12 +67,23 @@ class PyDictLiteralCompletionTest : PyTestCase() {
assertCompletionContains("'x'")
}
// PY-58374
fun testEditingKeyWithExistingValue() {
val variants = getVariants()
assertContainsElements(variants, "coordinateX", "coordinateZ")
assertDoesntContain(variants, "coordinateY")
}
private fun assertCompletionContains(vararg expected: String) {
val variants = getVariants()
assertContainsElements(variants, *expected)
}
private fun getVariants(): List<String> {
myFixture.copyDirectoryToProject(getTestName(false), "")
myFixture.configureByFile("main.py")
myFixture.completeBasic()
val variants = myFixture.lookupElementStrings ?: emptyList()
assertContainsElements(variants, *expected)
return myFixture.lookupElementStrings ?: emptyList()
}