diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt index f2f1a5b20e2..c5e0fca5ac7 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt @@ -333,9 +333,7 @@ class KotlinCompletionContributor : CompletionContributor() { val psiDocumentManager = PsiDocumentManager.getInstance(context.project) psiDocumentManager.commitAllDocuments() - assert(startOffset > 1 && document.charsSequence[startOffset - 1] == '.') - val token = context.file.findElementAt(startOffset - 2)!! - assert(token.node.elementType == KtTokens.IDENTIFIER || token.node.elementType == KtTokens.THIS_KEYWORD) + val token = getToken(context.file, document.charsSequence, startOffset) val nameRef = token.parent as KtNameReferenceExpression document.insertString(nameRef.startOffset, "{") @@ -346,6 +344,15 @@ class KotlinCompletionContributor : CompletionContributor() { super.handleInsert(context) } + + private fun getToken(file: PsiFile, charsSequence: CharSequence, startOffset: Int): PsiElement { + assert(startOffset > 1 && charsSequence[startOffset - 1] == '.') + val token = file.findElementAt(startOffset - 2)!! + return if (token.node.elementType == KtTokens.IDENTIFIER || token.node.elementType == KtTokens.THIS_KEYWORD) + token + else + getToken(file, charsSequence, token.startOffset + 1) + } } } diff --git a/idea/idea-completion/testData/basic/common/inStringLiterals/StringTemplateDot2.kt b/idea/idea-completion/testData/basic/common/inStringLiterals/StringTemplateDot2.kt new file mode 100644 index 00000000000..d22c70f4577 --- /dev/null +++ b/idea/idea-completion/testData/basic/common/inStringLiterals/StringTemplateDot2.kt @@ -0,0 +1,8 @@ +class Foo(val bar: Bar) +class Bar(val baz: String) + +fun foo(foo: Foo) { + val s = "$foo.bar." +} + +// EXIST: baz \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/basic/stringTemplate/AfterDot4.kt b/idea/idea-completion/testData/handlers/basic/stringTemplate/AfterDot4.kt new file mode 100644 index 00000000000..0c2e683f55a --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/stringTemplate/AfterDot4.kt @@ -0,0 +1,8 @@ +class Foo(val bar: Bar) +class Bar(val baz: String) + +fun foo(foo: Foo) { + val s = "$foo.bar." +} + +// ELEMENT: baz \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/basic/stringTemplate/AfterDot4.kt.after b/idea/idea-completion/testData/handlers/basic/stringTemplate/AfterDot4.kt.after new file mode 100644 index 00000000000..23a3a65ee84 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/stringTemplate/AfterDot4.kt.after @@ -0,0 +1,8 @@ +class Foo(val bar: Bar) +class Bar(val baz: String) + +fun foo(foo: Foo) { + val s = "${foo.bar.baz}" +} + +// ELEMENT: baz \ No newline at end of file diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java index fedba24db4e..0d9086ab6c7 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java @@ -1825,6 +1825,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } + @TestMetadata("StringTemplateDot2.kt") + public void testStringTemplateDot2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/inStringLiterals/StringTemplateDot2.kt"); + doTest(fileName); + } + @TestMetadata("StringTemplateDotSomething.kt") public void testStringTemplateDotSomething() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/inStringLiterals/StringTemplateDotSomething.kt"); diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java index b3db80aad51..1b4a7d57499 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java @@ -1825,6 +1825,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } + @TestMetadata("StringTemplateDot2.kt") + public void testStringTemplateDot2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/inStringLiterals/StringTemplateDot2.kt"); + doTest(fileName); + } + @TestMetadata("StringTemplateDotSomething.kt") public void testStringTemplateDotSomething() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/inStringLiterals/StringTemplateDotSomething.kt"); diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java index b4f415a8c5f..af9a5c6dfd8 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java @@ -835,6 +835,12 @@ public class BasicCompletionHandlerTestGenerated extends AbstractBasicCompletion doTest(fileName); } + @TestMetadata("AfterDot4.kt") + public void testAfterDot4() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/stringTemplate/AfterDot4.kt"); + doTest(fileName); + } + @TestMetadata("AfterThisDot.kt") public void testAfterThisDot() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/stringTemplate/AfterThisDot.kt");