diff --git a/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetClassInsertHandler.java b/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetClassInsertHandler.java index 024b7258d7a..abf7f11ecc3 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetClassInsertHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetClassInsertHandler.java @@ -20,6 +20,7 @@ import com.intellij.codeInsight.completion.InsertHandler; import com.intellij.codeInsight.completion.InsertionContext; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.RangeMarker; import com.intellij.psi.PsiDocumentManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; @@ -43,10 +44,23 @@ public class JetClassInsertHandler implements InsertHandler { Document document = context.getDocument(); if (!isAfterDot(document, startOffset)) { String text = DescriptorUtils.getFqName(descriptor).asString(); - document.replaceString(startOffset, context.getTailOffset(), text); + // insert dot after because otherwise parser can sometimes produce no suitable reference here + document.replaceString(startOffset, context.getTailOffset(), text + "."); + + PsiDocumentManager psiDocumentManager = PsiDocumentManager.getInstance(context.getProject()); + psiDocumentManager.commitAllDocuments(); + RangeMarker rangeMarker = document.createRangeMarker(startOffset, startOffset + text.length()); - PsiDocumentManager.getInstance(context.getProject()).commitAllDocuments(); ShortenReferences.instance$.process((JetFile) context.getFile(), startOffset, startOffset + text.length()); + psiDocumentManager.commitAllDocuments(); + psiDocumentManager.doPostponedOperationsAndUnblockDocument(document); + + if (rangeMarker.isValid()) { + int endOffset = rangeMarker.getEndOffset(); + if (endOffset < document.getTextLength() && document.getCharsSequence().charAt(endOffset) == '.') { + document.deleteString(endOffset, endOffset + 1); + } + } } } } diff --git a/idea/testData/completion/handlers/ClassCompletionBeforeName.kt b/idea/testData/completion/handlers/ClassCompletionBeforeName.kt new file mode 100644 index 00000000000..35fdcadade3 --- /dev/null +++ b/idea/testData/completion/handlers/ClassCompletionBeforeName.kt @@ -0,0 +1,2 @@ +fun Strfoo() { +} \ No newline at end of file diff --git a/idea/testData/completion/handlers/ClassCompletionBeforeName.kt.after b/idea/testData/completion/handlers/ClassCompletionBeforeName.kt.after new file mode 100644 index 00000000000..c6b8d0d45cd --- /dev/null +++ b/idea/testData/completion/handlers/ClassCompletionBeforeName.kt.after @@ -0,0 +1,2 @@ +fun StringBuilderfoo() { +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/completion/handlers/BasicCompletionHandlerTest.kt b/idea/tests/org/jetbrains/jet/completion/handlers/BasicCompletionHandlerTest.kt index 84175b8d3db..f89d5217b1a 100644 --- a/idea/tests/org/jetbrains/jet/completion/handlers/BasicCompletionHandlerTest.kt +++ b/idea/tests/org/jetbrains/jet/completion/handlers/BasicCompletionHandlerTest.kt @@ -32,6 +32,8 @@ public class BasicCompletionHandlerTest : CompletionHandlerTestBase(){ fun testClassCompletionInLambda() = doTest(1, "String", " (kotlin)", '\n') + fun testClassCompletionBeforeName() = doTest(1, "StringBuilder", " (java.lang)", '\n') + fun testDoNotInsertImportForAlreadyImported() = doTest() fun testDoNotInsertDefaultJsImports() = doTest()