diff --git a/idea/idea-completion/testData/handlers/multifile/smart/ImportAnonymousObject-1.kt b/idea/idea-completion/testData/handlers/multifile/smart/ImportAnonymousObject-1.kt new file mode 100644 index 00000000000..0482c267628 --- /dev/null +++ b/idea/idea-completion/testData/handlers/multifile/smart/ImportAnonymousObject-1.kt @@ -0,0 +1,5 @@ +import test.foo.Foo + +fun foo() { + val x: Foo = FooC +} \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/multifile/smart/ImportAnonymousObject-2.kt b/idea/idea-completion/testData/handlers/multifile/smart/ImportAnonymousObject-2.kt new file mode 100644 index 00000000000..90a94bcb636 --- /dev/null +++ b/idea/idea-completion/testData/handlers/multifile/smart/ImportAnonymousObject-2.kt @@ -0,0 +1,9 @@ +package test.foo + +interface Foo { + fun run(): Unit +} + +abstract class FooClass : Foo { + +} \ No newline at end of file diff --git a/idea/idea-completion/testData/handlers/multifile/smart/ImportAnonymousObject.kt.after b/idea/idea-completion/testData/handlers/multifile/smart/ImportAnonymousObject.kt.after new file mode 100644 index 00000000000..5cf25c51cd8 --- /dev/null +++ b/idea/idea-completion/testData/handlers/multifile/smart/ImportAnonymousObject.kt.after @@ -0,0 +1,10 @@ +import test.foo.Foo +import test.foo.FooClass + +fun foo() { + val x: Foo = object : FooClass() { + override fun run() { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + } +} \ No newline at end of file diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/SmartCompletionMultifileHandlerTest.kt b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/SmartCompletionMultifileHandlerTest.kt index 58a349dd7f0..cc74d811865 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/SmartCompletionMultifileHandlerTest.kt +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/SmartCompletionMultifileHandlerTest.kt @@ -22,6 +22,8 @@ class SmartCompletionMultifileHandlerTest : KotlinCompletionTestCase() { fun testAnonymousObjectGenericJava() { doTest() } + fun testImportAnonymousObject() { doTest() } + fun testNestedSamAdapter() { doTest(lookupString = "Nested") } override fun setUp() { diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/generateUtil.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/generateUtil.kt index 940a213f064..3d1362033e7 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/generateUtil.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/generateUtil.kt @@ -19,10 +19,7 @@ package org.jetbrains.kotlin.idea.core import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.ScrollType import com.intellij.openapi.util.text.StringUtil -import com.intellij.psi.PsiDocumentManager -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiWhiteSpace -import com.intellij.psi.SmartPointerManager +import com.intellij.psi.* import com.intellij.psi.codeStyle.CodeStyleManager import com.intellij.psi.util.PsiTreeUtil import com.intellij.util.SmartList @@ -225,7 +222,8 @@ fun insertMembersAfter( members.ifEmpty { return emptyList() } val project = classOrObject.project return runWriteAction { - val insertedMembers = SmartList() + val insertedMembers = SmartList>() + fun insertedMembersElements() = insertedMembers.mapNotNull { it.element } val (parameters, otherMembers) = members.partition { it is KtParameter } @@ -233,7 +231,7 @@ fun insertMembersAfter( if (classOrObject !is KtClass) return@mapNotNullTo null @Suppress("UNCHECKED_CAST") - (classOrObject.createPrimaryConstructorParameterListIfAbsent().addParameter(it as KtParameter) as T) + SmartPointerManager.createPointer(classOrObject.createPrimaryConstructorParameterListIfAbsent().addParameter(it as KtParameter) as T) } if (otherMembers.isNotEmpty()) { @@ -260,20 +258,21 @@ fun insertMembersAfter( } @Suppress("UNCHECKED_CAST") - (body.addAfter(it, afterAnchor) as T).apply { afterAnchor = this } + SmartPointerManager.createPointer((body.addAfter(it, afterAnchor) as T).apply { afterAnchor = this }) } } - @Suppress("UNCHECKED_CAST") val resultMembers = ShortenReferences.DEFAULT.process(insertedMembers) as Collection - val firstElement = resultMembers.firstOrNull() ?: return@runWriteAction emptyList() + ShortenReferences.DEFAULT.process(insertedMembersElements()) + + val firstElement = insertedMembersElements().firstOrNull() ?: return@runWriteAction emptyList() if (editor != null) { moveCaretIntoGeneratedElement(editor, firstElement) } val codeStyleManager = CodeStyleManager.getInstance(project) - resultMembers.forEach { codeStyleManager.reformat(it) } + insertedMembersElements().forEach { codeStyleManager.reformat(it) } - resultMembers.toList() + insertedMembersElements().toList() } }