From 61153c87e0cb06657fb5b3d378bbb275b201ebb9 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Wed, 22 Jan 2014 20:29:46 +0400 Subject: [PATCH] Insert imports on copy/paste Introduce KotlinCopyPasteReferenceProcessor --- .../jet/generators/tests/GenerateTests.kt | 6 + idea/src/META-INF/plugin.xml | 2 + .../KotlinCopyPasteReferenceProcessor.kt | 390 ++++++++++++ .../codeInsight/RestoreReferencesDialog.java | 105 +++ .../AlreadyImportedViaStar.expected.kt | 21 + .../imports/AlreadyImportedViaStar.kt | 56 ++ .../imports/AlreadyImportedViaStar.to.kt | 5 + .../imports/ClassAlreadyImported.expected.kt | 7 + .../copyPaste/imports/ClassAlreadyImported.kt | 7 + .../imports/ClassAlreadyImported.to.kt | 5 + .../copyPaste/imports/ClassMember.expected.kt | 3 + .../testData/copyPaste/imports/ClassMember.kt | 14 + .../copyPaste/imports/ClassObject.expected.kt | 10 + .../testData/copyPaste/imports/ClassObject.kt | 21 + .../ClassObjectFunInsideClass.expected.kt | 5 + .../imports/ClassObjectFunInsideClass.kt | 13 + .../imports/ClassObjectInner.expected.kt | 11 + .../copyPaste/imports/ClassObjectInner.kt | 22 + .../ClassResolvedToPackage.expected.kt | 6 + .../imports/ClassResolvedToPackage.kt | 12 + .../copyPaste/imports/ClassType.expected.kt | 6 + idea/testData/copyPaste/imports/ClassType.kt | 6 + .../copyPaste/imports/Conflict.expected.kt | 19 + idea/testData/copyPaste/imports/Conflict.kt | 21 + .../testData/copyPaste/imports/Conflict.to.kt | 14 + ...nflictForTypeWithTypeParameter.expected.kt | 7 + .../ConflictForTypeWithTypeParameter.kt | 7 + .../ConflictForTypeWithTypeParameter.to.kt | 6 + .../imports/ConflictWithClass.expected.kt | 7 + .../copyPaste/imports/ConflictWithClass.kt | 7 + .../copyPaste/imports/ConflictWithClass.to.kt | 6 + .../imports/ConflictWithFun.expected.kt | 6 + .../copyPaste/imports/ConflictWithFun.kt | 6 + .../copyPaste/imports/ConflictWithFun.to.kt | 6 + .../copyPaste/imports/Constructor.expected.kt | 7 + .../testData/copyPaste/imports/Constructor.kt | 5 + .../copyPaste/imports/Constructor.to.kt | 5 + .../imports/DeepInnerClasses.expected.kt | 21 + .../copyPaste/imports/DeepInnerClasses.kt | 41 ++ .../imports/DefaultPackage.expected.kt | 3 + .../copyPaste/imports/DefaultPackage.kt | 6 + .../imports/DelegatedProperty.expected.kt | 9 + .../copyPaste/imports/DelegatedProperty.kt | 16 + .../imports/DependencyOnJava.dependency.java | 16 + .../imports/DependencyOnJava.expected.kt | 12 + .../copyPaste/imports/DependencyOnJava.kt | 13 + .../DependencyOnKotlinLibrary.expected.kt | 28 + .../imports/DependencyOnKotlinLibrary.kt | 18 + .../imports/DependencyOnStdLib.expected.kt | 5 + .../copyPaste/imports/DependencyOnStdLib.kt | 7 + .../copyPaste/imports/EnumEntries.expected.kt | 11 + .../testData/copyPaste/imports/EnumEntries.kt | 13 + .../copyPaste/imports/Extension.expected.kt | 11 + idea/testData/copyPaste/imports/Extension.kt | 16 + .../ExtensionAsInfixOrOperator.expected.kt | 10 + .../imports/ExtensionAsInfixOrOperator.kt | 12 + ...onCannotBeImportedOrLengthened.expected.kt | 16 + .../ExtensionCannotBeImportedOrLengthened.kt | 17 + ...xtensionCannotBeImportedOrLengthened.to.kt | 12 + .../imports/ExtensionConflict.expected.kt | 26 + .../copyPaste/imports/ExtensionConflict.kt | 27 + .../copyPaste/imports/ExtensionConflict.to.kt | 20 + .../copyPaste/imports/ForLoop.expected.kt | 11 + idea/testData/copyPaste/imports/ForLoop.kt | 18 + .../imports/FullyQualified.expected.kt | 3 + .../copyPaste/imports/FullyQualified.kt | 7 + .../copyPaste/imports/Function.expected.kt | 7 + idea/testData/copyPaste/imports/Function.kt | 8 + .../FunctionAlreadyImported.expected.kt | 7 + .../imports/FunctionAlreadyImported.kt | 8 + .../imports/FunctionAlreadyImported.to.kt | 5 + .../imports/FunctionParameter.expected.kt | 7 + .../copyPaste/imports/FunctionParameter.kt | 10 + .../copyPaste/imports/FunctionParameter.to.kt | 5 + .../imports/GetExpression.expected.kt | 8 + .../copyPaste/imports/GetExpression.kt | 11 + .../imports/ImportDependency.dependency.kt | 42 ++ .../imports/ImportDependency.expected.kt | 28 + .../copyPaste/imports/ImportDependency.kt | 16 + .../imports/ImportDirective.expected.kt | 5 + .../copyPaste/imports/ImportDirective.kt | 8 + .../copyPaste/imports/ImportDirective.to.kt | 3 + ...rtableEntityInExtensionLiteral.expected.kt | 14 + .../ImportableEntityInExtensionLiteral.kt | 28 + .../imports/ImportedElementCopied.expected.kt | 22 + .../imports/ImportedElementCopied.kt | 30 + .../copyPaste/imports/Inner.expected.kt | 13 + idea/testData/copyPaste/imports/Inner.kt | 23 + .../copyPaste/imports/Invoke.expected.kt | 8 + idea/testData/copyPaste/imports/Invoke.kt | 11 + .../JavaStaticViaClass.dependency.java | 10 + .../imports/JavaStaticViaClass.expected.kt | 9 + .../copyPaste/imports/JavaStaticViaClass.kt | 6 + .../imports/KotlinLibrary/Dependency.kt | 43 ++ .../copyPaste/imports/Local.expected.kt | 6 + idea/testData/copyPaste/imports/Local.kt | 14 + idea/testData/copyPaste/imports/Local.to.kt | 5 + .../MultiReferencePartiallyCopied.expected.kt | 13 + .../imports/MultiReferencePartiallyCopied.kt | 18 + .../imports/NoImportForBuiltIns.expected.kt | 6 + .../copyPaste/imports/NoImportForBuiltIns.kt | 6 + .../NoImportForSamePackage.expected.kt | 20 + .../imports/NoImportForSamePackage.kt | 56 ++ .../imports/NoImportForSamePackage.to.kt | 3 + .../imports/NotReferencePosition.expected.kt | 3 + .../copyPaste/imports/NotReferencePosition.kt | 6 + .../imports/NotReferencePosition.to.kt | 3 + .../imports/NotReferencePosition2.expected.kt | 3 + .../imports/NotReferencePosition2.kt | 5 + .../imports/NotReferencePosition2.to.kt | 3 + .../copyPaste/imports/Object.expected.kt | 10 + idea/testData/copyPaste/imports/Object.kt | 15 + .../imports/PackageView.dependency.kt | 4 + .../copyPaste/imports/PackageView.expected.kt | 5 + .../testData/copyPaste/imports/PackageView.kt | 3 + .../imports/PartiallyQualified.expected.kt | 6 + .../copyPaste/imports/PartiallyQualified.kt | 11 + .../PropertyResolvedToPackage.expected.kt | 3 + .../imports/PropertyResolvedToPackage.kt | 6 + .../imports/QualifiedTypeConflict.expected.kt | 9 + .../imports/QualifiedTypeConflict.kt | 9 + .../imports/QualifiedTypeConflict.to.kt | 8 + .../ReferencedElementAlsoCopied.expected.kt | 31 + .../imports/ReferencedElementAlsoCopied.kt | 31 + .../copyPaste/imports/Super.expected.kt | 5 + idea/testData/copyPaste/imports/Super.kt | 9 + idea/testData/copyPaste/imports/Super.to.kt | 5 + .../imports/ThisReference.expected.kt | 7 + .../copyPaste/imports/ThisReference.kt | 7 + .../copyPaste/imports/ThisReference.to.kt | 7 + .../imports/TopLevelProperty.expected.kt | 6 + .../copyPaste/imports/TopLevelProperty.kt | 6 + .../copyPaste/imports/Trait.expected.kt | 5 + idea/testData/copyPaste/imports/Trait.kt | 5 + .../imports/TypeParameter.expected.kt | 6 + .../copyPaste/imports/TypeParameter.kt | 7 + .../AbstractInsertImportOnPasteTest.java | 138 ++++ .../InsertImportOnPasteTestGenerated.java | 597 ++++++++++++++++++ 138 files changed, 2813 insertions(+) create mode 100644 idea/src/org/jetbrains/jet/plugin/codeInsight/KotlinCopyPasteReferenceProcessor.kt create mode 100644 idea/src/org/jetbrains/jet/plugin/codeInsight/RestoreReferencesDialog.java create mode 100644 idea/testData/copyPaste/imports/AlreadyImportedViaStar.expected.kt create mode 100644 idea/testData/copyPaste/imports/AlreadyImportedViaStar.kt create mode 100644 idea/testData/copyPaste/imports/AlreadyImportedViaStar.to.kt create mode 100644 idea/testData/copyPaste/imports/ClassAlreadyImported.expected.kt create mode 100644 idea/testData/copyPaste/imports/ClassAlreadyImported.kt create mode 100644 idea/testData/copyPaste/imports/ClassAlreadyImported.to.kt create mode 100644 idea/testData/copyPaste/imports/ClassMember.expected.kt create mode 100644 idea/testData/copyPaste/imports/ClassMember.kt create mode 100644 idea/testData/copyPaste/imports/ClassObject.expected.kt create mode 100644 idea/testData/copyPaste/imports/ClassObject.kt create mode 100644 idea/testData/copyPaste/imports/ClassObjectFunInsideClass.expected.kt create mode 100644 idea/testData/copyPaste/imports/ClassObjectFunInsideClass.kt create mode 100644 idea/testData/copyPaste/imports/ClassObjectInner.expected.kt create mode 100644 idea/testData/copyPaste/imports/ClassObjectInner.kt create mode 100644 idea/testData/copyPaste/imports/ClassResolvedToPackage.expected.kt create mode 100644 idea/testData/copyPaste/imports/ClassResolvedToPackage.kt create mode 100644 idea/testData/copyPaste/imports/ClassType.expected.kt create mode 100644 idea/testData/copyPaste/imports/ClassType.kt create mode 100644 idea/testData/copyPaste/imports/Conflict.expected.kt create mode 100644 idea/testData/copyPaste/imports/Conflict.kt create mode 100644 idea/testData/copyPaste/imports/Conflict.to.kt create mode 100644 idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.expected.kt create mode 100644 idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.kt create mode 100644 idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.to.kt create mode 100644 idea/testData/copyPaste/imports/ConflictWithClass.expected.kt create mode 100644 idea/testData/copyPaste/imports/ConflictWithClass.kt create mode 100644 idea/testData/copyPaste/imports/ConflictWithClass.to.kt create mode 100644 idea/testData/copyPaste/imports/ConflictWithFun.expected.kt create mode 100644 idea/testData/copyPaste/imports/ConflictWithFun.kt create mode 100644 idea/testData/copyPaste/imports/ConflictWithFun.to.kt create mode 100644 idea/testData/copyPaste/imports/Constructor.expected.kt create mode 100644 idea/testData/copyPaste/imports/Constructor.kt create mode 100644 idea/testData/copyPaste/imports/Constructor.to.kt create mode 100644 idea/testData/copyPaste/imports/DeepInnerClasses.expected.kt create mode 100644 idea/testData/copyPaste/imports/DeepInnerClasses.kt create mode 100644 idea/testData/copyPaste/imports/DefaultPackage.expected.kt create mode 100644 idea/testData/copyPaste/imports/DefaultPackage.kt create mode 100644 idea/testData/copyPaste/imports/DelegatedProperty.expected.kt create mode 100644 idea/testData/copyPaste/imports/DelegatedProperty.kt create mode 100644 idea/testData/copyPaste/imports/DependencyOnJava.dependency.java create mode 100644 idea/testData/copyPaste/imports/DependencyOnJava.expected.kt create mode 100644 idea/testData/copyPaste/imports/DependencyOnJava.kt create mode 100644 idea/testData/copyPaste/imports/DependencyOnKotlinLibrary.expected.kt create mode 100644 idea/testData/copyPaste/imports/DependencyOnKotlinLibrary.kt create mode 100644 idea/testData/copyPaste/imports/DependencyOnStdLib.expected.kt create mode 100644 idea/testData/copyPaste/imports/DependencyOnStdLib.kt create mode 100644 idea/testData/copyPaste/imports/EnumEntries.expected.kt create mode 100644 idea/testData/copyPaste/imports/EnumEntries.kt create mode 100644 idea/testData/copyPaste/imports/Extension.expected.kt create mode 100644 idea/testData/copyPaste/imports/Extension.kt create mode 100644 idea/testData/copyPaste/imports/ExtensionAsInfixOrOperator.expected.kt create mode 100644 idea/testData/copyPaste/imports/ExtensionAsInfixOrOperator.kt create mode 100644 idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.expected.kt create mode 100644 idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.kt create mode 100644 idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.to.kt create mode 100644 idea/testData/copyPaste/imports/ExtensionConflict.expected.kt create mode 100644 idea/testData/copyPaste/imports/ExtensionConflict.kt create mode 100644 idea/testData/copyPaste/imports/ExtensionConflict.to.kt create mode 100644 idea/testData/copyPaste/imports/ForLoop.expected.kt create mode 100644 idea/testData/copyPaste/imports/ForLoop.kt create mode 100644 idea/testData/copyPaste/imports/FullyQualified.expected.kt create mode 100644 idea/testData/copyPaste/imports/FullyQualified.kt create mode 100644 idea/testData/copyPaste/imports/Function.expected.kt create mode 100644 idea/testData/copyPaste/imports/Function.kt create mode 100644 idea/testData/copyPaste/imports/FunctionAlreadyImported.expected.kt create mode 100644 idea/testData/copyPaste/imports/FunctionAlreadyImported.kt create mode 100644 idea/testData/copyPaste/imports/FunctionAlreadyImported.to.kt create mode 100644 idea/testData/copyPaste/imports/FunctionParameter.expected.kt create mode 100644 idea/testData/copyPaste/imports/FunctionParameter.kt create mode 100644 idea/testData/copyPaste/imports/FunctionParameter.to.kt create mode 100644 idea/testData/copyPaste/imports/GetExpression.expected.kt create mode 100644 idea/testData/copyPaste/imports/GetExpression.kt create mode 100644 idea/testData/copyPaste/imports/ImportDependency.dependency.kt create mode 100644 idea/testData/copyPaste/imports/ImportDependency.expected.kt create mode 100644 idea/testData/copyPaste/imports/ImportDependency.kt create mode 100644 idea/testData/copyPaste/imports/ImportDirective.expected.kt create mode 100644 idea/testData/copyPaste/imports/ImportDirective.kt create mode 100644 idea/testData/copyPaste/imports/ImportDirective.to.kt create mode 100644 idea/testData/copyPaste/imports/ImportableEntityInExtensionLiteral.expected.kt create mode 100644 idea/testData/copyPaste/imports/ImportableEntityInExtensionLiteral.kt create mode 100644 idea/testData/copyPaste/imports/ImportedElementCopied.expected.kt create mode 100644 idea/testData/copyPaste/imports/ImportedElementCopied.kt create mode 100644 idea/testData/copyPaste/imports/Inner.expected.kt create mode 100644 idea/testData/copyPaste/imports/Inner.kt create mode 100644 idea/testData/copyPaste/imports/Invoke.expected.kt create mode 100644 idea/testData/copyPaste/imports/Invoke.kt create mode 100644 idea/testData/copyPaste/imports/JavaStaticViaClass.dependency.java create mode 100644 idea/testData/copyPaste/imports/JavaStaticViaClass.expected.kt create mode 100644 idea/testData/copyPaste/imports/JavaStaticViaClass.kt create mode 100644 idea/testData/copyPaste/imports/KotlinLibrary/Dependency.kt create mode 100644 idea/testData/copyPaste/imports/Local.expected.kt create mode 100644 idea/testData/copyPaste/imports/Local.kt create mode 100644 idea/testData/copyPaste/imports/Local.to.kt create mode 100644 idea/testData/copyPaste/imports/MultiReferencePartiallyCopied.expected.kt create mode 100644 idea/testData/copyPaste/imports/MultiReferencePartiallyCopied.kt create mode 100644 idea/testData/copyPaste/imports/NoImportForBuiltIns.expected.kt create mode 100644 idea/testData/copyPaste/imports/NoImportForBuiltIns.kt create mode 100644 idea/testData/copyPaste/imports/NoImportForSamePackage.expected.kt create mode 100644 idea/testData/copyPaste/imports/NoImportForSamePackage.kt create mode 100644 idea/testData/copyPaste/imports/NoImportForSamePackage.to.kt create mode 100644 idea/testData/copyPaste/imports/NotReferencePosition.expected.kt create mode 100644 idea/testData/copyPaste/imports/NotReferencePosition.kt create mode 100644 idea/testData/copyPaste/imports/NotReferencePosition.to.kt create mode 100644 idea/testData/copyPaste/imports/NotReferencePosition2.expected.kt create mode 100644 idea/testData/copyPaste/imports/NotReferencePosition2.kt create mode 100644 idea/testData/copyPaste/imports/NotReferencePosition2.to.kt create mode 100644 idea/testData/copyPaste/imports/Object.expected.kt create mode 100644 idea/testData/copyPaste/imports/Object.kt create mode 100644 idea/testData/copyPaste/imports/PackageView.dependency.kt create mode 100644 idea/testData/copyPaste/imports/PackageView.expected.kt create mode 100644 idea/testData/copyPaste/imports/PackageView.kt create mode 100644 idea/testData/copyPaste/imports/PartiallyQualified.expected.kt create mode 100644 idea/testData/copyPaste/imports/PartiallyQualified.kt create mode 100644 idea/testData/copyPaste/imports/PropertyResolvedToPackage.expected.kt create mode 100644 idea/testData/copyPaste/imports/PropertyResolvedToPackage.kt create mode 100644 idea/testData/copyPaste/imports/QualifiedTypeConflict.expected.kt create mode 100644 idea/testData/copyPaste/imports/QualifiedTypeConflict.kt create mode 100644 idea/testData/copyPaste/imports/QualifiedTypeConflict.to.kt create mode 100644 idea/testData/copyPaste/imports/ReferencedElementAlsoCopied.expected.kt create mode 100644 idea/testData/copyPaste/imports/ReferencedElementAlsoCopied.kt create mode 100644 idea/testData/copyPaste/imports/Super.expected.kt create mode 100644 idea/testData/copyPaste/imports/Super.kt create mode 100644 idea/testData/copyPaste/imports/Super.to.kt create mode 100644 idea/testData/copyPaste/imports/ThisReference.expected.kt create mode 100644 idea/testData/copyPaste/imports/ThisReference.kt create mode 100644 idea/testData/copyPaste/imports/ThisReference.to.kt create mode 100644 idea/testData/copyPaste/imports/TopLevelProperty.expected.kt create mode 100644 idea/testData/copyPaste/imports/TopLevelProperty.kt create mode 100644 idea/testData/copyPaste/imports/Trait.expected.kt create mode 100644 idea/testData/copyPaste/imports/Trait.kt create mode 100644 idea/testData/copyPaste/imports/TypeParameter.expected.kt create mode 100644 idea/testData/copyPaste/imports/TypeParameter.kt create mode 100644 idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractInsertImportOnPasteTest.java create mode 100644 idea/tests/org/jetbrains/jet/plugin/codeInsight/InsertImportOnPasteTestGenerated.java diff --git a/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt index d4d3ca1b6c9..e22104be2d1 100644 --- a/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt @@ -90,6 +90,7 @@ import org.jetbrains.jet.completion.AbstractCompiledKotlinInJavaCompletionTest import org.jetbrains.jet.completion.AbstractKotlinSourceInJavaCompletionTest import org.jetbrains.jet.plugin.intentions.AbstractIntentionTest import org.jetbrains.jet.checkers.AbstractJetDiagnosticsTestWithStdLib +import org.jetbrains.jet.plugin.codeInsight.AbstractInsertImportOnPasteTest fun main(args: Array) { System.setProperty("java.awt.headless", "true") @@ -441,6 +442,11 @@ fun main(args: Array) { model("copyPaste/conversion", extension = "java") } + testClass(javaClass()) { + model("copyPaste/imports", pattern = """^([^\.]+)\.kt$""", testMethod = "doTestCopy", testClassName = "Copy", recursive = false) + model("copyPaste/imports", pattern = """^([^\.]+)\.kt$""", testMethod = "doTestCut", testClassName = "Cut", recursive = false) + } + testClass(javaClass()) { model("shortenRefs", pattern = """^([^\.]+)\.kt$""") } diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 1177c9c66e8..d0de53cebf9 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -250,6 +250,8 @@ + + diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/KotlinCopyPasteReferenceProcessor.kt b/idea/src/org/jetbrains/jet/plugin/codeInsight/KotlinCopyPasteReferenceProcessor.kt new file mode 100644 index 00000000000..51374a5b4c5 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/KotlinCopyPasteReferenceProcessor.kt @@ -0,0 +1,390 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.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.jet.lang.psi.JetFile +import org.jetbrains.jet.plugin.quickfix.ImportInsertHelper +import org.jetbrains.jet.lang.resolve.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.jet.plugin.references.JetReference +import org.jetbrains.jet.lang.resolve.DescriptorUtils +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor +import org.jetbrains.jet.lang.descriptors.ClassDescriptor +import com.intellij.openapi.util.TextRange +import java.util.Collections +import org.jetbrains.jet.lang.psi.JetPsiFactory +import org.jetbrains.jet.lang.psi.JetSimpleNameExpression +import com.intellij.psi.util.PsiTreeUtil +import org.jetbrains.jet.lang.psi.JetCallExpression +import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor +import org.jetbrains.jet.lang.types.ErrorUtils +import org.jetbrains.jet.lang.psi.JetImportDirective +import org.jetbrains.jet.lang.psi.JetPackageDirective +import org.jetbrains.jet.plugin.references.JetMultiReference +import org.jetbrains.jet.lang.psi.JetElement +import org.jetbrains.jet.lang.psi.JetThisExpression +import org.jetbrains.jet.lang.psi.JetSuperExpression +import org.jetbrains.jet.plugin.conversion.copy.* +import java.awt.datatransfer.UnsupportedFlavorException +import java.io.IOException +import com.intellij.openapi.diagnostic.Logger +import org.jetbrains.jet.lang.psi.JetDotQualifiedExpression +import org.jetbrains.jet.lang.descriptors.CallableDescriptor +import org.jetbrains.jet.lang.psi.JetUserType +import org.jetbrains.jet.lang.psi.JetTypeReference +import com.intellij.util.containers.ContainerUtil +import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils +import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor + +//NOTE: this class is based on CopyPasteReferenceProcessor and JavaCopyPasteReferenceProcessor +public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor { + + override fun extractTransferableData(content: Transferable): ReferenceTransferableData? { + //NOTE: copied code + var referenceData: ReferenceTransferableData? = null + if (CodeInsightSettings.getInstance()!!.ADD_IMPORTS_ON_PASTE != CodeInsightSettings.NO) { + try { + val flavor = ReferenceData.getDataFlavor() + if (flavor != null) { + referenceData = content.getTransferData(flavor) as ReferenceTransferableData + } + } + catch (ignored: UnsupportedFlavorException) { + } + catch (ignored: IOException) { + } + } + + if (referenceData != null) { + // copy to prevent changing of original by convertLineSeparators + return referenceData!!.clone() + } + + return null + } + + override fun collectTransferableData( + file: PsiFile, + editor: Editor, + startOffsets: IntArray, + endOffsets: IntArray + ): ReferenceTransferableData? { + if (file !is JetFile) { + return null + } + + val collectedData = zip(startOffsets, endOffsets).toList().flatMap { + val (startOffset, endOffset) = it + CollectHighlightsUtil.getElementsInRange(file, startOffset, endOffset).flatMap { element -> + collectReferenceDataFromElement(element, file, startOffset, startOffsets, endOffsets) + } + } + if (collectedData.isEmpty()) { + return null + } + + return ReferenceTransferableData(collectedData.copyToArray()) + } + + private fun collectReferenceDataFromElement( + element: PsiElement, + file: JetFile, + startOffset: Int, + startOffsets: IntArray, + endOffsets: IntArray + ): Collection { + + fun collectReferenceData(referencedDeclaration: PsiElement, referencedDescriptor: DeclarationDescriptor): ReferenceData? { + if (referencedDeclaration.isInCopiedArea(file, startOffsets, endOffsets)) { + return null + } + val isExpressionWithReceiver = element is JetSimpleNameExpression && element.getReceiverExpression() != null + if (isExpressionWithReceiver && !referencedDescriptor.isExtension) { + return null + } + 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 Collections.emptyList() + } + val reference = element.getReference() + if (reference !is JetReference) { + return Collections.emptyList() + } + + val resolveMap = reference.resolveMap() + //check whether this reference is unambiguous + if (reference !is JetMultiReference<*> && resolveMap.size > 1) { + return Collections.emptyList() + } + val collectedData = ArrayList() + for ((referencedDescriptor, declarations) in resolveMap) { + if (declarations.size != 1) { + continue + } + collectedData.addIfNotNull(collectReferenceData(declarations.first(), referencedDescriptor)) + } + return collectedData + } + + private fun DeclarationDescriptor.canBeReferencedViaImport(): Boolean { + if (this is PackageViewDescriptor || DescriptorUtils.isTopLevelDeclaration(this)) { + return true + } + val parent = getContainingDeclaration()!! + if (parent !is ClassDescriptor || !parent.canBeReferencedViaImport()) { + return false + } + // inner class constructors can't be referenced via import + if (this is ConstructorDescriptor && parent.isInner()) { + return false + } + return this is ClassDescriptor || this is ConstructorDescriptor + } + + private fun createReferenceData(element: PsiElement, startOffset: Int, fqName: FqName): ReferenceData { + val range = element.range + return ReferenceData(range.start - startOffset, range.end - startOffset, fqName.asString(), null) + } + + private data class ReferenceToRestoreData( + val expression: JetElement, + val fqName: FqName, + val lengthenReference: Boolean = false + ) + + override fun processTransferableData ( + project: Project, + editor: Editor, + bounds: RangeMarker, + caretOffset: Int, + indented: Ref, + value: ReferenceTransferableData? + ) { + if (DumbService.getInstance(project)!!.isDumb()) { + return + } + val document = editor.getDocument() + val file = PsiDocumentManager.getInstance(project).getPsiFile(document) + if (file !is JetFile) { + return + } + + PsiDocumentManager.getInstance(project).commitAllDocuments() + val referenceData = value!!.getData()!! + val referencesPossibleToRestore = findReferencesToRestore(file, bounds, referenceData) + + val selectedReferencesToRestore = showRestoreReferencesDialog(project, referencesPossibleToRestore) + if (selectedReferencesToRestore.isEmpty()) { + return + } + ApplicationManager.getApplication()!!.runWriteAction(Runnable { + restoreReferences(selectedReferencesToRestore, file) + }) + PsiDocumentManager.getInstance(project).commitAllDocuments() + } + + private fun findReferencesToRestore(file: PsiFile, bounds: RangeMarker, referenceData: Array): List { + if (file !is JetFile) { + return Collections.emptyList() + } + return referenceData.map { + val referenceExpression = findReference(it, file, bounds) + if (referenceExpression != null) createReferenceToRestoreData(referenceExpression, it.fqName) else null + }.filterNotNull() + } + + private fun findReference(data: ReferenceData, file: JetFile, bounds: RangeMarker): JetElement? { + val startOffset = data.startOffset + bounds.getStartOffset() + val endOffset = data.endOffset + bounds.getStartOffset() + val element = file.findElementAt(startOffset) + val desiredRange = TextRange(startOffset, endOffset) + var expression = element + while (expression != null) { + val range = expression!!.range + if (range == desiredRange && expression!!.getReference() != null) { + return expression as? JetElement + } + if (range in desiredRange) { + expression = expression!!.getParent() + } + else { + return null + } + } + return null + } + + private fun createReferenceToRestoreData(expression: JetElement, originalReferencedFqName: FqName): ReferenceToRestoreData? { + val reference = expression.getReference() as? JetReference + if (reference == null) { + return null + } + val referencedDescriptors = reference.resolveToDescriptors() + val referencedFqNames = referencedDescriptors.filterNot { ErrorUtils.isError(it) } .map { it.importableFqName } + val referencesSame = referencedFqNames any { it == originalReferencedFqName } + val conflict = referencedFqNames any { it != originalReferencedFqName && (it?.shortName() == originalReferencedFqName.shortName()) } + when { + referencesSame && !conflict -> { + return null + } + !referencesSame && !conflict -> { + return ReferenceToRestoreData(expression, originalReferencedFqName) + } + conflict -> { + val mustBeReferencedWithReceiver = referencedDescriptors.any { it.isExtension } + if (!mustBeReferencedWithReceiver && LengthenReferences.canLengthenReferenceExpression(expression, originalReferencedFqName)) { + return ReferenceToRestoreData(expression, originalReferencedFqName, lengthenReference = true) + } + } + } + return null + } + + private fun restoreReferences(referencesToRestore: Collection, file: JetFile) { + for ((referenceExpression, fqName, shouldLengthen) in referencesToRestore) { + if (!shouldLengthen) { + ImportInsertHelper.addImportDirectiveIfNeeded(fqName, file) + } + else { + //TODO: try to shorten reference after (sometimes is possible), need shorten reference to support all relevant cases + LengthenReferences.lengthenReference(referenceExpression, fqName) + } + } + } + + private fun showRestoreReferencesDialog(project: Project, referencesToRestore: List): Collection { + val shouldShowDialog = CodeInsightSettings.getInstance()!!.ADD_IMPORTS_ON_PASTE == CodeInsightSettings.ASK + if (!shouldShowDialog || referencesToRestore.isEmpty()) { + return referencesToRestore + } + val fqNames = referencesToRestore. map { it.fqName.asString() }.toSortedSet() + val dialog = RestoreReferencesDialog(project, fqNames.copyToArray()) + dialog.show() + val selectedFqNames = dialog.getSelectedElements()!!.toSet() + return referencesToRestore.filter { ref -> selectedFqNames.contains(ref.fqName.asString()) } + } + + class object { + private val IGNORE_REFERENCES_INSIDE: Array?> = array( + javaClass(), + javaClass(), + javaClass(), + javaClass() + ) + } + + private object LengthenReferences { + private val LOG = Logger.getInstance(javaClass()) + + private fun createQualifiedExpression(project: Project, text: String): JetDotQualifiedExpression { + val newExpression = JetPsiFactory.createExpression(project, text) + LOG.assertTrue(newExpression is JetDotQualifiedExpression, + "\"${newExpression.getText()}\" is ${newExpression.javaClass}," + + "not ${javaClass().getSimpleName()}." + ) + return newExpression as JetDotQualifiedExpression + } + + fun lengthenReference(expression: JetElement, fqName: FqName) { + assert(canLengthenReferenceExpression(expression, fqName)) + val project = expression.getProject() + val parent = expression.getParent() + val prefixToInsert = fqName.parent().asString() + if (parent is JetCallExpression) { + val text = "$prefixToInsert.${parent.getText()}" + parent.replace(createQualifiedExpression(project, text)) + } + else if (parent is JetUserType) { + val typeReference = PsiTreeUtil.getParentOfType(expression, javaClass()) + LOG.assertTrue(typeReference != null, "JetUserType is expected to have parent of type JetTypeReference:\n" + + "At: ${DiagnosticUtils.atLocation(expression)}\nFILE:\n${expression.getContainingFile()!!.getText()}") + typeReference!!.replace(JetPsiFactory.createType(project, "$prefixToInsert.${typeReference.getText()}")) + } + else { + expression.replace(createQualifiedExpression(project, fqName.asString())) + } + } + + fun canLengthenReferenceExpression(expression: JetElement, fqName: FqName): Boolean { + if (fqName.pathSegments().size() < 2) { + return false + } + if (expression is JetSimpleNameExpression && expression.getReceiverExpression() == null) { + return true + } + return false + } + } +} + +private val ReferenceData.fqName: FqName + get() = FqName(qClassName!!) + +private fun zip(first: IntArray, second: IntArray): Iterator> { + assert(first.size == second.size) + return first.iterator().zip(second.iterator()) +} + +private fun PsiElement.isInCopiedArea(fileCopiedFrom: JetFile, startOffsets: IntArray, endOffsets: IntArray): Boolean { + if (getContainingFile() != fileCopiedFrom) { + return false + } + return zip(startOffsets, endOffsets).any { + val (start, end) = it + range in TextRange(start, end) + } +} + +private val DeclarationDescriptor.importableFqName: FqName? + get() { + if (this is ConstructorDescriptor) return getContainingDeclaration().importableFqName + val mayBeUnsafe = DescriptorUtils.getFqName(this) + return if (mayBeUnsafe.isSafe()) { + mayBeUnsafe.toSafe() + } + else { + null + } + } + +private val DeclarationDescriptor.isExtension: Boolean + get() = this is CallableDescriptor && getReceiverParameter() != null + +private fun MutableCollection.addIfNotNull(el: T?) = ContainerUtil.addIfNotNull(this, el) \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/RestoreReferencesDialog.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/RestoreReferencesDialog.java new file mode 100644 index 00000000000..d1d182914fb --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/RestoreReferencesDialog.java @@ -0,0 +1,105 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.codeInsight; + +import com.intellij.CommonBundle; +import com.intellij.codeInsight.CodeInsightBundle; +import com.intellij.ide.util.FQNameCellRenderer; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.ui.VerticalFlowLayout; +import com.intellij.psi.PsiClass; +import com.intellij.ui.ScrollPaneFactory; +import com.intellij.ui.components.JBLabel; +import com.intellij.ui.components.JBList; +import com.intellij.util.ui.UIUtil; + +import javax.swing.*; +import java.awt.*; + +import static com.intellij.util.ui.UIUtil.ComponentStyle.SMALL; +import static com.intellij.util.ui.UIUtil.FontColor.BRIGHTER; + +//TODO: this is a copy of com.intellij.codeInsight.editorActions.RestoreReferencesDialog +//consider improving rendering of list cells if you decide to submit pull request to idea (or improve this version) +public class RestoreReferencesDialog extends DialogWrapper { + private final Object[] myNamedElements; + private JList myList; + private Object[] mySelectedElements = PsiClass.EMPTY_ARRAY; + private boolean myContainsClassesOnly = true; + + public RestoreReferencesDialog(final Project project, final Object[] elements) { + super(project, true); + myNamedElements = elements; + for (Object element : elements) { + if (!(element instanceof PsiClass)) { + myContainsClassesOnly = false; + break; + } + } + if (myContainsClassesOnly) { + setTitle(CodeInsightBundle.message("dialog.import.on.paste.title")); + } + else { + setTitle(CodeInsightBundle.message("dialog.import.on.paste.title2")); + } + init(); + + myList.setSelectionInterval(0, myNamedElements.length - 1); + } + + @Override + protected void doOKAction() { + Object[] values = myList.getSelectedValues(); + mySelectedElements = new Object[values.length]; + System.arraycopy(values, 0, mySelectedElements, 0, values.length); + super.doOKAction(); + } + + @Override + protected JComponent createCenterPanel() { + final JPanel panel = new JPanel(new BorderLayout(UIUtil.DEFAULT_HGAP, UIUtil.DEFAULT_VGAP)); + myList = new JBList(myNamedElements); + myList.setCellRenderer(new FQNameCellRenderer()); + panel.add(ScrollPaneFactory.createScrollPane(myList), BorderLayout.CENTER); + + panel.add(new JBLabel(myContainsClassesOnly ? + CodeInsightBundle.message("dialog.paste.on.import.text") : + CodeInsightBundle.message("dialog.paste.on.import.text2"), SMALL, BRIGHTER), BorderLayout.NORTH); + + final JPanel buttonPanel = new JPanel(new VerticalFlowLayout()); + final JButton okButton = new JButton(CommonBundle.getOkButtonText()); + getRootPane().setDefaultButton(okButton); + buttonPanel.add(okButton); + final JButton cancelButton = new JButton(CommonBundle.getCancelButtonText()); + buttonPanel.add(cancelButton); + + panel.setPreferredSize(new Dimension(500, 400)); + + return panel; + } + + + @Override + protected String getDimensionServiceKey(){ + return "#com.intellij.codeInsight.editorActions.RestoreReferencesDialog"; + } + + public Object[] getSelectedElements(){ + return mySelectedElements; + } +} diff --git a/idea/testData/copyPaste/imports/AlreadyImportedViaStar.expected.kt b/idea/testData/copyPaste/imports/AlreadyImportedViaStar.expected.kt new file mode 100644 index 00000000000..ff54e331890 --- /dev/null +++ b/idea/testData/copyPaste/imports/AlreadyImportedViaStar.expected.kt @@ -0,0 +1,21 @@ +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) { + g(A(c).ext()) + O1.f() + O2 + ENTRY +} + +fun f2(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { + ClassObject +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/AlreadyImportedViaStar.kt b/idea/testData/copyPaste/imports/AlreadyImportedViaStar.kt new file mode 100644 index 00000000000..0831a9ff289 --- /dev/null +++ b/idea/testData/copyPaste/imports/AlreadyImportedViaStar.kt @@ -0,0 +1,56 @@ +package a + +import a.E.ENTRY +import a.Outer.* + +trait T + +class A(i: Int) {} + +val c = 0 + +fun g(a: A) {} + +fun A.ext() + +object O1 { + fun f() { + } +} + +object O2 { +} + +enum class E { + ENTRY +} + +class Outer { + inner class Inner { + } + class Nested { + } + enum class NestedEnum { + } + object NestedObj { + } + trait NestedTrait { + } + annotation class NestedAnnotation +} + +class ClassObject { + class object { + } +} + +fun f(a: A, t: T) { + g(A(c).ext()) + O1.f() + O2 + ENTRY +} + +fun f2(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { + ClassObject +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/AlreadyImportedViaStar.to.kt b/idea/testData/copyPaste/imports/AlreadyImportedViaStar.to.kt new file mode 100644 index 00000000000..ed6b9a9de63 --- /dev/null +++ b/idea/testData/copyPaste/imports/AlreadyImportedViaStar.to.kt @@ -0,0 +1,5 @@ +package to + +import a.* + + \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ClassAlreadyImported.expected.kt b/idea/testData/copyPaste/imports/ClassAlreadyImported.expected.kt new file mode 100644 index 00000000000..5a98969af7e --- /dev/null +++ b/idea/testData/copyPaste/imports/ClassAlreadyImported.expected.kt @@ -0,0 +1,7 @@ +package b + +import a.A + +fun f(a: A) { + A() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ClassAlreadyImported.kt b/idea/testData/copyPaste/imports/ClassAlreadyImported.kt new file mode 100644 index 00000000000..0d463d6883f --- /dev/null +++ b/idea/testData/copyPaste/imports/ClassAlreadyImported.kt @@ -0,0 +1,7 @@ +package a + +class A() {} + +fun f(a: A) { + A() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ClassAlreadyImported.to.kt b/idea/testData/copyPaste/imports/ClassAlreadyImported.to.kt new file mode 100644 index 00000000000..5ab6a086551 --- /dev/null +++ b/idea/testData/copyPaste/imports/ClassAlreadyImported.to.kt @@ -0,0 +1,5 @@ +package b + +import a.A + + \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ClassMember.expected.kt b/idea/testData/copyPaste/imports/ClassMember.expected.kt new file mode 100644 index 00000000000..09d75b1e805 --- /dev/null +++ b/idea/testData/copyPaste/imports/ClassMember.expected.kt @@ -0,0 +1,3 @@ +package to + +fun f() = c + d + g + j() \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ClassMember.kt b/idea/testData/copyPaste/imports/ClassMember.kt new file mode 100644 index 00000000000..e5db90d8594 --- /dev/null +++ b/idea/testData/copyPaste/imports/ClassMember.kt @@ -0,0 +1,14 @@ +package a + +// ALLOW_UNRESOLVED + +class A(val c: Int = 1) { + var d = 2 + + val g: Int + get() = d + + fun j() = c + + fun f() = c + d + g + j() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ClassObject.expected.kt b/idea/testData/copyPaste/imports/ClassObject.expected.kt new file mode 100644 index 00000000000..957044080af --- /dev/null +++ b/idea/testData/copyPaste/imports/ClassObject.expected.kt @@ -0,0 +1,10 @@ +package to + +import a.T +import a.A +import a.B + +fun g(t: T): Int { + g(A) + B.f() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ClassObject.kt b/idea/testData/copyPaste/imports/ClassObject.kt new file mode 100644 index 00000000000..77bcbe0f9a7 --- /dev/null +++ b/idea/testData/copyPaste/imports/ClassObject.kt @@ -0,0 +1,21 @@ +package a + +trait T + +class A { + class object: T { + } +} + +class B { + class object { + fun f(): Int + } +} + +fun g(t: T): Int { + g(A) + B.f() +} + + diff --git a/idea/testData/copyPaste/imports/ClassObjectFunInsideClass.expected.kt b/idea/testData/copyPaste/imports/ClassObjectFunInsideClass.expected.kt new file mode 100644 index 00000000000..e873978da6d --- /dev/null +++ b/idea/testData/copyPaste/imports/ClassObjectFunInsideClass.expected.kt @@ -0,0 +1,5 @@ +package to + +fun g() { + f() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ClassObjectFunInsideClass.kt b/idea/testData/copyPaste/imports/ClassObjectFunInsideClass.kt new file mode 100644 index 00000000000..99238aab866 --- /dev/null +++ b/idea/testData/copyPaste/imports/ClassObjectFunInsideClass.kt @@ -0,0 +1,13 @@ +package a + +// ALLOW_UNRESOLVED +//NOTE: is is an unsupported case +class A { + fun g() { + f() + } + + class object { + fun f() + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ClassObjectInner.expected.kt b/idea/testData/copyPaste/imports/ClassObjectInner.expected.kt new file mode 100644 index 00000000000..3f151511dc3 --- /dev/null +++ b/idea/testData/copyPaste/imports/ClassObjectInner.expected.kt @@ -0,0 +1,11 @@ +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 + +fun f(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ClassObjectInner.kt b/idea/testData/copyPaste/imports/ClassObjectInner.kt new file mode 100644 index 00000000000..e3dcb57870a --- /dev/null +++ b/idea/testData/copyPaste/imports/ClassObjectInner.kt @@ -0,0 +1,22 @@ +package a + +import a.Outer.* + +class Outer { + class object { + inner class Inner { + } + class Nested { + } + enum class NestedEnum { + } + object NestedObj { + } + trait NestedTrait { + } + annotation class NestedAnnotation + } +} + +fun f(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: 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 new file mode 100644 index 00000000000..423e1852166 --- /dev/null +++ b/idea/testData/copyPaste/imports/ClassResolvedToPackage.expected.kt @@ -0,0 +1,6 @@ +package to + +fun f(i: a.a) { + a.a + a.a() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ClassResolvedToPackage.kt b/idea/testData/copyPaste/imports/ClassResolvedToPackage.kt new file mode 100644 index 00000000000..38c4e82a1d3 --- /dev/null +++ b/idea/testData/copyPaste/imports/ClassResolvedToPackage.kt @@ -0,0 +1,12 @@ +package a + +//NOTE: this case can be improved by using shorten reference after importing +class a { + class object { + } +} + +fun f(i: a) { + a + a() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ClassType.expected.kt b/idea/testData/copyPaste/imports/ClassType.expected.kt new file mode 100644 index 00000000000..b86a718bfa4 --- /dev/null +++ b/idea/testData/copyPaste/imports/ClassType.expected.kt @@ -0,0 +1,6 @@ +package to + +import a.A + +fun f(a: A) { +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ClassType.kt b/idea/testData/copyPaste/imports/ClassType.kt new file mode 100644 index 00000000000..3def39481e5 --- /dev/null +++ b/idea/testData/copyPaste/imports/ClassType.kt @@ -0,0 +1,6 @@ +package a + +class A() {} + +fun f(a: A) { +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Conflict.expected.kt b/idea/testData/copyPaste/imports/Conflict.expected.kt new file mode 100644 index 00000000000..bad95306781 --- /dev/null +++ b/idea/testData/copyPaste/imports/Conflict.expected.kt @@ -0,0 +1,19 @@ +package to + +class C { +} + +val c = 1 + +fun g() { +} + +fun C.ext() { +} + +fun f() { + a.c + a.g() + a.C() + a.C().ext() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Conflict.kt b/idea/testData/copyPaste/imports/Conflict.kt new file mode 100644 index 00000000000..dfa36eeaccd --- /dev/null +++ b/idea/testData/copyPaste/imports/Conflict.kt @@ -0,0 +1,21 @@ +package a + +// ALLOW_UNRESOLVED + +class C { +} + +val c = 1 + +fun g() { +} + +fun C.ext() { +} + +fun f() { + c + g() + C() + C().ext() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Conflict.to.kt b/idea/testData/copyPaste/imports/Conflict.to.kt new file mode 100644 index 00000000000..6fa8f97742e --- /dev/null +++ b/idea/testData/copyPaste/imports/Conflict.to.kt @@ -0,0 +1,14 @@ +package to + +class C { +} + +val c = 1 + +fun g() { +} + +fun C.ext() { +} + + \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.expected.kt b/idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.expected.kt new file mode 100644 index 00000000000..8e9935a1379 --- /dev/null +++ b/idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.expected.kt @@ -0,0 +1,7 @@ +package to + +class A { +} + +fun f(b: a.A) { +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.kt b/idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.kt new file mode 100644 index 00000000000..01cea61d2f8 --- /dev/null +++ b/idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.kt @@ -0,0 +1,7 @@ +package a + +class A { +} + +fun f(b: 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 new file mode 100644 index 00000000000..d974addfb12 --- /dev/null +++ b/idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.to.kt @@ -0,0 +1,6 @@ +package to + +class A { +} + + \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ConflictWithClass.expected.kt b/idea/testData/copyPaste/imports/ConflictWithClass.expected.kt new file mode 100644 index 00000000000..1bb2669e2ac --- /dev/null +++ b/idea/testData/copyPaste/imports/ConflictWithClass.expected.kt @@ -0,0 +1,7 @@ +package to + +class A() { +} + +fun f(a: a.A) { +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ConflictWithClass.kt b/idea/testData/copyPaste/imports/ConflictWithClass.kt new file mode 100644 index 00000000000..732f7a24bf1 --- /dev/null +++ b/idea/testData/copyPaste/imports/ConflictWithClass.kt @@ -0,0 +1,7 @@ +package a + +class A() { +} + +fun f(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 new file mode 100644 index 00000000000..e99273f7293 --- /dev/null +++ b/idea/testData/copyPaste/imports/ConflictWithClass.to.kt @@ -0,0 +1,6 @@ +package to + +class A() { +} + + \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ConflictWithFun.expected.kt b/idea/testData/copyPaste/imports/ConflictWithFun.expected.kt new file mode 100644 index 00000000000..1e32f49f280 --- /dev/null +++ b/idea/testData/copyPaste/imports/ConflictWithFun.expected.kt @@ -0,0 +1,6 @@ +package to + +fun f() { +} + +fun g() = a.f() \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ConflictWithFun.kt b/idea/testData/copyPaste/imports/ConflictWithFun.kt new file mode 100644 index 00000000000..195a1bc3362 --- /dev/null +++ b/idea/testData/copyPaste/imports/ConflictWithFun.kt @@ -0,0 +1,6 @@ +package a + +fun f() { +} + +fun g() = f() \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ConflictWithFun.to.kt b/idea/testData/copyPaste/imports/ConflictWithFun.to.kt new file mode 100644 index 00000000000..57b804be1b9 --- /dev/null +++ b/idea/testData/copyPaste/imports/ConflictWithFun.to.kt @@ -0,0 +1,6 @@ +package to + +fun f() { +} + + \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Constructor.expected.kt b/idea/testData/copyPaste/imports/Constructor.expected.kt new file mode 100644 index 00000000000..52828ea3690 --- /dev/null +++ b/idea/testData/copyPaste/imports/Constructor.expected.kt @@ -0,0 +1,7 @@ +package b + +import a.A + +fun b() { + A() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Constructor.kt b/idea/testData/copyPaste/imports/Constructor.kt new file mode 100644 index 00000000000..c5fae7ec092 --- /dev/null +++ b/idea/testData/copyPaste/imports/Constructor.kt @@ -0,0 +1,5 @@ +package a + +class A() {} + +val c = A() \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Constructor.to.kt b/idea/testData/copyPaste/imports/Constructor.to.kt new file mode 100644 index 00000000000..0b30b071456 --- /dev/null +++ b/idea/testData/copyPaste/imports/Constructor.to.kt @@ -0,0 +1,5 @@ +package b + +fun b() { + +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/DeepInnerClasses.expected.kt b/idea/testData/copyPaste/imports/DeepInnerClasses.expected.kt new file mode 100644 index 00000000000..dfc7ac6e102 --- /dev/null +++ b/idea/testData/copyPaste/imports/DeepInnerClasses.expected.kt @@ -0,0 +1,21 @@ +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() + with(Outer.Nested()) { + NI2() + } + IN2() + with(Outer().Inner()) { + II2() + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/DeepInnerClasses.kt b/idea/testData/copyPaste/imports/DeepInnerClasses.kt new file mode 100644 index 00000000000..b1c107faf17 --- /dev/null +++ b/idea/testData/copyPaste/imports/DeepInnerClasses.kt @@ -0,0 +1,41 @@ +package a + +import a.Outer.Nested.* +import a.Outer.Inner.* + +class Outer { + class Nested { + class NN { + } + class NN2 { + } + inner class NI { + } + inner class NI2 { + } + } + + inner class Inner { + class IN { + } + class IN2 { + } + inner class II { + } + inner class II2 { + } + } +} + +fun with(v: T, body: T.() -> Unit) = v.body() + +fun f(p1: NN, p2: NI, p3: IN, p4: II) { + NN2() + with(Outer.Nested()) { + NI2() + } + IN2() + with(Outer().Inner()) { + II2() + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/DefaultPackage.expected.kt b/idea/testData/copyPaste/imports/DefaultPackage.expected.kt new file mode 100644 index 00000000000..ca65c8c3d22 --- /dev/null +++ b/idea/testData/copyPaste/imports/DefaultPackage.expected.kt @@ -0,0 +1,3 @@ +package to + +val c = A() \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/DefaultPackage.kt b/idea/testData/copyPaste/imports/DefaultPackage.kt new file mode 100644 index 00000000000..d3f0f2ef63d --- /dev/null +++ b/idea/testData/copyPaste/imports/DefaultPackage.kt @@ -0,0 +1,6 @@ +// ALLOW_UNRESOLVED + +class A { +} + +val c = A() \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/DelegatedProperty.expected.kt b/idea/testData/copyPaste/imports/DelegatedProperty.expected.kt new file mode 100644 index 00000000000..1f61f171db8 --- /dev/null +++ b/idea/testData/copyPaste/imports/DelegatedProperty.expected.kt @@ -0,0 +1,9 @@ +package to + +import a.A +import a.get +import a.set + +class B { + var a by A() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/DelegatedProperty.kt b/idea/testData/copyPaste/imports/DelegatedProperty.kt new file mode 100644 index 00000000000..8ffadab16ce --- /dev/null +++ b/idea/testData/copyPaste/imports/DelegatedProperty.kt @@ -0,0 +1,16 @@ +package a + +trait T + +fun T.get(thisRef: B, desc: PropertyMetadata): Int { + return 3 +} + +fun T.set(thisRef: B, desc: PropertyMetadata, value: Int) { +} + +class A(): T + +class B { + var a 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 new file mode 100644 index 00000000000..778817c78e2 --- /dev/null +++ b/idea/testData/copyPaste/imports/DependencyOnJava.dependency.java @@ -0,0 +1,16 @@ +package java; + +public class JavaClass { + public static int staticMethod() { + return 3; + } + + public void method() { + } + + public class InnerClass { + } + + public 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 new file mode 100644 index 00000000000..4216c06e0d1 --- /dev/null +++ b/idea/testData/copyPaste/imports/DependencyOnJava.expected.kt @@ -0,0 +1,12 @@ +package to + +import java.JavaClass +import java.JavaClass.staticMethod +import java.JavaClass.NestedClass + +fun f(c: JavaClass) { + staticMethod() + c.method() + c.InnerClass() + NestedClass() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/DependencyOnJava.kt b/idea/testData/copyPaste/imports/DependencyOnJava.kt new file mode 100644 index 00000000000..990f173f3ea --- /dev/null +++ b/idea/testData/copyPaste/imports/DependencyOnJava.kt @@ -0,0 +1,13 @@ +package a + +import java.JavaClass +import java.JavaClass.NestedClass +import java.JavaClass.staticMethod + + +fun f(c: JavaClass) { + staticMethod() + c.method() + c.InnerClass() + 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 new file mode 100644 index 00000000000..71bc0f69a7d --- /dev/null +++ b/idea/testData/copyPaste/imports/DependencyOnKotlinLibrary.expected.kt @@ -0,0 +1,28 @@ +package to + +import d.A +import d.T +import d.g +import d.c +import d.ext +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.ClassObject + +fun f(a: A, t: T) { + g(A(c).ext()) + O1.f() + O2 + ENTRY +} + +fun f2(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { + ClassObject +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/DependencyOnKotlinLibrary.kt b/idea/testData/copyPaste/imports/DependencyOnKotlinLibrary.kt new file mode 100644 index 00000000000..623bb00c09e --- /dev/null +++ b/idea/testData/copyPaste/imports/DependencyOnKotlinLibrary.kt @@ -0,0 +1,18 @@ +// WITH_LIBRARY: copyPaste/imports/KotlinLibrary + +package a + +import d.* +import d.E.ENTRY +import d.Outer.* + +fun f(a: A, t: T) { + g(A(c).ext()) + O1.f() + O2 + ENTRY +} + +fun f2(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { + ClassObject +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/DependencyOnStdLib.expected.kt b/idea/testData/copyPaste/imports/DependencyOnStdLib.expected.kt new file mode 100644 index 00000000000..5f2a0f5472c --- /dev/null +++ b/idea/testData/copyPaste/imports/DependencyOnStdLib.expected.kt @@ -0,0 +1,5 @@ +package to + +import kotlin.concurrent.FunctionalList + +fun f(l: FunctionalList) {} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/DependencyOnStdLib.kt b/idea/testData/copyPaste/imports/DependencyOnStdLib.kt new file mode 100644 index 00000000000..4c5c5306087 --- /dev/null +++ b/idea/testData/copyPaste/imports/DependencyOnStdLib.kt @@ -0,0 +1,7 @@ +// RUNTIME + +package g + +import kotlin.concurrent.FunctionalList + +fun f(l: FunctionalList) {} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/EnumEntries.expected.kt b/idea/testData/copyPaste/imports/EnumEntries.expected.kt new file mode 100644 index 00000000000..d7d0fcca649 --- /dev/null +++ b/idea/testData/copyPaste/imports/EnumEntries.expected.kt @@ -0,0 +1,11 @@ +package to + +import a.A.A +import a.A.B +import a.A.C + +fun f() { + A + B + C +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/EnumEntries.kt b/idea/testData/copyPaste/imports/EnumEntries.kt new file mode 100644 index 00000000000..11edfd3438f --- /dev/null +++ b/idea/testData/copyPaste/imports/EnumEntries.kt @@ -0,0 +1,13 @@ +package a + +enum class A { + A + B + C + + fun f() { + A + B + C + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Extension.expected.kt b/idea/testData/copyPaste/imports/Extension.expected.kt new file mode 100644 index 00000000000..939e4a37e6a --- /dev/null +++ b/idea/testData/copyPaste/imports/Extension.expected.kt @@ -0,0 +1,11 @@ +package to + +import a.f +import a.p +import a.g + +fun foo() { + 3.f() + 2.p + 3.g = 5 +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Extension.kt b/idea/testData/copyPaste/imports/Extension.kt new file mode 100644 index 00000000000..76d77e2bc6b --- /dev/null +++ b/idea/testData/copyPaste/imports/Extension.kt @@ -0,0 +1,16 @@ +package a + +fun Int.f() {} + +val Int.p: Int + get() = 2 + +var Int.g: Int + get() = 1 + set(i : Int) = Unit + +fun foo() { + 3.f() + 2.p + 3.g = 5 +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ExtensionAsInfixOrOperator.expected.kt b/idea/testData/copyPaste/imports/ExtensionAsInfixOrOperator.expected.kt new file mode 100644 index 00000000000..c9e8d2a4ad5 --- /dev/null +++ b/idea/testData/copyPaste/imports/ExtensionAsInfixOrOperator.expected.kt @@ -0,0 +1,10 @@ +package to + +import a.A +import a.plus +import a.infix + +fun f(a: A) { + a + a + a infix 1 +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ExtensionAsInfixOrOperator.kt b/idea/testData/copyPaste/imports/ExtensionAsInfixOrOperator.kt new file mode 100644 index 00000000000..318b6c0e73f --- /dev/null +++ b/idea/testData/copyPaste/imports/ExtensionAsInfixOrOperator.kt @@ -0,0 +1,12 @@ +package a + +class A() {} + +fun A.plus(a: A) = this + +fun A.infix(i: Int) = i + +fun f(a: A) { + a + a + a infix 1 +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.expected.kt b/idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.expected.kt new file mode 100644 index 00000000000..8d69e711950 --- /dev/null +++ b/idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.expected.kt @@ -0,0 +1,16 @@ +package to + +import a.A + +fun A.ext() { +} + +var A.p: Int + get() = 2 + set(i: Int) = throw UnsupportedOperationException() + +fun A.f() { + ext() + p + p = 3 +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.kt b/idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.kt new file mode 100644 index 00000000000..f8c3e660460 --- /dev/null +++ b/idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.kt @@ -0,0 +1,17 @@ +package a + +class A() { +} + +fun A.ext() { +} + +var A.p: Int + get() = 2 + set(i: Int) = throw UnsupportedOperationException() + +fun A.f() { + ext() + p + p = 3 +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.to.kt b/idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.to.kt new file mode 100644 index 00000000000..42f225d9e97 --- /dev/null +++ b/idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.to.kt @@ -0,0 +1,12 @@ +package to + +import a.A + +fun A.ext() { +} + +var A.p: Int + get() = 2 + set(i: Int) = throw UnsupportedOperationException() + + \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ExtensionConflict.expected.kt b/idea/testData/copyPaste/imports/ExtensionConflict.expected.kt new file mode 100644 index 00000000000..c8e5ab497db --- /dev/null +++ b/idea/testData/copyPaste/imports/ExtensionConflict.expected.kt @@ -0,0 +1,26 @@ +package to + +import a.A + +fun A.ext() { +} + +fun A.infix(a: A) { +} + +fun A.plus(a: A) { +} + +fun A.minus() { +} + +val A.p: Int + get() = 2 + +fun f() { + A().ext() + A() + A() + A() infix A() + -A() + A().p +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ExtensionConflict.kt b/idea/testData/copyPaste/imports/ExtensionConflict.kt new file mode 100644 index 00000000000..d239c2c1253 --- /dev/null +++ b/idea/testData/copyPaste/imports/ExtensionConflict.kt @@ -0,0 +1,27 @@ +package a + +class A { +} + +fun A.ext() { +} + +fun A.infix(a: A) { +} + +fun A.plus(a: A) { +} + +fun A.minus() { +} + +val A.p: Int + get() = 2 + +fun f() { + A().ext() + A() + A() + A() infix A() + -A() + A().p +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ExtensionConflict.to.kt b/idea/testData/copyPaste/imports/ExtensionConflict.to.kt new file mode 100644 index 00000000000..44bd3a2b05a --- /dev/null +++ b/idea/testData/copyPaste/imports/ExtensionConflict.to.kt @@ -0,0 +1,20 @@ +package to + +import a.A + +fun A.ext() { +} + +fun A.infix(a: A) { +} + +fun A.plus(a: A) { +} + +fun A.minus() { +} + +val A.p: Int + get() = 2 + + \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ForLoop.expected.kt b/idea/testData/copyPaste/imports/ForLoop.expected.kt new file mode 100644 index 00000000000..9140a420f41 --- /dev/null +++ b/idea/testData/copyPaste/imports/ForLoop.expected.kt @@ -0,0 +1,11 @@ +package to + +import a.A +import a.iterator +import a.next +import a.hasNext + +fun f() { + for (i in A()) { + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ForLoop.kt b/idea/testData/copyPaste/imports/ForLoop.kt new file mode 100644 index 00000000000..dd8602b5957 --- /dev/null +++ b/idea/testData/copyPaste/imports/ForLoop.kt @@ -0,0 +1,18 @@ +package a + +class A() { +} + +class B() { +} + +fun B.next(): Int = 3 + +fun B.hasNext(): Boolean = false + +fun A.iterator() = B() + +fun f() { + for (i in A()) { + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/FullyQualified.expected.kt b/idea/testData/copyPaste/imports/FullyQualified.expected.kt new file mode 100644 index 00000000000..0a498a1c8d8 --- /dev/null +++ b/idea/testData/copyPaste/imports/FullyQualified.expected.kt @@ -0,0 +1,3 @@ +package to + +fun f(t: a.b.c.A): a.b.c.B = a.b.c.B() \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/FullyQualified.kt b/idea/testData/copyPaste/imports/FullyQualified.kt new file mode 100644 index 00000000000..b3078a7384c --- /dev/null +++ b/idea/testData/copyPaste/imports/FullyQualified.kt @@ -0,0 +1,7 @@ +package a.b.c + +class A() {} + +class B() {} + +fun f(t: a.b.c.A): a.b.c.B = a.b.c.B() \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Function.expected.kt b/idea/testData/copyPaste/imports/Function.expected.kt new file mode 100644 index 00000000000..8968cc4da07 --- /dev/null +++ b/idea/testData/copyPaste/imports/Function.expected.kt @@ -0,0 +1,7 @@ +package to + +import a.g + +fun f() { + g() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Function.kt b/idea/testData/copyPaste/imports/Function.kt new file mode 100644 index 00000000000..e0256742293 --- /dev/null +++ b/idea/testData/copyPaste/imports/Function.kt @@ -0,0 +1,8 @@ +package a + +fun g() { +} + +fun f() { + g() +} diff --git a/idea/testData/copyPaste/imports/FunctionAlreadyImported.expected.kt b/idea/testData/copyPaste/imports/FunctionAlreadyImported.expected.kt new file mode 100644 index 00000000000..adf66f3bc89 --- /dev/null +++ b/idea/testData/copyPaste/imports/FunctionAlreadyImported.expected.kt @@ -0,0 +1,7 @@ +package b + +import a.g + +fun f() { + g() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/FunctionAlreadyImported.kt b/idea/testData/copyPaste/imports/FunctionAlreadyImported.kt new file mode 100644 index 00000000000..e0256742293 --- /dev/null +++ b/idea/testData/copyPaste/imports/FunctionAlreadyImported.kt @@ -0,0 +1,8 @@ +package a + +fun g() { +} + +fun f() { + g() +} diff --git a/idea/testData/copyPaste/imports/FunctionAlreadyImported.to.kt b/idea/testData/copyPaste/imports/FunctionAlreadyImported.to.kt new file mode 100644 index 00000000000..30a347ebcae --- /dev/null +++ b/idea/testData/copyPaste/imports/FunctionAlreadyImported.to.kt @@ -0,0 +1,5 @@ +package b + +import a.g + + \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/FunctionParameter.expected.kt b/idea/testData/copyPaste/imports/FunctionParameter.expected.kt new file mode 100644 index 00000000000..daa6ecefb12 --- /dev/null +++ b/idea/testData/copyPaste/imports/FunctionParameter.expected.kt @@ -0,0 +1,7 @@ +package to + +fun f() { + val r = arrayListOf() + r.addAll(b) + val x = c +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/FunctionParameter.kt b/idea/testData/copyPaste/imports/FunctionParameter.kt new file mode 100644 index 00000000000..7cd38b6e4e6 --- /dev/null +++ b/idea/testData/copyPaste/imports/FunctionParameter.kt @@ -0,0 +1,10 @@ +//RUNTIME +// ALLOW_UNRESOLVED + +package a + +fun f(c: Int, b: List) { + val r = arrayListOf() + r.addAll(b) + val x = c +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/FunctionParameter.to.kt b/idea/testData/copyPaste/imports/FunctionParameter.to.kt new file mode 100644 index 00000000000..2a83728d2eb --- /dev/null +++ b/idea/testData/copyPaste/imports/FunctionParameter.to.kt @@ -0,0 +1,5 @@ +package to + +fun f() { + +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/GetExpression.expected.kt b/idea/testData/copyPaste/imports/GetExpression.expected.kt new file mode 100644 index 00000000000..bdf02d32907 --- /dev/null +++ b/idea/testData/copyPaste/imports/GetExpression.expected.kt @@ -0,0 +1,8 @@ +package to + +import a.A +import a.get + +fun f() { + A()[""] +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/GetExpression.kt b/idea/testData/copyPaste/imports/GetExpression.kt new file mode 100644 index 00000000000..74683ce855a --- /dev/null +++ b/idea/testData/copyPaste/imports/GetExpression.kt @@ -0,0 +1,11 @@ +package a + +class A { +} + +fun A.get(s: String) { +} + +fun f() { + A()[""] +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ImportDependency.dependency.kt b/idea/testData/copyPaste/imports/ImportDependency.dependency.kt new file mode 100644 index 00000000000..f1fc50fd660 --- /dev/null +++ b/idea/testData/copyPaste/imports/ImportDependency.dependency.kt @@ -0,0 +1,42 @@ +package d + +trait T + +class A(i: Int) {} + +val c = 0 + +fun g(a: A) {} + +fun A.ext() + +object O1 { + fun f() { + } +} + +object O2 { +} + +enum class E { + ENTRY +} + +class Outer { + inner class Inner { + } + class Nested { + } + enum class NestedEnum { + } + object NestedObj { + } + trait NestedTrait { + } + annotation class NestedAnnotation +} + +class ClassObject { + class object { + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ImportDependency.expected.kt b/idea/testData/copyPaste/imports/ImportDependency.expected.kt new file mode 100644 index 00000000000..71bc0f69a7d --- /dev/null +++ b/idea/testData/copyPaste/imports/ImportDependency.expected.kt @@ -0,0 +1,28 @@ +package to + +import d.A +import d.T +import d.g +import d.c +import d.ext +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.ClassObject + +fun f(a: A, t: T) { + g(A(c).ext()) + O1.f() + O2 + ENTRY +} + +fun f2(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { + ClassObject +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ImportDependency.kt b/idea/testData/copyPaste/imports/ImportDependency.kt new file mode 100644 index 00000000000..f0ee3525651 --- /dev/null +++ b/idea/testData/copyPaste/imports/ImportDependency.kt @@ -0,0 +1,16 @@ +package a + +import d.* +import d.E.ENTRY +import d.Outer.* + +fun f(a: A, t: T) { + g(A(c).ext()) + O1.f() + O2 + ENTRY +} + +fun f2(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { + ClassObject +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ImportDirective.expected.kt b/idea/testData/copyPaste/imports/ImportDirective.expected.kt new file mode 100644 index 00000000000..ceac7e37b58 --- /dev/null +++ b/idea/testData/copyPaste/imports/ImportDirective.expected.kt @@ -0,0 +1,5 @@ +package to + +package a + +import a.A \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ImportDirective.kt b/idea/testData/copyPaste/imports/ImportDirective.kt new file mode 100644 index 00000000000..2bd77823ef5 --- /dev/null +++ b/idea/testData/copyPaste/imports/ImportDirective.kt @@ -0,0 +1,8 @@ +// ALLOW_UNRESOLVED + +package a + +import a.A + +class A() { +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ImportDirective.to.kt b/idea/testData/copyPaste/imports/ImportDirective.to.kt new file mode 100644 index 00000000000..419295f320c --- /dev/null +++ b/idea/testData/copyPaste/imports/ImportDirective.to.kt @@ -0,0 +1,3 @@ +package to + + \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ImportableEntityInExtensionLiteral.expected.kt b/idea/testData/copyPaste/imports/ImportableEntityInExtensionLiteral.expected.kt new file mode 100644 index 00000000000..5d722c43a9b --- /dev/null +++ b/idea/testData/copyPaste/imports/ImportableEntityInExtensionLiteral.expected.kt @@ -0,0 +1,14 @@ +package to + +import a.f +import a.A.Nested +import a.ext + +fun g() { + f { + Inner() + Nested() + foo() + ext() + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ImportableEntityInExtensionLiteral.kt b/idea/testData/copyPaste/imports/ImportableEntityInExtensionLiteral.kt new file mode 100644 index 00000000000..8d0f3693b48 --- /dev/null +++ b/idea/testData/copyPaste/imports/ImportableEntityInExtensionLiteral.kt @@ -0,0 +1,28 @@ +package a + +import a.A.Inner +import a.A.Nested + +class A { + inner class Inner { + } + class Nested { + } + fun foo() { + } +} + +fun A.ext() { +} + +fun f(body: A.() -> Unit) { +} + +fun g() { + f { + Inner() + Nested() + foo() + ext() + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ImportedElementCopied.expected.kt b/idea/testData/copyPaste/imports/ImportedElementCopied.expected.kt new file mode 100644 index 00000000000..713c37fc0fa --- /dev/null +++ b/idea/testData/copyPaste/imports/ImportedElementCopied.expected.kt @@ -0,0 +1,22 @@ +package to + +class Outer { + inner class Inner { + } + class Nested { + } + enum class NestedEnum { + } + object NestedObj { + } + trait NestedTrait { + } + annotation class NestedAnnotation +} + +enum class E { + ENTRY +} + +fun f2(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ImportedElementCopied.kt b/idea/testData/copyPaste/imports/ImportedElementCopied.kt new file mode 100644 index 00000000000..02842340f7c --- /dev/null +++ b/idea/testData/copyPaste/imports/ImportedElementCopied.kt @@ -0,0 +1,30 @@ +package a + +// ALLOW_UNRESOLVED +//NOTE: This test shows a corner case which is not covered fully by current implementation +// All we do now is avoid inserting wrong imports (we do not import anything for declaration from copied block) +// To cover this case properly and insert good imports some other approach should be used (some sophisticated heuristic might do the job) + +import a.Outer.* +import a.E.ENTRY + +class Outer { + inner class Inner { + } + class Nested { + } + enum class NestedEnum { + } + object NestedObj { + } + trait NestedTrait { + } + annotation class NestedAnnotation +} + +enum class E { + ENTRY +} + +fun f2(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Inner.expected.kt b/idea/testData/copyPaste/imports/Inner.expected.kt new file mode 100644 index 00000000000..ccdf848efd2 --- /dev/null +++ b/idea/testData/copyPaste/imports/Inner.expected.kt @@ -0,0 +1,13 @@ +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) { + Outer().Inner2() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Inner.kt b/idea/testData/copyPaste/imports/Inner.kt new file mode 100644 index 00000000000..bb86fae389e --- /dev/null +++ b/idea/testData/copyPaste/imports/Inner.kt @@ -0,0 +1,23 @@ +package a + +import a.Outer.* + +class Outer { + inner class Inner { + } + inner class Inner2 { + } + class Nested { + } + enum class NestedEnum { + } + object NestedObj { + } + trait NestedTrait { + } + annotation class NestedAnnotation +} + +fun f(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: 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 new file mode 100644 index 00000000000..b8601895491 --- /dev/null +++ b/idea/testData/copyPaste/imports/Invoke.expected.kt @@ -0,0 +1,8 @@ +package to + +import a.A +import a.invoke + +fun f(a: A) { + a() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Invoke.kt b/idea/testData/copyPaste/imports/Invoke.kt new file mode 100644 index 00000000000..e6981156053 --- /dev/null +++ b/idea/testData/copyPaste/imports/Invoke.kt @@ -0,0 +1,11 @@ +package a + +class A { +} + +fun A.invoke() { +} + +fun f(a: A) { + a() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/JavaStaticViaClass.dependency.java b/idea/testData/copyPaste/imports/JavaStaticViaClass.dependency.java new file mode 100644 index 00000000000..4a45143748f --- /dev/null +++ b/idea/testData/copyPaste/imports/JavaStaticViaClass.dependency.java @@ -0,0 +1,10 @@ +package a; + +class JavaM { + static void staticMethod() { + } +} + +class JavaF { + static int staticField = 0; +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/JavaStaticViaClass.expected.kt b/idea/testData/copyPaste/imports/JavaStaticViaClass.expected.kt new file mode 100644 index 00000000000..50df72ea4ca --- /dev/null +++ b/idea/testData/copyPaste/imports/JavaStaticViaClass.expected.kt @@ -0,0 +1,9 @@ +package to + +import a.JavaM +import a.JavaF + +fun f() { + JavaM.staticMethod() + JavaF.staticField() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/JavaStaticViaClass.kt b/idea/testData/copyPaste/imports/JavaStaticViaClass.kt new file mode 100644 index 00000000000..e72c05c5534 --- /dev/null +++ b/idea/testData/copyPaste/imports/JavaStaticViaClass.kt @@ -0,0 +1,6 @@ +package a + +fun f() { + JavaM.staticMethod() + JavaF.staticField() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/KotlinLibrary/Dependency.kt b/idea/testData/copyPaste/imports/KotlinLibrary/Dependency.kt new file mode 100644 index 00000000000..c2ffe6e49ed --- /dev/null +++ b/idea/testData/copyPaste/imports/KotlinLibrary/Dependency.kt @@ -0,0 +1,43 @@ +package d + +trait T + +class A(i: Int) {} + +val c: Int = 0 + +fun g(a: A) {} + +fun A.ext() { +} + +object O1 { + fun f() { + } +} + +object O2 { +} + +enum class E { + ENTRY +} + +class Outer { + inner class Inner { + } + class Nested { + } + enum class NestedEnum { + } + object NestedObj { + } + trait NestedTrait { + } + annotation class NestedAnnotation +} + +class ClassObject { + class object { + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Local.expected.kt b/idea/testData/copyPaste/imports/Local.expected.kt new file mode 100644 index 00000000000..ef741e9395a --- /dev/null +++ b/idea/testData/copyPaste/imports/Local.expected.kt @@ -0,0 +1,6 @@ +package to + +fun f() { + val b = A() + val a = g() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Local.kt b/idea/testData/copyPaste/imports/Local.kt new file mode 100644 index 00000000000..ce4b8ea8d8b --- /dev/null +++ b/idea/testData/copyPaste/imports/Local.kt @@ -0,0 +1,14 @@ +package a + +// ALLOW_UNRESOLVED + +fun f() { + fun g(): Int { + } + + class A() { + } + + val b = A() + val a = g() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Local.to.kt b/idea/testData/copyPaste/imports/Local.to.kt new file mode 100644 index 00000000000..2a83728d2eb --- /dev/null +++ b/idea/testData/copyPaste/imports/Local.to.kt @@ -0,0 +1,5 @@ +package to + +fun f() { + +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/MultiReferencePartiallyCopied.expected.kt b/idea/testData/copyPaste/imports/MultiReferencePartiallyCopied.expected.kt new file mode 100644 index 00000000000..aac1410dce1 --- /dev/null +++ b/idea/testData/copyPaste/imports/MultiReferencePartiallyCopied.expected.kt @@ -0,0 +1,13 @@ +package to + +import a.A +import a.B +import a.next +import a.hasNext + +fun A.iterator() = B() + +fun f() { + for (i in A()) { + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/MultiReferencePartiallyCopied.kt b/idea/testData/copyPaste/imports/MultiReferencePartiallyCopied.kt new file mode 100644 index 00000000000..6053b8a6122 --- /dev/null +++ b/idea/testData/copyPaste/imports/MultiReferencePartiallyCopied.kt @@ -0,0 +1,18 @@ +package a + +class A() { +} + +class B() { +} + +fun B.next(): Int = 3 + +fun B.hasNext(): Boolean = false + +fun A.iterator() = B() + +fun f() { + for (i in A()) { + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/NoImportForBuiltIns.expected.kt b/idea/testData/copyPaste/imports/NoImportForBuiltIns.expected.kt new file mode 100644 index 00000000000..fe9bb974f64 --- /dev/null +++ b/idea/testData/copyPaste/imports/NoImportForBuiltIns.expected.kt @@ -0,0 +1,6 @@ +package to + +import a.d +import a.b + +fun f(c: IntRange) = d + b \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/NoImportForBuiltIns.kt b/idea/testData/copyPaste/imports/NoImportForBuiltIns.kt new file mode 100644 index 00000000000..d0818981f9d --- /dev/null +++ b/idea/testData/copyPaste/imports/NoImportForBuiltIns.kt @@ -0,0 +1,6 @@ +package a + +private val d = 1 +private val b = 2 + +fun f(c: IntRange) = d + b \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/NoImportForSamePackage.expected.kt b/idea/testData/copyPaste/imports/NoImportForSamePackage.expected.kt new file mode 100644 index 00000000000..64840437c58 --- /dev/null +++ b/idea/testData/copyPaste/imports/NoImportForSamePackage.expected.kt @@ -0,0 +1,20 @@ +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) { + g(A(c).ext()) + O1.f() + O2 + ENTRY +} + +fun f2(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { + ClassObject +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/NoImportForSamePackage.kt b/idea/testData/copyPaste/imports/NoImportForSamePackage.kt new file mode 100644 index 00000000000..ae4c5a18900 --- /dev/null +++ b/idea/testData/copyPaste/imports/NoImportForSamePackage.kt @@ -0,0 +1,56 @@ +package a + +import a.E.ENTRY +import a.Outer.* + +trait T + +class A(i: Int) {} + +val c = 0 + +fun g(a: A) {} + +fun A.ext() = A() + +object O1 { + fun f() { + } +} + +object O2 { +} + +enum class E { + ENTRY +} + +class Outer { + inner class Inner { + } + class Nested { + } + enum class NestedEnum { + } + object NestedObj { + } + trait NestedTrait { + } + annotation class NestedAnnotation +} + +class ClassObject { + class object { + } +} + +fun f(a: A, t: T) { + g(A(c).ext()) + O1.f() + O2 + ENTRY +} + +fun f2(i: Inner, n: Nested, e: NestedEnum, o: NestedObj, t: NestedTrait, a: NestedAnnotation) { + ClassObject +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/NoImportForSamePackage.to.kt b/idea/testData/copyPaste/imports/NoImportForSamePackage.to.kt new file mode 100644 index 00000000000..da728b97b04 --- /dev/null +++ b/idea/testData/copyPaste/imports/NoImportForSamePackage.to.kt @@ -0,0 +1,3 @@ +package a + + \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/NotReferencePosition.expected.kt b/idea/testData/copyPaste/imports/NotReferencePosition.expected.kt new file mode 100644 index 00000000000..c3fbcaa1cf0 --- /dev/null +++ b/idea/testData/copyPaste/imports/NotReferencePosition.expected.kt @@ -0,0 +1,3 @@ +package to + +val c = 1f \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/NotReferencePosition.kt b/idea/testData/copyPaste/imports/NotReferencePosition.kt new file mode 100644 index 00000000000..03d44173e66 --- /dev/null +++ b/idea/testData/copyPaste/imports/NotReferencePosition.kt @@ -0,0 +1,6 @@ +package a + +fun f() { + f() +} + diff --git a/idea/testData/copyPaste/imports/NotReferencePosition.to.kt b/idea/testData/copyPaste/imports/NotReferencePosition.to.kt new file mode 100644 index 00000000000..d887f47ab5b --- /dev/null +++ b/idea/testData/copyPaste/imports/NotReferencePosition.to.kt @@ -0,0 +1,3 @@ +package to + +val c = 1 \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/NotReferencePosition2.expected.kt b/idea/testData/copyPaste/imports/NotReferencePosition2.expected.kt new file mode 100644 index 00000000000..d36ae8b4a94 --- /dev/null +++ b/idea/testData/copyPaste/imports/NotReferencePosition2.expected.kt @@ -0,0 +1,3 @@ +package to + +val c = "f" \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/NotReferencePosition2.kt b/idea/testData/copyPaste/imports/NotReferencePosition2.kt new file mode 100644 index 00000000000..61f8a72b9b8 --- /dev/null +++ b/idea/testData/copyPaste/imports/NotReferencePosition2.kt @@ -0,0 +1,5 @@ +package a + +fun f() { + f() +} diff --git a/idea/testData/copyPaste/imports/NotReferencePosition2.to.kt b/idea/testData/copyPaste/imports/NotReferencePosition2.to.kt new file mode 100644 index 00000000000..0953fa6b472 --- /dev/null +++ b/idea/testData/copyPaste/imports/NotReferencePosition2.to.kt @@ -0,0 +1,3 @@ +package to + +val c = "" \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Object.expected.kt b/idea/testData/copyPaste/imports/Object.expected.kt new file mode 100644 index 00000000000..2c8220a1065 --- /dev/null +++ b/idea/testData/copyPaste/imports/Object.expected.kt @@ -0,0 +1,10 @@ +package to + +import a.T +import a.A +import a.B + +fun g(t: T) { + g(A) + B.f() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Object.kt b/idea/testData/copyPaste/imports/Object.kt new file mode 100644 index 00000000000..d19f74f47fe --- /dev/null +++ b/idea/testData/copyPaste/imports/Object.kt @@ -0,0 +1,15 @@ +package a + +object B { + fun f() +} + +trait T + +object A: T { +} + +fun g(t: T) { + g(A) + B.f() +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/PackageView.dependency.kt b/idea/testData/copyPaste/imports/PackageView.dependency.kt new file mode 100644 index 00000000000..109221806af --- /dev/null +++ b/idea/testData/copyPaste/imports/PackageView.dependency.kt @@ -0,0 +1,4 @@ +package a.b + +class B() { +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/PackageView.expected.kt b/idea/testData/copyPaste/imports/PackageView.expected.kt new file mode 100644 index 00000000000..bde3b0bee44 --- /dev/null +++ b/idea/testData/copyPaste/imports/PackageView.expected.kt @@ -0,0 +1,5 @@ +package to + +import a.b + +val c = b.B() \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/PackageView.kt b/idea/testData/copyPaste/imports/PackageView.kt new file mode 100644 index 00000000000..7b8b5579b37 --- /dev/null +++ b/idea/testData/copyPaste/imports/PackageView.kt @@ -0,0 +1,3 @@ +package a + +val c = b.B() \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/PartiallyQualified.expected.kt b/idea/testData/copyPaste/imports/PartiallyQualified.expected.kt new file mode 100644 index 00000000000..071b07f0605 --- /dev/null +++ b/idea/testData/copyPaste/imports/PartiallyQualified.expected.kt @@ -0,0 +1,6 @@ +package to + +import a.Foo + +fun f(a: Foo.Bar) { +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/PartiallyQualified.kt b/idea/testData/copyPaste/imports/PartiallyQualified.kt new file mode 100644 index 00000000000..095e1e8891a --- /dev/null +++ b/idea/testData/copyPaste/imports/PartiallyQualified.kt @@ -0,0 +1,11 @@ +package a +package a + +class Foo() { + class Bar() { + } +} + + +fun f(a: Foo.Bar) { +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/PropertyResolvedToPackage.expected.kt b/idea/testData/copyPaste/imports/PropertyResolvedToPackage.expected.kt new file mode 100644 index 00000000000..00beb870206 --- /dev/null +++ b/idea/testData/copyPaste/imports/PropertyResolvedToPackage.expected.kt @@ -0,0 +1,3 @@ +package to + +fun f() = a.a \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/PropertyResolvedToPackage.kt b/idea/testData/copyPaste/imports/PropertyResolvedToPackage.kt new file mode 100644 index 00000000000..5f3a4535ddd --- /dev/null +++ b/idea/testData/copyPaste/imports/PropertyResolvedToPackage.kt @@ -0,0 +1,6 @@ +package a + +//NOTE: this case can be improved by using shorten reference after importing +val a = 1 + +fun f() = a \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/QualifiedTypeConflict.expected.kt b/idea/testData/copyPaste/imports/QualifiedTypeConflict.expected.kt new file mode 100644 index 00000000000..de744063fa7 --- /dev/null +++ b/idea/testData/copyPaste/imports/QualifiedTypeConflict.expected.kt @@ -0,0 +1,9 @@ +package to + +class A { + class B { + } +} + +fun f(p: a.A.B) { +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/QualifiedTypeConflict.kt b/idea/testData/copyPaste/imports/QualifiedTypeConflict.kt new file mode 100644 index 00000000000..58b8e5e01f5 --- /dev/null +++ b/idea/testData/copyPaste/imports/QualifiedTypeConflict.kt @@ -0,0 +1,9 @@ +package a + +class A { + class B { + } +} + +fun f(p: 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 new file mode 100644 index 00000000000..6da4a2600e8 --- /dev/null +++ b/idea/testData/copyPaste/imports/QualifiedTypeConflict.to.kt @@ -0,0 +1,8 @@ +package to + +class A { + class B { + } +} + + \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ReferencedElementAlsoCopied.expected.kt b/idea/testData/copyPaste/imports/ReferencedElementAlsoCopied.expected.kt new file mode 100644 index 00000000000..19a4995e166 --- /dev/null +++ b/idea/testData/copyPaste/imports/ReferencedElementAlsoCopied.expected.kt @@ -0,0 +1,31 @@ +package to + +trait T + +class A(i: Int) {} + +val c = 0 + +fun g(a: A) {} + +fun A.ext() + +object O1 { + fun f() { + } +} + +object O2 { +} + +class ClassObject { + class object { + } +} + +fun f(a: A, t: T) { + g(A(c).ext()) + O1.f() + O2 + ClassObject +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ReferencedElementAlsoCopied.kt b/idea/testData/copyPaste/imports/ReferencedElementAlsoCopied.kt new file mode 100644 index 00000000000..5ae0387cb27 --- /dev/null +++ b/idea/testData/copyPaste/imports/ReferencedElementAlsoCopied.kt @@ -0,0 +1,31 @@ +package a + +trait T + +class A(i: Int) {} + +val c = 0 + +fun g(a: A) {} + +fun A.ext() + +object O1 { + fun f() { + } +} + +object O2 { +} + +class ClassObject { + class object { + } +} + +fun f(a: A, t: T) { + g(A(c).ext()) + O1.f() + O2 + ClassObject +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Super.expected.kt b/idea/testData/copyPaste/imports/Super.expected.kt new file mode 100644 index 00000000000..4efbdcfd2cd --- /dev/null +++ b/idea/testData/copyPaste/imports/Super.expected.kt @@ -0,0 +1,5 @@ +package to + +fun f() { + super.f() + 2 +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Super.kt b/idea/testData/copyPaste/imports/Super.kt new file mode 100644 index 00000000000..2ac48d9c16c --- /dev/null +++ b/idea/testData/copyPaste/imports/Super.kt @@ -0,0 +1,9 @@ +package a + +open class A { + open fun f(): Int = 3 +} + +class B(): A() { + override fun f() = super.f() + 2 +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Super.to.kt b/idea/testData/copyPaste/imports/Super.to.kt new file mode 100644 index 00000000000..2a83728d2eb --- /dev/null +++ b/idea/testData/copyPaste/imports/Super.to.kt @@ -0,0 +1,5 @@ +package to + +fun f() { + +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ThisReference.expected.kt b/idea/testData/copyPaste/imports/ThisReference.expected.kt new file mode 100644 index 00000000000..a8ca0993347 --- /dev/null +++ b/idea/testData/copyPaste/imports/ThisReference.expected.kt @@ -0,0 +1,7 @@ +package to + +class B { + fun f() { + this.f() + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ThisReference.kt b/idea/testData/copyPaste/imports/ThisReference.kt new file mode 100644 index 00000000000..079755f6085 --- /dev/null +++ b/idea/testData/copyPaste/imports/ThisReference.kt @@ -0,0 +1,7 @@ +package a + +class A { + fun f() { + this.f() + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ThisReference.to.kt b/idea/testData/copyPaste/imports/ThisReference.to.kt new file mode 100644 index 00000000000..cc60f6e0d0e --- /dev/null +++ b/idea/testData/copyPaste/imports/ThisReference.to.kt @@ -0,0 +1,7 @@ +package to + +class B { + fun f() { + + } +} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/TopLevelProperty.expected.kt b/idea/testData/copyPaste/imports/TopLevelProperty.expected.kt new file mode 100644 index 00000000000..f20e12c50d9 --- /dev/null +++ b/idea/testData/copyPaste/imports/TopLevelProperty.expected.kt @@ -0,0 +1,6 @@ +package to + +import a.c +import a.b + +fun f() = c + b \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/TopLevelProperty.kt b/idea/testData/copyPaste/imports/TopLevelProperty.kt new file mode 100644 index 00000000000..e1c2af8a4dd --- /dev/null +++ b/idea/testData/copyPaste/imports/TopLevelProperty.kt @@ -0,0 +1,6 @@ +package a + +val c: Int = 1 +var b: Int = 0 + +fun f() = c + b \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Trait.expected.kt b/idea/testData/copyPaste/imports/Trait.expected.kt new file mode 100644 index 00000000000..c9c7e9fc87d --- /dev/null +++ b/idea/testData/copyPaste/imports/Trait.expected.kt @@ -0,0 +1,5 @@ +package to + +import a.A + +class C(): A {} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/Trait.kt b/idea/testData/copyPaste/imports/Trait.kt new file mode 100644 index 00000000000..80d27f9d783 --- /dev/null +++ b/idea/testData/copyPaste/imports/Trait.kt @@ -0,0 +1,5 @@ +package a + +trait A + +class C(): A {} \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/TypeParameter.expected.kt b/idea/testData/copyPaste/imports/TypeParameter.expected.kt new file mode 100644 index 00000000000..69fc0f8c9f1 --- /dev/null +++ b/idea/testData/copyPaste/imports/TypeParameter.expected.kt @@ -0,0 +1,6 @@ +package to + +import a.T +import a.A + +fun f(): T \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/TypeParameter.kt b/idea/testData/copyPaste/imports/TypeParameter.kt new file mode 100644 index 00000000000..189d4349e56 --- /dev/null +++ b/idea/testData/copyPaste/imports/TypeParameter.kt @@ -0,0 +1,7 @@ +package a + +class A {} + +trait T + +fun f(): T diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractInsertImportOnPasteTest.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractInsertImportOnPasteTest.java new file mode 100644 index 00000000000..572c0277b45 --- /dev/null +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractInsertImportOnPasteTest.java @@ -0,0 +1,138 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.codeInsight; + +import com.intellij.codeInsight.CodeInsightSettings; +import com.intellij.openapi.actionSystem.IdeActions; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.io.FileUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.InTextDirectivesUtils; +import org.jetbrains.jet.analyzer.AnalyzeExhaust; +import org.jetbrains.jet.checkers.DebugInfoUtil; +import org.jetbrains.jet.lang.diagnostics.Diagnostic; +import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; +import org.jetbrains.jet.lang.diagnostics.Errors; +import org.jetbrains.jet.lang.diagnostics.rendering.DefaultErrorMessages; +import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.psi.JetReferenceExpression; +import org.jetbrains.jet.plugin.JetLightCodeInsightFixtureTestCase; +import org.jetbrains.jet.plugin.PluginTestCaseBase; +import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; + +import java.io.File; +import java.util.List; + +public abstract class AbstractInsertImportOnPasteTest extends JetLightCodeInsightFixtureTestCase { + private static final String BASE_PATH = PluginTestCaseBase.getTestDataPathBase() + "/copyPaste/imports"; + private static final String DEFAULT_TO_FILE_TEXT = "package to\n\n"; + private static final String ALLOW_UNRESOLVED_DIRECTIVE = "// ALLOW_UNRESOLVED"; + + private int savedState; + + @Override + protected void setUp() throws Exception { + super.setUp(); + savedState = CodeInsightSettings.getInstance().ADD_IMPORTS_ON_PASTE; + CodeInsightSettings.getInstance().ADD_IMPORTS_ON_PASTE = CodeInsightSettings.YES; + } + + @Override + protected void tearDown() throws Exception { + CodeInsightSettings.getInstance().ADD_IMPORTS_ON_PASTE = savedState; + super.tearDown(); + } + + public void doTestCut(String path) throws Exception { + doTestAction(IdeActions.ACTION_CUT, path); + } + + public void doTestCopy(String path) throws Exception { + doTestAction(IdeActions.ACTION_COPY, path); + } + + private void doTestAction(@NotNull String cutOrCopy, String path) throws Exception { + myFixture.setTestDataPath(BASE_PATH); + File testFile = new File(path); + String testFileName = testFile.getName(); + configureByDependencyIfExists(testFileName.replace(".kt", ".dependency.kt")); + configureByDependencyIfExists(testFileName.replace(".kt", ".dependency.java")); + myFixture.configureByFile(testFileName); + myFixture.performEditorAction(cutOrCopy); + String toFileName = testFileName.replace(".kt", ".to.kt"); + JetFile toFile = configureToFile(toFileName); + myFixture.performEditorAction(IdeActions.ACTION_PASTE); + myFixture.checkResultByFile(testFileName.replace(".kt", ".expected.kt")); + if (!InTextDirectivesUtils.isDirectiveDefined(FileUtil.loadFile(testFile), ALLOW_UNRESOLVED_DIRECTIVE)) { + checkNoUnresolvedReferences(toFile); + } + } + + @NotNull + private JetFile configureToFile(@NotNull String toFileName) { + if (new File(BASE_PATH + "/" + toFileName).exists()) { + return (JetFile) myFixture.configureByFile(toFileName); + } + else { + return (JetFile) myFixture.configureByText(toFileName, DEFAULT_TO_FILE_TEXT); + } + } + + private static void checkNoUnresolvedReferences(@NotNull final JetFile file) { + AnalyzeExhaust exhaust = AnalyzerFacadeWithCache.analyzeFileWithCache(file); + for (Diagnostic diagnostic : exhaust.getBindingContext().getDiagnostics()) { + if (Errors.UNRESOLVED_REFERENCE_DIAGNOSTICS.contains(diagnostic.getFactory())) { + List textRanges = diagnostic.getTextRanges(); + String diagnosticText = DefaultErrorMessages.RENDERER.render(diagnostic); + if (diagnostic.getPsiFile() == file) { + fail(diagnostic.getFactory().getName() + ": " + diagnosticText + " " + + DiagnosticUtils.atLocation(file, textRanges.get(0))); + } + } + } + DebugInfoUtil.markDebugAnnotations(file, exhaust.getBindingContext(), new DebugInfoUtil.DebugInfoReporter() { + @Override + public void reportElementWithErrorType(@NotNull JetReferenceExpression expression) { + //do nothing + } + + @Override + public void reportMissingUnresolved(@NotNull JetReferenceExpression expression) { + // this may happen if incorrect psi transformations are done + fail(expression.getText() + " is unresolved but not marked " + DiagnosticUtils.atLocation(file, expression.getTextRange())); + } + + @Override + public void reportUnresolvedWithTarget( + @NotNull JetReferenceExpression expression, @NotNull String target + ) { + //do nothing + } + }); + } + + private void configureByDependencyIfExists(@NotNull String dependencyFileName) { + if (new File(BASE_PATH + "/" + dependencyFileName).exists()) { + myFixture.configureByFile(dependencyFileName); + } + } + + @Override + protected String getTestDataPath() { + return BASE_PATH; + } +} diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/InsertImportOnPasteTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/InsertImportOnPasteTestGenerated.java new file mode 100644 index 00000000000..3a6113112c8 --- /dev/null +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/InsertImportOnPasteTestGenerated.java @@ -0,0 +1,597 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.codeInsight; + +import junit.framework.Assert; +import junit.framework.Test; +import junit.framework.TestSuite; + +import java.io.File; +import java.util.regex.Pattern; +import org.jetbrains.jet.JetTestUtils; +import org.jetbrains.jet.test.InnerTestClasses; +import org.jetbrains.jet.test.TestMetadata; + +import org.jetbrains.jet.plugin.codeInsight.AbstractInsertImportOnPasteTest; + +/** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@InnerTestClasses({InsertImportOnPasteTestGenerated.Copy.class, InsertImportOnPasteTestGenerated.Cut.class}) +public class InsertImportOnPasteTestGenerated extends AbstractInsertImportOnPasteTest { + @TestMetadata("idea/testData/copyPaste/imports") + public static class Copy extends AbstractInsertImportOnPasteTest { + public void testAllFilesPresentInCopy() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/copyPaste/imports"), Pattern.compile("^([^\\.]+)\\.kt$"), false); + } + + @TestMetadata("AlreadyImportedViaStar.kt") + public void testAlreadyImportedViaStar() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/AlreadyImportedViaStar.kt"); + } + + @TestMetadata("ClassAlreadyImported.kt") + public void testClassAlreadyImported() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ClassAlreadyImported.kt"); + } + + @TestMetadata("ClassMember.kt") + public void testClassMember() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ClassMember.kt"); + } + + @TestMetadata("ClassObject.kt") + public void testClassObject() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ClassObject.kt"); + } + + @TestMetadata("ClassObjectFunInsideClass.kt") + public void testClassObjectFunInsideClass() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ClassObjectFunInsideClass.kt"); + } + + @TestMetadata("ClassObjectInner.kt") + public void testClassObjectInner() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ClassObjectInner.kt"); + } + + @TestMetadata("ClassResolvedToPackage.kt") + public void testClassResolvedToPackage() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ClassResolvedToPackage.kt"); + } + + @TestMetadata("ClassType.kt") + public void testClassType() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ClassType.kt"); + } + + @TestMetadata("Conflict.kt") + public void testConflict() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/Conflict.kt"); + } + + @TestMetadata("ConflictForTypeWithTypeParameter.kt") + public void testConflictForTypeWithTypeParameter() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.kt"); + } + + @TestMetadata("ConflictWithClass.kt") + public void testConflictWithClass() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ConflictWithClass.kt"); + } + + @TestMetadata("ConflictWithFun.kt") + public void testConflictWithFun() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ConflictWithFun.kt"); + } + + @TestMetadata("Constructor.kt") + public void testConstructor() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/Constructor.kt"); + } + + @TestMetadata("DeepInnerClasses.kt") + public void testDeepInnerClasses() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/DeepInnerClasses.kt"); + } + + @TestMetadata("DefaultPackage.kt") + public void testDefaultPackage() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/DefaultPackage.kt"); + } + + @TestMetadata("DelegatedProperty.kt") + public void testDelegatedProperty() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/DelegatedProperty.kt"); + } + + @TestMetadata("DependencyOnJava.kt") + public void testDependencyOnJava() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/DependencyOnJava.kt"); + } + + @TestMetadata("DependencyOnKotlinLibrary.kt") + public void testDependencyOnKotlinLibrary() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/DependencyOnKotlinLibrary.kt"); + } + + @TestMetadata("DependencyOnStdLib.kt") + public void testDependencyOnStdLib() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/DependencyOnStdLib.kt"); + } + + @TestMetadata("EnumEntries.kt") + public void testEnumEntries() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/EnumEntries.kt"); + } + + @TestMetadata("Extension.kt") + public void testExtension() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/Extension.kt"); + } + + @TestMetadata("ExtensionAsInfixOrOperator.kt") + public void testExtensionAsInfixOrOperator() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ExtensionAsInfixOrOperator.kt"); + } + + @TestMetadata("ExtensionCannotBeImportedOrLengthened.kt") + public void testExtensionCannotBeImportedOrLengthened() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.kt"); + } + + @TestMetadata("ExtensionConflict.kt") + public void testExtensionConflict() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ExtensionConflict.kt"); + } + + @TestMetadata("ForLoop.kt") + public void testForLoop() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ForLoop.kt"); + } + + @TestMetadata("FullyQualified.kt") + public void testFullyQualified() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/FullyQualified.kt"); + } + + @TestMetadata("Function.kt") + public void testFunction() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/Function.kt"); + } + + @TestMetadata("FunctionAlreadyImported.kt") + public void testFunctionAlreadyImported() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/FunctionAlreadyImported.kt"); + } + + @TestMetadata("FunctionParameter.kt") + public void testFunctionParameter() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/FunctionParameter.kt"); + } + + @TestMetadata("GetExpression.kt") + public void testGetExpression() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/GetExpression.kt"); + } + + @TestMetadata("ImportDependency.kt") + public void testImportDependency() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ImportDependency.kt"); + } + + @TestMetadata("ImportDirective.kt") + public void testImportDirective() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ImportDirective.kt"); + } + + @TestMetadata("ImportableEntityInExtensionLiteral.kt") + public void testImportableEntityInExtensionLiteral() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ImportableEntityInExtensionLiteral.kt"); + } + + @TestMetadata("ImportedElementCopied.kt") + public void testImportedElementCopied() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ImportedElementCopied.kt"); + } + + @TestMetadata("Inner.kt") + public void testInner() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/Inner.kt"); + } + + @TestMetadata("Invoke.kt") + public void testInvoke() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/Invoke.kt"); + } + + @TestMetadata("JavaStaticViaClass.kt") + public void testJavaStaticViaClass() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/JavaStaticViaClass.kt"); + } + + @TestMetadata("Local.kt") + public void testLocal() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/Local.kt"); + } + + @TestMetadata("MultiReferencePartiallyCopied.kt") + public void testMultiReferencePartiallyCopied() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/MultiReferencePartiallyCopied.kt"); + } + + @TestMetadata("NoImportForBuiltIns.kt") + public void testNoImportForBuiltIns() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/NoImportForBuiltIns.kt"); + } + + @TestMetadata("NoImportForSamePackage.kt") + public void testNoImportForSamePackage() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/NoImportForSamePackage.kt"); + } + + @TestMetadata("NotReferencePosition.kt") + public void testNotReferencePosition() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/NotReferencePosition.kt"); + } + + @TestMetadata("NotReferencePosition2.kt") + public void testNotReferencePosition2() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/NotReferencePosition2.kt"); + } + + @TestMetadata("Object.kt") + public void testObject() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/Object.kt"); + } + + @TestMetadata("PackageView.kt") + public void testPackageView() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/PackageView.kt"); + } + + @TestMetadata("PartiallyQualified.kt") + public void testPartiallyQualified() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/PartiallyQualified.kt"); + } + + @TestMetadata("PropertyResolvedToPackage.kt") + public void testPropertyResolvedToPackage() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/PropertyResolvedToPackage.kt"); + } + + @TestMetadata("QualifiedTypeConflict.kt") + public void testQualifiedTypeConflict() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/QualifiedTypeConflict.kt"); + } + + @TestMetadata("ReferencedElementAlsoCopied.kt") + public void testReferencedElementAlsoCopied() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ReferencedElementAlsoCopied.kt"); + } + + @TestMetadata("Super.kt") + public void testSuper() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/Super.kt"); + } + + @TestMetadata("ThisReference.kt") + public void testThisReference() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/ThisReference.kt"); + } + + @TestMetadata("TopLevelProperty.kt") + public void testTopLevelProperty() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/TopLevelProperty.kt"); + } + + @TestMetadata("Trait.kt") + public void testTrait() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/Trait.kt"); + } + + @TestMetadata("TypeParameter.kt") + public void testTypeParameter() throws Exception { + doTestCopy("idea/testData/copyPaste/imports/TypeParameter.kt"); + } + + } + + @TestMetadata("idea/testData/copyPaste/imports") + public static class Cut extends AbstractInsertImportOnPasteTest { + public void testAllFilesPresentInCut() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/copyPaste/imports"), Pattern.compile("^([^\\.]+)\\.kt$"), false); + } + + @TestMetadata("AlreadyImportedViaStar.kt") + public void testAlreadyImportedViaStar() throws Exception { + doTestCut("idea/testData/copyPaste/imports/AlreadyImportedViaStar.kt"); + } + + @TestMetadata("ClassAlreadyImported.kt") + public void testClassAlreadyImported() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ClassAlreadyImported.kt"); + } + + @TestMetadata("ClassMember.kt") + public void testClassMember() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ClassMember.kt"); + } + + @TestMetadata("ClassObject.kt") + public void testClassObject() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ClassObject.kt"); + } + + @TestMetadata("ClassObjectFunInsideClass.kt") + public void testClassObjectFunInsideClass() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ClassObjectFunInsideClass.kt"); + } + + @TestMetadata("ClassObjectInner.kt") + public void testClassObjectInner() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ClassObjectInner.kt"); + } + + @TestMetadata("ClassResolvedToPackage.kt") + public void testClassResolvedToPackage() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ClassResolvedToPackage.kt"); + } + + @TestMetadata("ClassType.kt") + public void testClassType() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ClassType.kt"); + } + + @TestMetadata("Conflict.kt") + public void testConflict() throws Exception { + doTestCut("idea/testData/copyPaste/imports/Conflict.kt"); + } + + @TestMetadata("ConflictForTypeWithTypeParameter.kt") + public void testConflictForTypeWithTypeParameter() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ConflictForTypeWithTypeParameter.kt"); + } + + @TestMetadata("ConflictWithClass.kt") + public void testConflictWithClass() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ConflictWithClass.kt"); + } + + @TestMetadata("ConflictWithFun.kt") + public void testConflictWithFun() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ConflictWithFun.kt"); + } + + @TestMetadata("Constructor.kt") + public void testConstructor() throws Exception { + doTestCut("idea/testData/copyPaste/imports/Constructor.kt"); + } + + @TestMetadata("DeepInnerClasses.kt") + public void testDeepInnerClasses() throws Exception { + doTestCut("idea/testData/copyPaste/imports/DeepInnerClasses.kt"); + } + + @TestMetadata("DefaultPackage.kt") + public void testDefaultPackage() throws Exception { + doTestCut("idea/testData/copyPaste/imports/DefaultPackage.kt"); + } + + @TestMetadata("DelegatedProperty.kt") + public void testDelegatedProperty() throws Exception { + doTestCut("idea/testData/copyPaste/imports/DelegatedProperty.kt"); + } + + @TestMetadata("DependencyOnJava.kt") + public void testDependencyOnJava() throws Exception { + doTestCut("idea/testData/copyPaste/imports/DependencyOnJava.kt"); + } + + @TestMetadata("DependencyOnKotlinLibrary.kt") + public void testDependencyOnKotlinLibrary() throws Exception { + doTestCut("idea/testData/copyPaste/imports/DependencyOnKotlinLibrary.kt"); + } + + @TestMetadata("DependencyOnStdLib.kt") + public void testDependencyOnStdLib() throws Exception { + doTestCut("idea/testData/copyPaste/imports/DependencyOnStdLib.kt"); + } + + @TestMetadata("EnumEntries.kt") + public void testEnumEntries() throws Exception { + doTestCut("idea/testData/copyPaste/imports/EnumEntries.kt"); + } + + @TestMetadata("Extension.kt") + public void testExtension() throws Exception { + doTestCut("idea/testData/copyPaste/imports/Extension.kt"); + } + + @TestMetadata("ExtensionAsInfixOrOperator.kt") + public void testExtensionAsInfixOrOperator() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ExtensionAsInfixOrOperator.kt"); + } + + @TestMetadata("ExtensionCannotBeImportedOrLengthened.kt") + public void testExtensionCannotBeImportedOrLengthened() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ExtensionCannotBeImportedOrLengthened.kt"); + } + + @TestMetadata("ExtensionConflict.kt") + public void testExtensionConflict() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ExtensionConflict.kt"); + } + + @TestMetadata("ForLoop.kt") + public void testForLoop() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ForLoop.kt"); + } + + @TestMetadata("FullyQualified.kt") + public void testFullyQualified() throws Exception { + doTestCut("idea/testData/copyPaste/imports/FullyQualified.kt"); + } + + @TestMetadata("Function.kt") + public void testFunction() throws Exception { + doTestCut("idea/testData/copyPaste/imports/Function.kt"); + } + + @TestMetadata("FunctionAlreadyImported.kt") + public void testFunctionAlreadyImported() throws Exception { + doTestCut("idea/testData/copyPaste/imports/FunctionAlreadyImported.kt"); + } + + @TestMetadata("FunctionParameter.kt") + public void testFunctionParameter() throws Exception { + doTestCut("idea/testData/copyPaste/imports/FunctionParameter.kt"); + } + + @TestMetadata("GetExpression.kt") + public void testGetExpression() throws Exception { + doTestCut("idea/testData/copyPaste/imports/GetExpression.kt"); + } + + @TestMetadata("ImportDependency.kt") + public void testImportDependency() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ImportDependency.kt"); + } + + @TestMetadata("ImportDirective.kt") + public void testImportDirective() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ImportDirective.kt"); + } + + @TestMetadata("ImportableEntityInExtensionLiteral.kt") + public void testImportableEntityInExtensionLiteral() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ImportableEntityInExtensionLiteral.kt"); + } + + @TestMetadata("ImportedElementCopied.kt") + public void testImportedElementCopied() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ImportedElementCopied.kt"); + } + + @TestMetadata("Inner.kt") + public void testInner() throws Exception { + doTestCut("idea/testData/copyPaste/imports/Inner.kt"); + } + + @TestMetadata("Invoke.kt") + public void testInvoke() throws Exception { + doTestCut("idea/testData/copyPaste/imports/Invoke.kt"); + } + + @TestMetadata("JavaStaticViaClass.kt") + public void testJavaStaticViaClass() throws Exception { + doTestCut("idea/testData/copyPaste/imports/JavaStaticViaClass.kt"); + } + + @TestMetadata("Local.kt") + public void testLocal() throws Exception { + doTestCut("idea/testData/copyPaste/imports/Local.kt"); + } + + @TestMetadata("MultiReferencePartiallyCopied.kt") + public void testMultiReferencePartiallyCopied() throws Exception { + doTestCut("idea/testData/copyPaste/imports/MultiReferencePartiallyCopied.kt"); + } + + @TestMetadata("NoImportForBuiltIns.kt") + public void testNoImportForBuiltIns() throws Exception { + doTestCut("idea/testData/copyPaste/imports/NoImportForBuiltIns.kt"); + } + + @TestMetadata("NoImportForSamePackage.kt") + public void testNoImportForSamePackage() throws Exception { + doTestCut("idea/testData/copyPaste/imports/NoImportForSamePackage.kt"); + } + + @TestMetadata("NotReferencePosition.kt") + public void testNotReferencePosition() throws Exception { + doTestCut("idea/testData/copyPaste/imports/NotReferencePosition.kt"); + } + + @TestMetadata("NotReferencePosition2.kt") + public void testNotReferencePosition2() throws Exception { + doTestCut("idea/testData/copyPaste/imports/NotReferencePosition2.kt"); + } + + @TestMetadata("Object.kt") + public void testObject() throws Exception { + doTestCut("idea/testData/copyPaste/imports/Object.kt"); + } + + @TestMetadata("PackageView.kt") + public void testPackageView() throws Exception { + doTestCut("idea/testData/copyPaste/imports/PackageView.kt"); + } + + @TestMetadata("PartiallyQualified.kt") + public void testPartiallyQualified() throws Exception { + doTestCut("idea/testData/copyPaste/imports/PartiallyQualified.kt"); + } + + @TestMetadata("PropertyResolvedToPackage.kt") + public void testPropertyResolvedToPackage() throws Exception { + doTestCut("idea/testData/copyPaste/imports/PropertyResolvedToPackage.kt"); + } + + @TestMetadata("QualifiedTypeConflict.kt") + public void testQualifiedTypeConflict() throws Exception { + doTestCut("idea/testData/copyPaste/imports/QualifiedTypeConflict.kt"); + } + + @TestMetadata("ReferencedElementAlsoCopied.kt") + public void testReferencedElementAlsoCopied() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ReferencedElementAlsoCopied.kt"); + } + + @TestMetadata("Super.kt") + public void testSuper() throws Exception { + doTestCut("idea/testData/copyPaste/imports/Super.kt"); + } + + @TestMetadata("ThisReference.kt") + public void testThisReference() throws Exception { + doTestCut("idea/testData/copyPaste/imports/ThisReference.kt"); + } + + @TestMetadata("TopLevelProperty.kt") + public void testTopLevelProperty() throws Exception { + doTestCut("idea/testData/copyPaste/imports/TopLevelProperty.kt"); + } + + @TestMetadata("Trait.kt") + public void testTrait() throws Exception { + doTestCut("idea/testData/copyPaste/imports/Trait.kt"); + } + + @TestMetadata("TypeParameter.kt") + public void testTypeParameter() throws Exception { + doTestCut("idea/testData/copyPaste/imports/TypeParameter.kt"); + } + + } + + public static Test suite() { + TestSuite suite = new TestSuite("InsertImportOnPasteTestGenerated"); + suite.addTestSuite(Copy.class); + suite.addTestSuite(Cut.class); + return suite; + } +}