diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/codeInsight/shorten/shortenWaitingSet.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/codeInsight/shorten/shortenWaitingSet.kt index f728f575ddf..221e6a103dd 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/codeInsight/shorten/shortenWaitingSet.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/codeInsight/shorten/shortenWaitingSet.kt @@ -22,11 +22,12 @@ import org.jetbrains.kotlin.psi.JetElement import org.jetbrains.kotlin.psi.UserDataProperty import com.intellij.openapi.util.Key import org.jetbrains.kotlin.psi.NotNullableUserDataProperty -import java.util.HashSet import com.intellij.openapi.application.ApplicationManager import com.intellij.psi.SmartPointerManager import com.intellij.openapi.diagnostic.Logger import org.jetbrains.kotlin.idea.util.ShortenReferences.Options +import org.jetbrains.kotlin.idea.util.ShortenReferences +import java.util.* class ShorteningRequest(val pointer: SmartPsiElementPointer, val options: Options) @@ -43,7 +44,7 @@ public var Project.ensureElementsToShortenIsEmptyBeforeRefactoring: Boolean private fun Project.getOrCreateElementsToShorten(): MutableSet { var elements = elementsToShorten if (elements == null) { - elements = HashSet() + elements = LinkedHashSet() elementsToShorten = elements } @@ -57,12 +58,14 @@ public fun JetElement.addToShorteningWaitSet(options: Options = Options.DEFAULT) project.getOrCreateElementsToShorten().add(ShorteningRequest(elementPointer, options)) } -public fun withElementsToShorten(project: Project, f: (Set) -> Unit) { +public fun performDelayedShortening(project: Project) { project.elementsToShorten?.let { requests -> project.elementsToShorten = null - f(requests) + val elements = requests.map { it.pointer.getElement() } + val options = requests.map { it.options } + val elementToOptions = (elements zip options).toMap() + ShortenReferences({ elementToOptions[it] ?: ShortenReferences.Options.DEFAULT }).process(elements.filterNotNull()) } - } private val LOG = Logger.getInstance(javaClass().getCanonicalName()) diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt index 90611240e9b..5b74df0c892 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt @@ -16,54 +16,42 @@ package org.jetbrains.kotlin.idea.codeInsight -import com.intellij.psi.PsiFile -import com.intellij.psi.PsiElement -import com.intellij.codeInsight.editorActions.ReferenceData -import java.util.ArrayList import com.intellij.openapi.editor.RangeMarker import com.intellij.openapi.editor.Editor -import com.intellij.codeInsight.editorActions.ReferenceTransferableData import com.intellij.codeInsight.daemon.impl.CollectHighlightsUtil -import org.jetbrains.kotlin.psi.JetFile -import org.jetbrains.kotlin.idea.util.ImportInsertHelper import org.jetbrains.kotlin.name.FqName import com.intellij.openapi.project.Project import com.intellij.openapi.util.Ref import com.intellij.openapi.project.DumbService -import com.intellij.psi.PsiDocumentManager import com.intellij.openapi.application.ApplicationManager import java.awt.datatransfer.Transferable import com.intellij.codeInsight.CodeInsightSettings import com.intellij.codeInsight.editorActions.CopyPastePostProcessor -import org.jetbrains.kotlin.idea.references.JetReference -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import com.intellij.openapi.util.TextRange -import org.jetbrains.kotlin.psi.JetPsiFactory -import org.jetbrains.kotlin.psi.JetSimpleNameExpression import com.intellij.psi.util.PsiTreeUtil -import org.jetbrains.kotlin.psi.JetCallExpression import org.jetbrains.kotlin.types.ErrorUtils -import org.jetbrains.kotlin.psi.JetImportDirective -import org.jetbrains.kotlin.psi.JetPackageDirective -import org.jetbrains.kotlin.idea.references.JetMultiReference -import org.jetbrains.kotlin.psi.JetElement import org.jetbrains.kotlin.idea.conversion.copy.* import java.awt.datatransfer.UnsupportedFlavorException import java.io.IOException import com.intellij.openapi.diagnostic.Logger -import org.jetbrains.kotlin.psi.JetDotQualifiedExpression -import org.jetbrains.kotlin.psi.JetUserType -import org.jetbrains.kotlin.psi.JetTypeReference import org.jetbrains.kotlin.idea.imports.* import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression -import org.jetbrains.kotlin.utils.* -import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import com.intellij.openapi.progress.ProcessCanceledException -import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers -import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType +import org.jetbrains.kotlin.idea.references.* +import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver.LookupMode +import org.jetbrains.kotlin.resolve.* +import org.jetbrains.kotlin.idea.caches.resolve.* +import org.jetbrains.kotlin.idea.util.* +import org.jetbrains.kotlin.utils.* +import org.jetbrains.kotlin.idea.codeInsight.shorten.performDelayedShortening +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.resolve.descriptorUtil.* +import com.intellij.psi.* +import java.util.* //NOTE: this class is based on CopyPasteReferenceProcessor and JavaCopyPasteReferenceProcessor -public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor() { +public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor() { private val LOG = Logger.getInstance(javaClass()) private val IGNORE_REFERENCES_INSIDE: Array?> = array( @@ -71,17 +59,13 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor() ) - override fun extractTransferableData(content: Transferable): List { + override fun extractTransferableData(content: Transferable): List { if (CodeInsightSettings.getInstance().ADD_IMPORTS_ON_PASTE != CodeInsightSettings.NO) { try { - val flavor = ReferenceData.getDataFlavor() - if (flavor != null) { - val referenceData = content.getTransferData(flavor) as? ReferenceTransferableData - if (referenceData != null) { - // copy to prevent changing of original by convertLineSeparators - return listOf(referenceData.clone()) - } - } + val flavor = KotlinReferenceData.dataFlavor ?: return listOf() + val data = content.getTransferData(flavor) as? KotlinReferenceTransferableData ?: return listOf() + // copy to prevent changing of original by convertLineSeparators + return listOf(data.clone()) } catch (ignored: UnsupportedFlavorException) { } @@ -97,7 +81,7 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor { + ): List { if (file !is JetFile || DumbService.getInstance(file.getProject()).isDumb()) return listOf() val collectedData = try { @@ -120,7 +104,7 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor { + ): Collection { - fun collectReferenceData(referencedDeclaration: PsiElement, referencedDescriptor: DeclarationDescriptor): ReferenceData? { - if (referencedDeclaration.isInCopiedArea(file, startOffsets, endOffsets)) return null - if (isInReceiverScope(element, referencedDescriptor)) return null + if (PsiTreeUtil.getParentOfType(element, *IGNORE_REFERENCES_INSIDE) != null) return listOf() - val fqName = referencedDescriptor.importableFqName - if (fqName != null && referencedDescriptor.canBeReferencedViaImport()) { - return createReferenceData(element, startOffset, fqName) - } - return null - } - - - val isInsideIgnoredElement = PsiTreeUtil.getParentOfType(element, *IGNORE_REFERENCES_INSIDE) != null - if (isInsideIgnoredElement) return listOf() - - val reference = element.getReference() - if (reference !is JetReference) return listOf() + val reference = element.getReference() as? JetReference ?: return listOf() val resolveMap = reference.resolveMap() //check whether this reference is unambiguous if (reference !is JetMultiReference<*> && resolveMap.size() > 1) return listOf() - val collectedData = ArrayList() - for ((referencedDescriptor, declarations) in resolveMap) { - if (declarations.size() != 1) continue - collectedData.addIfNotNull(collectReferenceData(declarations.first(), referencedDescriptor)) + + val collectedData = ArrayList() + for ((descriptor, declarations) in resolveMap) { + val declaration = declarations.singleOrNull() ?: continue + if (declaration.isInCopiedArea(file, startOffsets, endOffsets)) continue + + if (!descriptor.isExtension) { + if (element !is JetNameReferenceExpression) continue + if (element.getIdentifier() == null) continue // skip 'this' etc + if (element.getReceiverExpression() != null) continue + } + + val fqName = descriptor.importableFqName ?: continue + if (!descriptor.canBeReferencedViaImport()) continue + + val kind = when (descriptor.getImportableDescriptor()) { + is ClassDescriptor -> + KotlinReferenceData.Kind.CLASS + + is PackageViewDescriptor -> + KotlinReferenceData.Kind.PACKAGE + + is CallableDescriptor -> + if (descriptor.isExtension) KotlinReferenceData.Kind.EXTENSION_CALLABLE else KotlinReferenceData.Kind.NON_EXTENSION_CALLABLE + + else -> + continue + } + collectedData.add(KotlinReferenceData(element.range.start - startOffset, element.range.end - startOffset, fqName.asString(), kind)) } return collectedData } - private fun createReferenceData(element: PsiElement, startOffset: Int, fqName: FqName) - = ReferenceData(element.range.start - startOffset, element.range.end - startOffset, fqName.asString(), null) - private data class ReferenceToRestoreData( - val expression: JetElement, - val fqName: FqName, - val lengthenReference: Boolean = false + val reference: JetReference, + val refData: KotlinReferenceData ) override fun processTransferableData ( @@ -175,7 +166,7 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor, - values: List + values: List ) { if (DumbService.getInstance(project).isDumb()) return @@ -187,7 +178,7 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor): List { + private fun findReferencesToRestore(file: PsiFile, bounds: RangeMarker, referenceData: Array): List { if (file !is JetFile) return listOf() return referenceData.map { - if (ImportInsertHelper.getInstance(file.getProject()).needImport(it.fqName, file)) { - val referenceExpression = findReference(it, file, bounds) - if (referenceExpression != null) - createReferenceToRestoreData(referenceExpression, it.fqName) - else - null - } - else { + val referenceElement = findReference(it, file, bounds) + if (referenceElement != null) + createReferenceToRestoreData(referenceElement, it) + else null - } }.filterNotNull() } - private fun findReference(data: ReferenceData, file: JetFile, bounds: RangeMarker): JetElement? { + private fun findReference(data: KotlinReferenceData, file: JetFile, bounds: RangeMarker): JetElement? { val startOffset = data.startOffset + bounds.getStartOffset() val endOffset = data.endOffset + bounds.getStartOffset() val element = file.findElementAt(startOffset) @@ -237,47 +223,65 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor { - return null - } - - !referencesSame && !conflict -> { - return ReferenceToRestoreData(expression, originalReferencedFqName) - } - - conflict -> { - val mustBeReferencedWithReceiver = referencedDescriptors.any { it.isExtension } - if (!mustBeReferencedWithReceiver && canLengthenReferenceExpression(expression, originalReferencedFqName)) { - return ReferenceToRestoreData(expression, originalReferencedFqName, lengthenReference = true) - } - } - } - return null + val referencedFqNames = referencedDescriptors.filterNot { ErrorUtils.isError(it) }.map { it.importableFqName }.filterNotNull() + val originalFqName = FqName(refData.fqName) + val referencesSame = referencedFqNames.any { it == originalFqName } + val conflict = referencedFqNames.any { it != originalFqName && it.shortName() == originalFqName.shortName() } + if (referencesSame && !conflict) return null + return ReferenceToRestoreData(reference, refData) } private fun restoreReferences(referencesToRestore: Collection, file: JetFile) { - for ((referenceExpression, fqName, shouldLengthen) in referencesToRestore) { - if (!shouldLengthen) { - ImportInsertHelper.getInstance(file.getProject()).addImportDirectiveIfNeeded(fqName, file) + val importHelper = ImportInsertHelper.getInstance(file.getProject()) + val smartPointerManager = SmartPointerManager.getInstance(file.getProject()) + + [data] class BindingRequest( + val pointer: SmartPsiElementPointer, + val fqName: FqName + ) + + val bindingRequests = ArrayList() + val descriptorsToImport = ArrayList() + for ((reference, refData) in referencesToRestore) { + val fqName = FqName(refData.fqName) + + if (refData.kind != KotlinReferenceData.Kind.EXTENSION_CALLABLE && reference is JetSimpleNameReference) { + val pointer = smartPointerManager.createSmartPsiElementPointer(reference.getElement(), file) + bindingRequests.add(BindingRequest(pointer, fqName)) } - else { - //TODO: try to shorten reference after (sometimes is possible), need shorten reference to support all relevant cases - lengthenReference(referenceExpression, fqName) + + if (refData.kind == KotlinReferenceData.Kind.NON_EXTENSION_CALLABLE || refData.kind == KotlinReferenceData.Kind.EXTENSION_CALLABLE) { + descriptorsToImport.addIfNotNull(findCallableToImport(fqName, file)) } } + + for (descriptor in descriptorsToImport) { + importHelper.importDescriptor(file, descriptor) + } + for ((pointer, fqName) in bindingRequests) { + val reference = pointer.getElement().getReference() as JetSimpleNameReference + reference.bindToFqName(fqName, JetSimpleNameReference.ShorteningMode.DELAYED_SHORTENING) + } + performDelayedShortening(file.getProject()) + } + + private fun findCallableToImport(fqName: FqName, file: JetFile): CallableDescriptor? { + val importDirective = JetPsiFactory(file.getProject()).createImportDirective(ImportPath(fqName, false)) + val moduleDescriptor = file.getResolutionFacade().findModuleDescriptor(file) + val scope = JetModuleUtil.getSubpackagesOfRootScope(moduleDescriptor) + val descriptors = QualifiedExpressionResolver() + .processImportReference(importDirective, scope, scope, null, BindingTraceContext(), LookupMode.EVERYTHING) + .filterIsInstance() + return descriptors.singleOrNull() } private fun showRestoreReferencesDialog(project: Project, referencesToRestore: List): Collection { @@ -285,45 +289,16 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor selectedFqNames.contains(ref.fqName.asString()) } + return referencesToRestore.filter { selectedFqNames.contains(it.refData.fqName) } } - private fun createQualifiedExpression(psiFactory: JetPsiFactory, text: String) - = psiFactory.createExpression(text) as JetDotQualifiedExpression - - private fun lengthenReference(expression: JetElement, fqName: FqName) { - assert(canLengthenReferenceExpression(expression, fqName)) - val parent = expression.getParent() - val prefixToInsert = IdeDescriptorRenderers.SOURCE_CODE.renderFqName(fqName.parent()) - val psiFactory = JetPsiFactory(expression) - if (parent is JetCallExpression) { - val text = prefixToInsert + "." + parent.getText() - parent.replace(createQualifiedExpression(psiFactory, text)) - } - else if (parent is JetUserType) { - val typeReference = expression.getStrictParentOfType()!! - typeReference.replace(psiFactory.createType(prefixToInsert + "." + typeReference.getText())) - } - else { - expression.replace(createQualifiedExpression(psiFactory, IdeDescriptorRenderers.SOURCE_CODE.renderFqName(fqName))) - } - } - - private fun canLengthenReferenceExpression(expression: JetElement, fqName: FqName): Boolean { - return when { - fqName.pathSegments().size() < 2 -> false - expression is JetSimpleNameExpression && expression.getReceiverExpression() == null -> true - else -> false - } - } - - private val ReferenceData.fqName: FqName - get() = FqName(qClassName!!) - private fun toTextRanges(startOffsets: IntArray, endOffsets: IntArray): List { assert(startOffsets.size() == endOffsets.size()) return startOffsets.indices.map { TextRange(startOffsets[it], endOffsets[it]) } @@ -331,6 +306,6 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor +) : TextBlockTransferableData, Cloneable, Serializable { + + override fun getFlavor() = KotlinReferenceData.dataFlavor + + override fun getOffsetCount() = data.size() * 2 + + override fun getOffsets(offsets: IntArray, index: Int): Int { + var i = index + for (d in data) { + offsets[i++] = d.startOffset + offsets[i++] = d.endOffset + } + return i + } + + override fun setOffsets(offsets: IntArray, index: Int): Int { + var i = index + for (d in data) { + d.startOffset = offsets[i++] + d.endOffset = offsets[i++] + } + return i + } + + public override fun clone() = KotlinReferenceTransferableData(Array(data.size(), { data[it].clone() })) +} + +public class KotlinReferenceData( + public var startOffset: Int, + public var endOffset: Int, + public val fqName: String, + public val kind: KotlinReferenceData.Kind +) : Cloneable, Serializable { + + public enum class Kind { + CLASS + PACKAGE + NON_EXTENSION_CALLABLE + EXTENSION_CALLABLE + } + + public override fun clone(): KotlinReferenceData { + try { + return super.clone() as KotlinReferenceData + } + catch (e: CloneNotSupportedException) { + throw RuntimeException() + } + } + + class object { + public val dataFlavor: DataFlavor? by Delegates.lazy { + try { + DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=" + javaClass().getName(), "KotlinReferenceData") + } + catch (e: NoClassDefFoundError) { + null + } + catch (e: IllegalArgumentException) { + null + } + } + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinShortenReferencesRefactoringHelper.kt b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinShortenReferencesRefactoringHelper.kt index e4775a8706c..13b5d9ddceb 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinShortenReferencesRefactoringHelper.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinShortenReferencesRefactoringHelper.kt @@ -20,9 +20,8 @@ import com.intellij.refactoring.RefactoringHelper import com.intellij.usageView.UsageInfo import com.intellij.openapi.project.Project import com.intellij.openapi.application.ApplicationManager -import org.jetbrains.kotlin.idea.codeInsight.shorten.prepareElementsToShorten -import org.jetbrains.kotlin.idea.codeInsight.shorten.withElementsToShorten import org.jetbrains.kotlin.idea.util.ShortenReferences +import org.jetbrains.kotlin.idea.codeInsight.shorten.* public class KotlinShortenReferencesRefactoringHelper: RefactoringHelper { override fun prepareOperation(usages: Array?): Any? { @@ -35,12 +34,7 @@ public class KotlinShortenReferencesRefactoringHelper: RefactoringHelper { override fun performOperation(project: Project, operationData: Any?) { ApplicationManager.getApplication()!!.runWriteAction { - withElementsToShorten(project) { requests -> - val elements = requests.map { it.pointer.getElement() } - val options = requests.map { it.options } - val elementToOptions = (elements zip options).toMap() - ShortenReferences({ elementToOptions[it] ?: ShortenReferences.Options.DEFAULT }).process(elements.filterNotNull()) - } + performDelayedShortening(project) } } } diff --git a/idea/testData/copyPaste/imports/AlreadyImportedViaStar.expected.kt b/idea/testData/copyPaste/imports/AlreadyImportedViaStar.expected.kt index ff54e331890..a7713cdab09 100644 --- a/idea/testData/copyPaste/imports/AlreadyImportedViaStar.expected.kt +++ b/idea/testData/copyPaste/imports/AlreadyImportedViaStar.expected.kt @@ -1,21 +1,14 @@ package to import a.* -import a.E.ENTRY -import a.Outer.Inner -import a.Outer.Nested -import a.Outer.NestedEnum -import a.Outer.NestedObj -import a.Outer.NestedTrait -import a.Outer.NestedAnnotation -fun f(a: A, t: T) { +fun f(p: A, t: T) { g(A(c).ext()) O1.f() O2 - ENTRY + E.ENTRY } -fun f2(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { +fun f2(i: Outer.Inner, n: Outer.Nested, e: Outer.NestedEnum, o: Outer.NestedObj, t: Outer.NestedTrait, a: Outer.NestedAnnotation) { ClassObject } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/AlreadyImportedViaStar.kt b/idea/testData/copyPaste/imports/AlreadyImportedViaStar.kt index 0831a9ff289..af1635b3e9f 100644 --- a/idea/testData/copyPaste/imports/AlreadyImportedViaStar.kt +++ b/idea/testData/copyPaste/imports/AlreadyImportedViaStar.kt @@ -44,7 +44,7 @@ class ClassObject { } } -fun f(a: A, t: T) { +fun f(p: A, t: T) { g(A(c).ext()) O1.f() O2 diff --git a/idea/testData/copyPaste/imports/ClassObjectInner.expected.kt b/idea/testData/copyPaste/imports/ClassObjectInner.expected.kt index 3f151511dc3..70f5baa69eb 100644 --- a/idea/testData/copyPaste/imports/ClassObjectInner.expected.kt +++ b/idea/testData/copyPaste/imports/ClassObjectInner.expected.kt @@ -1,11 +1,6 @@ package to -import a.Outer.Inner -import a.Outer.Nested -import a.Outer.NestedEnum -import a.Outer.NestedObj -import a.Outer.NestedTrait -import a.Outer.NestedAnnotation +import a.Outer -fun f(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { +fun f(i: Outer.Inner, n: Outer.Nested, e: Outer.NestedEnum, o: Outer.NestedObj, t: Outer.NestedTrait, a: Outer.NestedAnnotation) { } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ClassResolvedToPackage.expected.kt b/idea/testData/copyPaste/imports/ClassResolvedToPackage.expected.kt index 3c0fd8f2cb8..e69b77335e3 100644 --- a/idea/testData/copyPaste/imports/ClassResolvedToPackage.expected.kt +++ b/idea/testData/copyPaste/imports/ClassResolvedToPackage.expected.kt @@ -3,6 +3,6 @@ package to import a.a fun f(i: a) { - a.a + a a() } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.expected.kt b/idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.expected.kt index 8e9935a1379..44e7c6b59cd 100644 --- a/idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.expected.kt +++ b/idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.expected.kt @@ -3,5 +3,7 @@ package to class A { } +val a: A? = null + fun f(b: a.A) { } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.to.kt b/idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.to.kt index d974addfb12..2ac5c6439b2 100644 --- a/idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.to.kt +++ b/idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.to.kt @@ -3,4 +3,6 @@ package to class A { } +val a: A? = null + \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ConflictWithClass.expected.kt b/idea/testData/copyPaste/imports/ConflictWithClass.expected.kt index 1bb2669e2ac..6324bafded1 100644 --- a/idea/testData/copyPaste/imports/ConflictWithClass.expected.kt +++ b/idea/testData/copyPaste/imports/ConflictWithClass.expected.kt @@ -3,5 +3,7 @@ package to class A() { } +val a: A? = null + fun f(a: a.A) { } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ConflictWithClass.to.kt b/idea/testData/copyPaste/imports/ConflictWithClass.to.kt index e99273f7293..2b1b8d931d7 100644 --- a/idea/testData/copyPaste/imports/ConflictWithClass.to.kt +++ b/idea/testData/copyPaste/imports/ConflictWithClass.to.kt @@ -3,4 +3,6 @@ package to class A() { } +val a: A? = null + \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/DeepInnerClasses.expected.kt b/idea/testData/copyPaste/imports/DeepInnerClasses.expected.kt index dfc7ac6e102..71cee4d9449 100644 --- a/idea/testData/copyPaste/imports/DeepInnerClasses.expected.kt +++ b/idea/testData/copyPaste/imports/DeepInnerClasses.expected.kt @@ -1,20 +1,14 @@ package to -import a.Outer.Nested.NN -import a.Outer.Nested.NI -import a.Outer.Inner.IN -import a.Outer.Inner.II -import a.Outer.Nested.NN2 import a.with import a.Outer -import a.Outer.Inner.IN2 -fun f(p1: NN, p2: NI, p3: IN, p4: II) { - NN2() +fun f(p1: Outer.Nested.NN, p2: Outer.Nested.NI, p3: Outer.Inner.IN, p4: Outer.Inner.II) { + Outer.Nested.NN2() with(Outer.Nested()) { NI2() } - IN2() + Outer.Inner.IN2() with(Outer().Inner()) { II2() } diff --git a/idea/testData/copyPaste/imports/DelegatedProperty.expected.kt b/idea/testData/copyPaste/imports/DelegatedProperty.expected.kt index 1f61f171db8..b2e2f048899 100644 --- a/idea/testData/copyPaste/imports/DelegatedProperty.expected.kt +++ b/idea/testData/copyPaste/imports/DelegatedProperty.expected.kt @@ -1,9 +1,9 @@ package to -import a.A import a.get import a.set +import a.A class B { - var a by A() + var v by A() } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/DelegatedProperty.kt b/idea/testData/copyPaste/imports/DelegatedProperty.kt index 8ffadab16ce..6218560468c 100644 --- a/idea/testData/copyPaste/imports/DelegatedProperty.kt +++ b/idea/testData/copyPaste/imports/DelegatedProperty.kt @@ -12,5 +12,5 @@ fun T.set(thisRef: B, desc: PropertyMetadata, value: Int) { class A(): T class B { - var a by A() + var v by A() } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/DependencyOnJava.dependency.java b/idea/testData/copyPaste/imports/DependencyOnJava.dependency.java index 778817c78e2..21b5b8c42ad 100644 --- a/idea/testData/copyPaste/imports/DependencyOnJava.dependency.java +++ b/idea/testData/copyPaste/imports/DependencyOnJava.dependency.java @@ -11,6 +11,6 @@ public class JavaClass { public class InnerClass { } - public class NestedClass { + public static class NestedClass { } } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/DependencyOnJava.expected.kt b/idea/testData/copyPaste/imports/DependencyOnJava.expected.kt index 4216c06e0d1..b41015b8cf2 100644 --- a/idea/testData/copyPaste/imports/DependencyOnJava.expected.kt +++ b/idea/testData/copyPaste/imports/DependencyOnJava.expected.kt @@ -1,12 +1,10 @@ package to import java.JavaClass -import java.JavaClass.staticMethod -import java.JavaClass.NestedClass fun f(c: JavaClass) { - staticMethod() + JavaClass.staticMethod() c.method() c.InnerClass() - NestedClass() + JavaClass.NestedClass() } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/DependencyOnKotlinLibrary.expected.kt b/idea/testData/copyPaste/imports/DependencyOnKotlinLibrary.expected.kt index 71bc0f69a7d..ac9b156c292 100644 --- a/idea/testData/copyPaste/imports/DependencyOnKotlinLibrary.expected.kt +++ b/idea/testData/copyPaste/imports/DependencyOnKotlinLibrary.expected.kt @@ -1,28 +1,23 @@ package to -import d.A -import d.T import d.g import d.c import d.ext +import d.A +import d.T +import d.Outer import d.O1 import d.O2 -import d.E.ENTRY -import d.Outer.Inner -import d.Outer.Nested -import d.Outer.NestedEnum -import d.Outer.NestedObj -import d.Outer.NestedTrait -import d.Outer.NestedAnnotation +import d.E import d.ClassObject fun f(a: A, t: T) { g(A(c).ext()) O1.f() O2 - ENTRY + E.ENTRY } -fun f2(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { +fun f2(i: Outer.Inner, n: Outer.Nested, e: Outer.NestedEnum, o: Outer.NestedObj, t: Outer.NestedTrait, a: Outer.NestedAnnotation) { ClassObject } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/EnumEntries.expected.kt b/idea/testData/copyPaste/imports/EnumEntries.expected.kt index d7d0fcca649..4c4487e6791 100644 --- a/idea/testData/copyPaste/imports/EnumEntries.expected.kt +++ b/idea/testData/copyPaste/imports/EnumEntries.expected.kt @@ -1,11 +1,9 @@ package to -import a.A.A -import a.A.B -import a.A.C +import a.A fun f() { - A - B - C + A.A + A.B + A.C } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ExtensionAsInfixOrOperator.expected.kt b/idea/testData/copyPaste/imports/ExtensionAsInfixOrOperator.expected.kt index c9e8d2a4ad5..43d298c3727 100644 --- a/idea/testData/copyPaste/imports/ExtensionAsInfixOrOperator.expected.kt +++ b/idea/testData/copyPaste/imports/ExtensionAsInfixOrOperator.expected.kt @@ -1,8 +1,8 @@ package to -import a.A import a.plus import a.infix +import a.A fun f(a: A) { a + a diff --git a/idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.expected.kt b/idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.expected.kt index 8d69e711950..49dec27c578 100644 --- a/idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.expected.kt +++ b/idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.expected.kt @@ -1,6 +1,8 @@ package to import a.A +import a.ext +import a.p fun A.ext() { } diff --git a/idea/testData/copyPaste/imports/ExtensionConflict.expected.kt b/idea/testData/copyPaste/imports/ExtensionConflict.expected.kt index c8e5ab497db..2f47ecd7394 100644 --- a/idea/testData/copyPaste/imports/ExtensionConflict.expected.kt +++ b/idea/testData/copyPaste/imports/ExtensionConflict.expected.kt @@ -1,6 +1,11 @@ package to import a.A +import a.ext +import a.plus +import a.infix +import a.minus +import a.p fun A.ext() { } diff --git a/idea/testData/copyPaste/imports/ForLoop.expected.kt b/idea/testData/copyPaste/imports/ForLoop.expected.kt index 9140a420f41..b4c72f8096b 100644 --- a/idea/testData/copyPaste/imports/ForLoop.expected.kt +++ b/idea/testData/copyPaste/imports/ForLoop.expected.kt @@ -1,9 +1,9 @@ package to -import a.A import a.iterator import a.next import a.hasNext +import a.A fun f() { for (i in A()) { diff --git a/idea/testData/copyPaste/imports/GetExpression.expected.kt b/idea/testData/copyPaste/imports/GetExpression.expected.kt index bdf02d32907..1c997491fcc 100644 --- a/idea/testData/copyPaste/imports/GetExpression.expected.kt +++ b/idea/testData/copyPaste/imports/GetExpression.expected.kt @@ -1,7 +1,7 @@ package to -import a.A import a.get +import a.A fun f() { A()[""] diff --git a/idea/testData/copyPaste/imports/ImportDependency.expected.kt b/idea/testData/copyPaste/imports/ImportDependency.expected.kt index 71bc0f69a7d..ac9b156c292 100644 --- a/idea/testData/copyPaste/imports/ImportDependency.expected.kt +++ b/idea/testData/copyPaste/imports/ImportDependency.expected.kt @@ -1,28 +1,23 @@ package to -import d.A -import d.T import d.g import d.c import d.ext +import d.A +import d.T +import d.Outer import d.O1 import d.O2 -import d.E.ENTRY -import d.Outer.Inner -import d.Outer.Nested -import d.Outer.NestedEnum -import d.Outer.NestedObj -import d.Outer.NestedTrait -import d.Outer.NestedAnnotation +import d.E import d.ClassObject fun f(a: A, t: T) { g(A(c).ext()) O1.f() O2 - ENTRY + E.ENTRY } -fun f2(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { +fun f2(i: Outer.Inner, n: Outer.Nested, e: Outer.NestedEnum, o: Outer.NestedObj, t: Outer.NestedTrait, a: Outer.NestedAnnotation) { ClassObject } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Inner.expected.kt b/idea/testData/copyPaste/imports/Inner.expected.kt index ccdf848efd2..4bcad78bb9f 100644 --- a/idea/testData/copyPaste/imports/Inner.expected.kt +++ b/idea/testData/copyPaste/imports/Inner.expected.kt @@ -1,13 +1,7 @@ package to -import a.Outer.Inner -import a.Outer.Nested -import a.Outer.NestedEnum -import a.Outer.NestedObj -import a.Outer.NestedTrait -import a.Outer.NestedAnnotation import a.Outer -fun f(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { +fun f(i: Outer.Inner, n: Outer.Nested, e: Outer.NestedEnum, o: Outer.NestedObj, t: Outer.NestedTrait, aa: Outer.NestedAnnotation) { Outer().Inner2() } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Inner.kt b/idea/testData/copyPaste/imports/Inner.kt index bb86fae389e..0558599edd8 100644 --- a/idea/testData/copyPaste/imports/Inner.kt +++ b/idea/testData/copyPaste/imports/Inner.kt @@ -18,6 +18,6 @@ class Outer { annotation class NestedAnnotation } -fun f(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { +fun f(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, aa: NestedAnnotation) { Outer().Inner2() } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Invoke.expected.kt b/idea/testData/copyPaste/imports/Invoke.expected.kt index b8601895491..3a9d031c87e 100644 --- a/idea/testData/copyPaste/imports/Invoke.expected.kt +++ b/idea/testData/copyPaste/imports/Invoke.expected.kt @@ -1,7 +1,7 @@ package to -import a.A import a.invoke +import a.A fun f(a: A) { a() diff --git a/idea/testData/copyPaste/imports/MultiDeclaration.expected.kt b/idea/testData/copyPaste/imports/MultiDeclaration.expected.kt index 04e928d7d22..cb033ab2dfa 100644 --- a/idea/testData/copyPaste/imports/MultiDeclaration.expected.kt +++ b/idea/testData/copyPaste/imports/MultiDeclaration.expected.kt @@ -1,8 +1,8 @@ package to -import a.A import a.component1 import a.component2 +import a.A fun f() { val (a, b) = A() diff --git a/idea/testData/copyPaste/imports/MultiReferencePartiallyCopied.expected.kt b/idea/testData/copyPaste/imports/MultiReferencePartiallyCopied.expected.kt index aac1410dce1..6a9d88ec45b 100644 --- a/idea/testData/copyPaste/imports/MultiReferencePartiallyCopied.expected.kt +++ b/idea/testData/copyPaste/imports/MultiReferencePartiallyCopied.expected.kt @@ -1,9 +1,9 @@ package to -import a.A -import a.B import a.next import a.hasNext +import a.A +import a.B fun A.iterator() = B() diff --git a/idea/testData/copyPaste/imports/NoImportForSamePackage.expected.kt b/idea/testData/copyPaste/imports/NoImportForSamePackage.expected.kt index 64840437c58..a3238c2e490 100644 --- a/idea/testData/copyPaste/imports/NoImportForSamePackage.expected.kt +++ b/idea/testData/copyPaste/imports/NoImportForSamePackage.expected.kt @@ -1,20 +1,12 @@ package a -import a.E.ENTRY -import a.Outer.Inner -import a.Outer.Nested -import a.Outer.NestedEnum -import a.Outer.NestedObj -import a.Outer.NestedTrait -import a.Outer.NestedAnnotation - -fun f(a: A, t: T) { +fun f(p: A, t: T) { g(A(c).ext()) O1.f() O2 - ENTRY + E.ENTRY } -fun f2(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { +fun f2(i: Outer.Inner, n: Outer.Nested, e: Outer.NestedEnum, o: Outer.NestedObj, t: Outer.NestedTrait, a: Outer.NestedAnnotation) { ClassObject } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/NoImportForSamePackage.kt b/idea/testData/copyPaste/imports/NoImportForSamePackage.kt index ae4c5a18900..ad68e38182e 100644 --- a/idea/testData/copyPaste/imports/NoImportForSamePackage.kt +++ b/idea/testData/copyPaste/imports/NoImportForSamePackage.kt @@ -44,7 +44,7 @@ class ClassObject { } } -fun f(a: A, t: T) { +fun f(p: A, t: T) { g(A(c).ext()) O1.f() O2 diff --git a/idea/testData/copyPaste/imports/QualifiedTypeConflict.expected.kt b/idea/testData/copyPaste/imports/QualifiedTypeConflict.expected.kt index de744063fa7..4ec6e4524bc 100644 --- a/idea/testData/copyPaste/imports/QualifiedTypeConflict.expected.kt +++ b/idea/testData/copyPaste/imports/QualifiedTypeConflict.expected.kt @@ -5,5 +5,7 @@ class A { } } +val v: A? = null + fun f(p: a.A.B) { } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/QualifiedTypeConflict.to.kt b/idea/testData/copyPaste/imports/QualifiedTypeConflict.to.kt index 6da4a2600e8..9272035f23a 100644 --- a/idea/testData/copyPaste/imports/QualifiedTypeConflict.to.kt +++ b/idea/testData/copyPaste/imports/QualifiedTypeConflict.to.kt @@ -5,4 +5,6 @@ class A { } } +val v: A? = null + \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/TypeParameter.expected.kt b/idea/testData/copyPaste/imports/TypeParameter.expected.kt index 69fc0f8c9f1..4dde795431f 100644 --- a/idea/testData/copyPaste/imports/TypeParameter.expected.kt +++ b/idea/testData/copyPaste/imports/TypeParameter.expected.kt @@ -1,6 +1,6 @@ package to -import a.T import a.A +import a.T fun f(): T \ No newline at end of file