From 2ef80d1b3412171cdfe3fa0b3deb8d7c64ee21d3 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 4 Mar 2015 15:34:47 +0300 Subject: [PATCH] Completion after "this@" includes immediate this too #KT-6836 Fixed --- .../kotlin/idea/completion/CompletionSession.kt | 2 +- .../kotlin/idea/completion/CompletionUtils.kt | 13 +++++++++---- .../kotlin/idea/completion/smart/SmartCompletion.kt | 2 +- idea/testData/completion/keywords/QualifiedThis.kt | 4 ++-- .../completion/keywords/QualifiedThisInAccessor.kt | 5 +++++ .../testData/completion/smart/this/QualifiedThis.kt | 4 ++-- .../completion/KeywordCompletionTestGenerated.java | 6 ++++++ 7 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 idea/testData/completion/keywords/QualifiedThisInAccessor.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt b/idea/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt index 100d51b94dc..4b266109375 100644 --- a/idea/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt +++ b/idea/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt @@ -294,7 +294,7 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration, // if "this" is parsed correctly in the current context - insert it and all this@xxx items "this" -> { if (expression != null) { - collector.addElements(thisExpressionItems(bindingContext!!, expression).map { it.factory() }) + collector.addElements(thisExpressionItems(bindingContext!!, expression, prefix).map { it.factory() }) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/completion/CompletionUtils.kt b/idea/src/org/jetbrains/kotlin/idea/completion/CompletionUtils.kt index 95108b0abd9..bbe58685adf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/completion/CompletionUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/completion/CompletionUtils.kt @@ -212,22 +212,27 @@ fun shouldCompleteThisItems(prefixMatcher: PrefixMatcher): Boolean { data class ThisItemInfo(val factory: () -> LookupElement, val type: FuzzyType) -fun thisExpressionItems(bindingContext: BindingContext, position: JetExpression): Collection { +fun thisExpressionItems(bindingContext: BindingContext, position: JetExpression, prefix: String): Collection { val scope = bindingContext[BindingContext.RESOLUTION_SCOPE, position] ?: return listOf() val result = ArrayList() for ((i, receiver) in scope.getImplicitReceiversWithInstance().withIndex()) { val thisType = receiver.getType() val fuzzyType = FuzzyType(thisType, listOf()) - val label = if (i == 0) null else (thisQualifierName(receiver) ?: continue) - fun createLookupElement(): LookupElement { + fun createLookupElement(label: String?): LookupElement { var element = createKeywordWithLabelElement("this", label) element = element.withTypeText(DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(thisType)) return element } - result.add(ThisItemInfo({ createLookupElement() }, fuzzyType)) + if (i == 0) { + result.add(ThisItemInfo({ createLookupElement(null) }, fuzzyType)) + if (!prefix.startsWith("this@")) continue // if prefix does not start with "this@" do not include immediate this in the form with label + } + + val label = thisQualifierName(receiver) ?: continue + result.add(ThisItemInfo({ createLookupElement(label) }, fuzzyType)) } return result } diff --git a/idea/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletion.kt b/idea/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletion.kt index f906d78be6e..5d458b7d8ba 100644 --- a/idea/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletion.kt +++ b/idea/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletion.kt @@ -185,7 +185,7 @@ class SmartCompletion( private fun MutableCollection.addThisItems(place: JetExpression, expectedInfos: Collection) { if (shouldCompleteThisItems(prefixMatcher)) { - val items = thisExpressionItems(bindingContext, place) + val items = thisExpressionItems(bindingContext, place, prefixMatcher.getPrefix()) for ((factory, type) in items) { val classifier = { (expectedInfo: ExpectedInfo) -> type.classifyExpectedInfo(expectedInfo) } addLookupElements(null, expectedInfos, classifier) { diff --git a/idea/testData/completion/keywords/QualifiedThis.kt b/idea/testData/completion/keywords/QualifiedThis.kt index d79a40139d3..be537ff2870 100644 --- a/idea/testData/completion/keywords/QualifiedThis.kt +++ b/idea/testData/completion/keywords/QualifiedThis.kt @@ -7,7 +7,7 @@ class Outer { } // ABSENT: this -// ABSENT: "this@foo" +// EXIST: { lookupString: "this@foo", itemText: "this", tailText: "@foo", typeText: "String", attributes: "bold" } // EXIST: { lookupString: "this@Inner", itemText: "this", tailText: "@Inner", typeText: "Outer.Inner", attributes: "bold" } // EXIST: { lookupString: "this@Outer", itemText: "this", tailText: "@Outer", typeText: "Outer", attributes: "bold" } -// NUMBER: 2 +// NUMBER: 3 diff --git a/idea/testData/completion/keywords/QualifiedThisInAccessor.kt b/idea/testData/completion/keywords/QualifiedThisInAccessor.kt new file mode 100644 index 00000000000..21c4dca6d4b --- /dev/null +++ b/idea/testData/completion/keywords/QualifiedThisInAccessor.kt @@ -0,0 +1,5 @@ +val String.foo: Int + get() = this@.length() + +// EXIST: "this@foo" +// NUMBER: 1 diff --git a/idea/testData/completion/smart/this/QualifiedThis.kt b/idea/testData/completion/smart/this/QualifiedThis.kt index ce51d8065ac..5283b4c901a 100644 --- a/idea/testData/completion/smart/this/QualifiedThis.kt +++ b/idea/testData/completion/smart/this/QualifiedThis.kt @@ -7,7 +7,7 @@ class Outer { } // ABSENT: this -// ABSENT: "this@foo" +// EXIST: { lookupString: "this@foo", itemText: "this", tailText: "@foo", typeText: "String", attributes: "bold" } // EXIST: { lookupString: "this@Inner", itemText: "this", tailText: "@Inner", typeText: "Outer.Inner", attributes: "bold" } // EXIST: { lookupString: "this@Outer", itemText: "this", tailText: "@Outer", typeText: "Outer", attributes: "bold" } -// NUMBER: 2 +// NUMBER: 3 diff --git a/idea/tests/org/jetbrains/kotlin/completion/KeywordCompletionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/completion/KeywordCompletionTestGenerated.java index df047296a02..97d07b902da 100644 --- a/idea/tests/org/jetbrains/kotlin/completion/KeywordCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/completion/KeywordCompletionTestGenerated.java @@ -330,6 +330,12 @@ public class KeywordCompletionTestGenerated extends AbstractKeywordCompletionTes doTest(fileName); } + @TestMetadata("QualifiedThisInAccessor.kt") + public void testQualifiedThisInAccessor() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/keywords/QualifiedThisInAccessor.kt"); + doTest(fileName); + } + @TestMetadata("Return1.kt") public void testReturn1() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/keywords/Return1.kt");