diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/BasicKotlinReferenceTransferableData.kt b/idea/src/org/jetbrains/kotlin/idea/codeInsight/BasicKotlinReferenceTransferableData.kt index c9ae183e525..d093da7914d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInsight/BasicKotlinReferenceTransferableData.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/BasicKotlinReferenceTransferableData.kt @@ -14,6 +14,7 @@ class BasicKotlinReferenceTransferableData( val sourceFileUrl: String, val packageName: String, val imports: List, + val sourceTextOffset: Int, val sourceText: String, val textRanges: List ) : TextBlockTransferableData, Cloneable, Serializable { diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt index 6b89a7d808f..654564a18e3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt @@ -37,10 +37,13 @@ import com.intellij.psi.* import com.intellij.psi.util.PsiTreeUtil import com.intellij.util.concurrency.AppExecutorUtil import org.jetbrains.annotations.TestOnly -import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.CallableDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.idea.caches.resolve.allowResolveInDispatchThread import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference +import org.jetbrains.kotlin.idea.codeInsight.ReviewAddedImports.reviewAddedImports import org.jetbrains.kotlin.idea.codeInsight.shorten.performDelayedRefactoringRequests import org.jetbrains.kotlin.idea.core.util.end import org.jetbrains.kotlin.idea.core.util.range @@ -62,6 +65,7 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull +import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.utils.findFunction @@ -109,15 +113,14 @@ class KotlinCopyPasteReferenceProcessor : CopyPastePostProcessor result.addReferenceDataInsideElement( - ktElement, file, range.start, ranges, bindingContext, - fakePackageName = fakePackageName, sourcePackageName = sourcePackageName, targetPackageName = targetPackageName + ktElement, file, ranges, bindingContext, fakePackageName = fakePackageName, + sourcePackageName = sourcePackageName, targetPackageName = targetPackageName ) } } @@ -190,7 +193,6 @@ class KotlinCopyPasteReferenceProcessor : CopyPastePostProcessor.addReferenceDataInsideElement( ktElement: KtElement, file: KtFile, - startOffset: Int, textRanges: List, bindingContext: BindingContext, fakePackageName: String? = null, @@ -230,14 +232,14 @@ class KotlinCopyPasteReferenceProcessor : CopyPastePostProcessor - val textRange = TextRange(blockStart, blockStart + originalTextRange.endOffset - originalTextRange.startOffset) + val textRange = TextRange( + startOffsetDelta, + startOffsetDelta + originalTextRange.endOffset - originalTextRange.startOffset + ) + startOffsetDelta = startOffsetDelta + originalTextRange.endOffset - originalTextRange.startOffset + 1 file.elementsInRange(textRange) .filter { it is KtElement || it is KDocElement } - .map { PsiElementByTextRange(it.textRange, it) } + .map { + val range = TextRange( + originalTextRange.startOffset + it.textRange.startOffset - textRange.startOffset, + originalTextRange.startOffset + it.textRange.endOffset - textRange.startOffset + ) + PsiElementByTextRange(range, it) + } } - processReferenceData(project, file) { indicator: ProgressIndicator -> + processReferenceData(project, editor, file) { indicator: ProgressIndicator -> findReferenceDataToRestore( file, - blockStart, indicator, elementsByRange, transferableData @@ -286,14 +300,15 @@ class KotlinCopyPasteReferenceProcessor : CopyPastePostProcessor) { - processReferenceData(project, file) { indicator: ProgressIndicator -> + fun processReferenceData(project: Project, editor: Editor, file: KtFile, blockStart: Int, referenceData: Array) { + processReferenceData(project, editor, file) { indicator: ProgressIndicator -> findReferencesToRestore(file, blockStart, referenceData) } } private fun processReferenceData( project: Project, + editor: Editor, file: KtFile, findReferenceProvider: (indicator: ProgressIndicator) -> List ) { @@ -309,13 +324,7 @@ class KotlinCopyPasteReferenceProcessor : CopyPastePostProcessor> { referencesPossibleToRestore -> - val selectedReferencesToRestore = - showRestoreReferencesDialog(project, referencesPossibleToRestore) - if (selectedReferencesToRestore.isEmpty()) return@Consumer - - project.executeWriteCommand("resolve pasted references") { - restoreReferences(selectedReferencesToRestore, file) - } + applyResolvedImports(project, referencesPossibleToRestore, file, editor) } ) .withDocumentsCommitted(project) @@ -326,9 +335,26 @@ class KotlinCopyPasteReferenceProcessor : CopyPastePostProcessor, + file: KtFile, + editor: Editor + ) { + val selectedReferencesToRestore = + showRestoreReferencesDialog(project, referencesPossibleToRestore) + if (selectedReferencesToRestore.isEmpty()) return + + project.executeWriteCommand("resolve pasted references") { + val imported = TreeSet() + restoreReferences(selectedReferencesToRestore, file, imported) + + reviewAddedImports(project, editor, file, imported) + } + } + private fun findReferenceDataToRestore( file: PsiFile, - blockStart: Int, indicator: ProgressIndicator, elementsByRange: List, transferableData: BasicKotlinReferenceTransferableData @@ -339,7 +365,7 @@ class KotlinCopyPasteReferenceProcessor : CopyPastePostProcessor>() val refElementsRanges = mutableListOf>() - val offsetDelta = element.startOffset - elementByTextRange.textRange.startOffset + val offsetDelta = elementByTextRange.originalTextRange.startOffset - element.textRange.startOffset element.forEachDescendant { ktElement -> indicator.checkCanceled() @@ -347,12 +373,7 @@ class KotlinCopyPasteReferenceProcessor : CopyPastePostProcessor, referencesByPosition: Map ): List = // use already found reference candidates - so file could be changed - findReferences(file, referenceData - .map { - val textRange = TextRange(it.startOffset + blockStart, it.endOffset + blockStart) - val reference = referencesByPosition[textRange] - it to if (reference?.element?.isValid == true) reference else null - }) + findReferences(file, referenceData.map { + val textRange = TextRange(it.startOffset, it.endOffset) + val reference = referencesByPosition[textRange] + it to if (reference?.element?.isValid == true) reference else null + }) private fun findReferences( file: PsiFile, @@ -575,7 +596,11 @@ class KotlinCopyPasteReferenceProcessor : CopyPastePostProcessor, file: KtFile) { + private fun restoreReferences( + referencesToRestore: Collection, + file: KtFile, + imported: MutableSet + ) { val importHelper = ImportInsertHelper.getInstance(file.project) val smartPointerManager = SmartPointerManager.getInstance(file.project) @@ -606,9 +631,14 @@ class KotlinCopyPasteReferenceProcessor : CopyPastePostProcessor = emptyList() + + @get:TestOnly + var importsToBeDeleted: Collection = emptyList() + + fun reviewAddedImports( + project: Project, + editor: Editor, + file: KtFile, + imported: TreeSet + ) { + if (CodeInsightSettings.getInstance().ADD_IMPORTS_ON_PASTE == CodeInsightSettings.YES && + !imported.isEmpty() + ) { + if (ApplicationManager.getApplication().isUnitTestMode) { + importsToBeReviewed = imported + removeImports(project, file, importsToBeDeleted) + return + } + val notificationText = CodeInsightBundle + .message("copy.paste.reference.notification", imported.size) + ApplicationManager.getApplication().invokeLater( + Runnable { + showHint( + editor, + notificationText, + HyperlinkListener { e: HyperlinkEvent -> + if (e.eventType == HyperlinkEvent.EventType.ACTIVATED) { + reviewImports(project, file, imported) + } + } + ) + }, ModalityState.NON_MODAL + ) + } + } + + private fun showHint( + editor: Editor, + info: String, + hyperlinkListener: HyperlinkListener + ) { + if (ApplicationManager.getApplication().isUnitTestMode) return + val hint = LightweightHint(HintUtil.createInformationLabel(info, hyperlinkListener, null, null)) + val flags = HintManager.HIDE_BY_ANY_KEY or HintManager.HIDE_BY_TEXT_CHANGE + HintManagerImpl.getInstanceImpl().showEditorHint(hint, editor, HintManager.UNDER, flags, 0, false) + } + + private fun reviewImports( + project: Project, + file: KtFile, + importedClasses: Set + ) { + val dialog = RestoreReferencesDialog(project, ArrayUtil.toObjectArray(importedClasses)) + dialog.title = CodeInsightBundle.message("dialog.import.on.paste.title3") + if (dialog.showAndGet()) { + removeImports(project, file, dialog.selectedElements.map { it as String }.toSortedSet()) + } + } + + private fun removeImports( + project: Project, + file: KtFile, + importsToRemove: Collection + ) { + if (importsToRemove.isEmpty()) return + + WriteCommandAction.runWriteCommandAction(project, "revert applied imports", null, Runnable { + val newImports = file.importDirectives.mapNotNull { + val importedFqName = it.importedFqName ?: return@mapNotNull null + if (importsToRemove.contains(importedFqName.asString())) return@mapNotNull null + ImportPath(importedFqName, it.isAllUnder, it.aliasName?.let { alias -> Name.identifier(alias) }) + } + KotlinImportOptimizer.replaceImports(file, newImports) + }) + } + +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteUtil.kt.191 b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteUtil.kt.191 new file mode 100644 index 00000000000..1040c22713a --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteUtil.kt.191 @@ -0,0 +1,71 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.codeInsight + +import com.intellij.codeInsight.CodeInsightBundle +import com.intellij.codeInsight.CodeInsightSettings +import com.intellij.codeInsight.hint.HintManager +import com.intellij.codeInsight.hint.HintManagerImpl +import com.intellij.codeInsight.hint.HintUtil +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.application.ModalityState +import com.intellij.openapi.command.WriteCommandAction +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import com.intellij.ui.LightweightHint +import com.intellij.util.ArrayUtil +import org.jetbrains.annotations.TestOnly +import org.jetbrains.kotlin.idea.imports.KotlinImportOptimizer +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.resolve.ImportPath +import java.util.* +import javax.swing.event.HyperlinkEvent +import javax.swing.event.HyperlinkListener + +object ReviewAddedImports { + @get:TestOnly + var importsToBeReviewed: Collection = emptyList() + + @get:TestOnly + var importsToBeDeleted: Collection = emptyList() + + fun reviewAddedImports( + project: Project, + editor: Editor, + file: KtFile, + imported: TreeSet + ) { + if (CodeInsightSettings.getInstance().ADD_IMPORTS_ON_PASTE == CodeInsightSettings.YES && + !imported.isEmpty() + ) { + if (ApplicationManager.getApplication().isUnitTestMode) { + importsToBeReviewed = imported + removeImports(project, file, importsToBeDeleted) + return + } + // there is actual no such functionality in 191 + } + } + + private fun removeImports( + project: Project, + file: KtFile, + importsToRemove: Collection + ) { + if (importsToRemove.isEmpty()) return + + WriteCommandAction.runWriteCommandAction(project, "revert applied imports", null, Runnable { + val newImports = file.importDirectives.mapNotNull { + val importedFqName = it.importedFqName ?: return@mapNotNull null + if (importsToRemove.contains(importedFqName.asString())) return@mapNotNull null + ImportPath(importedFqName, it.isAllUnder, it.aliasName?.let { alias -> Name.identifier(alias) }) + } + KotlinImportOptimizer.replaceImports(file, newImports) + }) + } + +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteUtil.kt.192 b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteUtil.kt.192 new file mode 100644 index 00000000000..c0579aad0a3 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteUtil.kt.192 @@ -0,0 +1,71 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.codeInsight + +import com.intellij.codeInsight.CodeInsightBundle +import com.intellij.codeInsight.CodeInsightSettings +import com.intellij.codeInsight.hint.HintManager +import com.intellij.codeInsight.hint.HintManagerImpl +import com.intellij.codeInsight.hint.HintUtil +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.application.ModalityState +import com.intellij.openapi.command.WriteCommandAction +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import com.intellij.ui.LightweightHint +import com.intellij.util.ArrayUtil +import org.jetbrains.annotations.TestOnly +import org.jetbrains.kotlin.idea.imports.KotlinImportOptimizer +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.resolve.ImportPath +import java.util.* +import javax.swing.event.HyperlinkEvent +import javax.swing.event.HyperlinkListener + +object ReviewAddedImports { + @get:TestOnly + var importsToBeReviewed: Collection = emptyList() + + @get:TestOnly + var importsToBeDeleted: Collection = emptyList() + + fun reviewAddedImports( + project: Project, + editor: Editor, + file: KtFile, + imported: TreeSet + ) { + if (CodeInsightSettings.getInstance().ADD_IMPORTS_ON_PASTE == CodeInsightSettings.YES && + !imported.isEmpty() + ) { + if (ApplicationManager.getApplication().isUnitTestMode) { + importsToBeReviewed = imported + removeImports(project, file, importsToBeDeleted) + return + } + // there is actual no such functionality in 192 + } + } + + private fun removeImports( + project: Project, + file: KtFile, + importsToRemove: Collection + ) { + if (importsToRemove.isEmpty()) return + + WriteCommandAction.runWriteCommandAction(project, "revert applied imports", null, Runnable { + val newImports = file.importDirectives.mapNotNull { + val importedFqName = it.importedFqName ?: return@mapNotNull null + if (importsToRemove.contains(importedFqName.asString())) return@mapNotNull null + ImportPath(importedFqName, it.isAllUnder, it.aliasName?.let { alias -> Name.identifier(alias) }) + } + KotlinImportOptimizer.replaceImports(file, newImports) + }) + } + +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/conversion/copy/ConvertJavaCopyPasteProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/conversion/copy/ConvertJavaCopyPasteProcessor.kt index 98bfd0eb883..4e53207495c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/conversion/copy/ConvertJavaCopyPasteProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/conversion/copy/ConvertJavaCopyPasteProcessor.kt @@ -130,7 +130,7 @@ class ConvertJavaCopyPasteProcessor : CopyPastePostProcessor @@ -224,7 +224,11 @@ class ConvertJavaCopyPasteProcessor : CopyPastePostProcessorfun g(t: T): Int { + g(A) + B.f() + A + B + A.Companion + B.Companion +} + + diff --git a/idea/testData/copyPaste/imports/ClassObjectAndDropImports.to.kt b/idea/testData/copyPaste/imports/ClassObjectAndDropImports.to.kt new file mode 100644 index 00000000000..72200fafe50 --- /dev/null +++ b/idea/testData/copyPaste/imports/ClassObjectAndDropImports.to.kt @@ -0,0 +1,7 @@ +package to + +import java.util.* +import java.util.concurrent.atomic.AtomicReference +import java.util.concurrent.atomic.AtomicLong as ALong + + \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/EntireFile.expected.kt b/idea/testData/copyPaste/imports/EntireFile.expected.kt index ad51978e4b3..7a0028a3931 100644 --- a/idea/testData/copyPaste/imports/EntireFile.expected.kt +++ b/idea/testData/copyPaste/imports/EntireFile.expected.kt @@ -14,7 +14,7 @@ package d import foo.Bar /** - * Some kdoc for class Foo + * Some kdoc [Bar] for class Foo */ class Foo(val a: A) { } diff --git a/idea/testData/copyPaste/imports/EntireFile.kt b/idea/testData/copyPaste/imports/EntireFile.kt index f689537e523..bab3556f60a 100644 --- a/idea/testData/copyPaste/imports/EntireFile.kt +++ b/idea/testData/copyPaste/imports/EntireFile.kt @@ -12,7 +12,7 @@ package d import foo.Bar /** - * Some kdoc for class Foo + * Some kdoc [Bar] for class Foo */ class Foo(val a: A) { } diff --git a/idea/testData/copyPaste/imports/MultiCaretSelectionEntireFile.dependency.kt b/idea/testData/copyPaste/imports/MultiCaretSelectionEntireFile.dependency.kt new file mode 100644 index 00000000000..c35e97d0c91 --- /dev/null +++ b/idea/testData/copyPaste/imports/MultiCaretSelectionEntireFile.dependency.kt @@ -0,0 +1,3 @@ +package foo + +class Bar(val v: Int){} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/MultiCaretSelectionEntireFile.expected.kt b/idea/testData/copyPaste/imports/MultiCaretSelectionEntireFile.expected.kt new file mode 100644 index 00000000000..b1208ef8788 --- /dev/null +++ b/idea/testData/copyPaste/imports/MultiCaretSelectionEntireFile.expected.kt @@ -0,0 +1,19 @@ +package to + +import d.A + + +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ +package d + +import foo.Bar + +/** + * Some kdoc [Bar] for class Foo + */ + +class Foo(val a: A) { +} diff --git a/idea/testData/copyPaste/imports/MultiCaretSelectionEntireFile.expected.names b/idea/testData/copyPaste/imports/MultiCaretSelectionEntireFile.expected.names new file mode 100644 index 00000000000..ecaf3d61381 --- /dev/null +++ b/idea/testData/copyPaste/imports/MultiCaretSelectionEntireFile.expected.names @@ -0,0 +1 @@ +d.A diff --git a/idea/testData/copyPaste/imports/MultiCaretSelectionEntireFile.kt b/idea/testData/copyPaste/imports/MultiCaretSelectionEntireFile.kt new file mode 100644 index 00000000000..7e95c566a39 --- /dev/null +++ b/idea/testData/copyPaste/imports/MultiCaretSelectionEntireFile.kt @@ -0,0 +1,22 @@ +// WITH_LIBRARY: copyPaste/imports/KotlinLibrary + +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ +package d + +/* + * Some comment in front of imports + */ + +import foo.Bar + + +/** + * Some kdoc [Bar] for class Foo + */ + +class Foo(val a: A) { +} + \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/AbstractInsertImportOnPasteTest.kt b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/AbstractInsertImportOnPasteTest.kt index 1cc82bea0c3..e340ff089d4 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/AbstractInsertImportOnPasteTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/AbstractInsertImportOnPasteTest.kt @@ -47,6 +47,14 @@ abstract class AbstractInsertImportOnPasteTest : AbstractCopyPasteTest() { } KotlinCopyPasteReferenceProcessor.declarationsToImportSuggested = emptyList() + ReviewAddedImports.importsToBeReviewed = emptyList() + + val importsToBeDeletedFile = testDataFile(testFileName.replace(".kt", ".imports_to_delete")) + ReviewAddedImports.importsToBeDeleted = if (importsToBeDeletedFile.exists()) { + importsToBeDeletedFile.readLines() + } else { + emptyList() + } configureTargetFile(testFileName.replace(".kt", ".to.kt")) performNotWriteEditorAction(IdeActions.ACTION_PASTE) @@ -59,6 +67,7 @@ abstract class AbstractInsertImportOnPasteTest : AbstractCopyPasteTest() { val namesToImportDump = KotlinCopyPasteReferenceProcessor.declarationsToImportSuggested.joinToString("\n") KotlinTestUtils.assertEqualsToFile(testDataFile(testFileName.replace(".kt", ".expected.names")), namesToImportDump) + assertEquals(namesToImportDump, ReviewAddedImports.importsToBeReviewed.joinToString("\n")) val resultFile = myFixture.file as KtFile val resultText = if (InTextDirectivesUtils.isDirectiveDefined(testFileText, NO_ERRORS_DUMP_DIRECTIVE)) diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java index 179107990f7..028a070a4c9 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InsertImportOnPasteTestGenerated.java @@ -55,6 +55,11 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast runTest("idea/testData/copyPaste/imports/ClassObject.kt"); } + @TestMetadata("ClassObjectAndDropImports.kt") + public void testClassObjectAndDropImports() throws Exception { + runTest("idea/testData/copyPaste/imports/ClassObjectAndDropImports.kt"); + } + @TestMetadata("ClassObjectFunInsideClass.kt") public void testClassObjectFunInsideClass() throws Exception { runTest("idea/testData/copyPaste/imports/ClassObjectFunInsideClass.kt"); @@ -245,6 +250,11 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast runTest("idea/testData/copyPaste/imports/Local.kt"); } + @TestMetadata("MultiCaretSelectionEntireFile.kt") + public void testMultiCaretSelectionEntireFile() throws Exception { + runTest("idea/testData/copyPaste/imports/MultiCaretSelectionEntireFile.kt"); + } + @TestMetadata("MultiDeclaration.kt") public void testMultiDeclaration() throws Exception { runTest("idea/testData/copyPaste/imports/MultiDeclaration.kt"); @@ -408,6 +418,11 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast runTest("idea/testData/copyPaste/imports/ClassObject.kt"); } + @TestMetadata("ClassObjectAndDropImports.kt") + public void testClassObjectAndDropImports() throws Exception { + runTest("idea/testData/copyPaste/imports/ClassObjectAndDropImports.kt"); + } + @TestMetadata("ClassObjectFunInsideClass.kt") public void testClassObjectFunInsideClass() throws Exception { runTest("idea/testData/copyPaste/imports/ClassObjectFunInsideClass.kt"); @@ -598,6 +613,11 @@ public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPast runTest("idea/testData/copyPaste/imports/Local.kt"); } + @TestMetadata("MultiCaretSelectionEntireFile.kt") + public void testMultiCaretSelectionEntireFile() throws Exception { + runTest("idea/testData/copyPaste/imports/MultiCaretSelectionEntireFile.kt"); + } + @TestMetadata("MultiDeclaration.kt") public void testMultiDeclaration() throws Exception { runTest("idea/testData/copyPaste/imports/MultiDeclaration.kt");