From 3e85b97e1a8ad57164f5ae6a29296cb4a8b60a27 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 6 Mar 2015 16:30:53 +0300 Subject: [PATCH] Completion after $ in string literal works correctly for classes and objects --- .../jetbrains/kotlin/idea/completion/CompletionUtils.kt | 9 ++++----- .../kotlin/idea/completion/LookupElementsCollector.kt | 3 ++- .../handlers/multifile/ObjectInStringTemplate-1.kt | 3 +++ .../handlers/multifile/ObjectInStringTemplate-2.kt | 3 +++ .../handlers/multifile/ObjectInStringTemplate.kt.after | 5 +++++ .../handlers/CompletionMultifileHandlerTest.java | 4 ++++ 6 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 idea/testData/completion/handlers/multifile/ObjectInStringTemplate-1.kt create mode 100644 idea/testData/completion/handlers/multifile/ObjectInStringTemplate-2.kt create mode 100644 idea/testData/completion/handlers/multifile/ObjectInStringTemplate.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/completion/CompletionUtils.kt b/idea/src/org/jetbrains/kotlin/idea/completion/CompletionUtils.kt index cd7b8bb21ad..3ed42b52310 100644 --- a/idea/src/org/jetbrains/kotlin/idea/completion/CompletionUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/completion/CompletionUtils.kt @@ -16,10 +16,7 @@ package org.jetbrains.kotlin.idea.completion -import com.intellij.codeInsight.completion.CompletionProgressIndicator -import com.intellij.codeInsight.completion.CompletionService -import com.intellij.codeInsight.completion.InsertionContext -import com.intellij.codeInsight.completion.PrefixMatcher +import com.intellij.codeInsight.completion.* import com.intellij.codeInsight.lookup.* import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.util.Key @@ -72,7 +69,9 @@ fun LookupElement.withReceiverCast(): LookupElement { fun LookupElement.withBracesSurrounding(): LookupElement { return object: LookupElementDecorator(this) { override fun handleInsert(context: InsertionContext) { - context.getDocument().insertString(context.getStartOffset(), "{") + val startOffset = context.getStartOffset() + context.getDocument().insertString(startOffset, "{") + context.getOffsetMap().addOffset(CompletionInitializationContext.START_OFFSET, startOffset + 1) val tailOffset = context.getTailOffset() context.getDocument().insertString(tailOffset, "}") diff --git a/idea/src/org/jetbrains/kotlin/idea/completion/LookupElementsCollector.kt b/idea/src/org/jetbrains/kotlin/idea/completion/LookupElementsCollector.kt index 45fdeaea35b..2a109cd11fc 100644 --- a/idea/src/org/jetbrains/kotlin/idea/completion/LookupElementsCollector.kt +++ b/idea/src/org/jetbrains/kotlin/idea/completion/LookupElementsCollector.kt @@ -25,6 +25,7 @@ import com.intellij.codeInsight.lookup.LookupElementDecorator import com.intellij.codeInsight.lookup.LookupElementPresentation import com.intellij.openapi.util.TextRange import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.ClassifierDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor @@ -70,7 +71,7 @@ class LookupElementsCollector( lookupElement = lookupElement.withReceiverCast() } - if (surroundCallsWithBraces && descriptor is FunctionDescriptor) { + if (surroundCallsWithBraces && (descriptor is FunctionDescriptor || descriptor is ClassifierDescriptor)) { lookupElement = lookupElement.withBracesSurrounding() } diff --git a/idea/testData/completion/handlers/multifile/ObjectInStringTemplate-1.kt b/idea/testData/completion/handlers/multifile/ObjectInStringTemplate-1.kt new file mode 100644 index 00000000000..9a7f80677ac --- /dev/null +++ b/idea/testData/completion/handlers/multifile/ObjectInStringTemplate-1.kt @@ -0,0 +1,3 @@ +fun foo(): String { + val s = "$OOO" +} diff --git a/idea/testData/completion/handlers/multifile/ObjectInStringTemplate-2.kt b/idea/testData/completion/handlers/multifile/ObjectInStringTemplate-2.kt new file mode 100644 index 00000000000..52ad2a3cb57 --- /dev/null +++ b/idea/testData/completion/handlers/multifile/ObjectInStringTemplate-2.kt @@ -0,0 +1,3 @@ +package ppp + +object OOOOO \ No newline at end of file diff --git a/idea/testData/completion/handlers/multifile/ObjectInStringTemplate.kt.after b/idea/testData/completion/handlers/multifile/ObjectInStringTemplate.kt.after new file mode 100644 index 00000000000..2e643ee5390 --- /dev/null +++ b/idea/testData/completion/handlers/multifile/ObjectInStringTemplate.kt.after @@ -0,0 +1,5 @@ +import ppp.OOOOO + +fun foo(): String { + val s = "${OOOOO}" +} diff --git a/idea/tests/org/jetbrains/kotlin/completion/handlers/CompletionMultifileHandlerTest.java b/idea/tests/org/jetbrains/kotlin/completion/handlers/CompletionMultifileHandlerTest.java index 537b316959a..361f5322733 100644 --- a/idea/tests/org/jetbrains/kotlin/completion/handlers/CompletionMultifileHandlerTest.java +++ b/idea/tests/org/jetbrains/kotlin/completion/handlers/CompletionMultifileHandlerTest.java @@ -70,6 +70,10 @@ public class CompletionMultifileHandlerTest extends KotlinCompletionTestCase { doTest(); } + public void testObjectInStringTemplate() throws Exception { + doTest(); + } + public void doTest() throws Exception { String fileName = getTestName(false);