diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index 03e5e6e629e..6b8b8104433 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.generators.tests import org.jetbrains.kotlin.AbstractDataFlowValueRenderingTest import org.jetbrains.kotlin.addImport.AbstractAddImportTest +import org.jetbrains.kotlin.addImportAlias.AbstractAddImportAliasTest import org.jetbrains.kotlin.allopen.AbstractBytecodeListingTestForAllOpen import org.jetbrains.kotlin.android.parcel.AbstractParcelBytecodeListingTest import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidBoxTest @@ -692,6 +693,10 @@ fun main(args: Array) { model("addImport", pattern = KT_WITHOUT_DOTS_IN_NAME) } + testClass { + model("addImportAlias", pattern = KT_WITHOUT_DOTS_IN_NAME) + } + testClass { model("smartSelection", testMethod = "doTestSmartSelection", pattern = KT_WITHOUT_DOTS_IN_NAME) } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt index ecd09b6ae0d..351a62021b6 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt @@ -117,7 +117,11 @@ fun PsiReference.matchesTarget(candidateTarget: PsiElement): Boolean { val importedFqName = importDirective.importedFqName ?: return false val importedDescriptors = importDirective.containingKtFile.resolveImportReference(importedFqName) val importableTargets = unwrappedTargets.mapNotNull { - if (it is KtConstructor<*>) it.containingClassOrObject else it + when { + it is KtConstructor<*> -> it.containingClassOrObject + it is PsiMethod && it.isConstructor -> it.containingClass + else -> it + } } val project = element.project diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceImportAlias/KotlinIntroduceImportAliasHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceImportAlias/KotlinIntroduceImportAliasHandler.kt index c566062bd55..460937dc193 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceImportAlias/KotlinIntroduceImportAliasHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceImportAlias/KotlinIntroduceImportAliasHandler.kt @@ -6,13 +6,13 @@ package org.jetbrains.kotlin.idea.refactoring.introduce.introduceImportAlias import com.intellij.openapi.actionSystem.DataContext -import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.* import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.refactoring.RefactoringActionHandler import com.intellij.refactoring.rename.inplace.VariableInplaceRenamer +import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference import org.jetbrains.kotlin.idea.core.KotlinNameSuggester @@ -44,6 +44,9 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs object KotlinIntroduceImportAliasHandler : RefactoringActionHandler { const val REFACTORING_NAME = "Introduce Import Alias" + @get:TestOnly + var suggestedImportAliasNames: Collection = emptyList() + fun doRefactoring(project: Project, editor: Editor, element: KtNameReferenceExpression) { val fqName = element.resolveMainReferenceToDescriptors().firstOrNull()?.importableFqName ?: return val file = element.containingKtFile @@ -82,6 +85,7 @@ object KotlinIntroduceImportAliasHandler : RefactoringActionHandler { val suggestionsName = KotlinNameSuggester.suggestNamesByFqName(fqName, validator = validator) val newName = suggestionsName.first() + suggestedImportAliasNames = suggestionsName val newDirective = ImportInsertHelperImpl.addImport(project, file, fqName, false, Name.identifier(newName)) replaceUsages(usages, newName) @@ -89,9 +93,7 @@ object KotlinIntroduceImportAliasHandler : RefactoringActionHandler { if (elementInImportDirective) editor.moveCaret(newDirective.alias?.nameIdentifier?.textOffset ?: newDirective.endOffset) - if (!ApplicationManager.getApplication().isUnitTestMode) { - invokeRename(project, editor, newDirective.alias, suggestionsName) - } + invokeRename(project, editor, newDirective.alias, suggestionsName) } override fun invoke(project: Project, editor: Editor, file: PsiFile, dataContext: DataContext?) { diff --git a/idea/testData/addImportAlias/JavaAlias.expected.names b/idea/testData/addImportAlias/JavaAlias.expected.names new file mode 100644 index 00000000000..5543e138c1c --- /dev/null +++ b/idea/testData/addImportAlias/JavaAlias.expected.names @@ -0,0 +1,3 @@ +HashMap1 +UtilHashMap +JavaUtilHashMap \ No newline at end of file diff --git a/idea/testData/addImportAlias/JavaAlias.kt b/idea/testData/addImportAlias/JavaAlias.kt new file mode 100644 index 00000000000..7f1aa6b39c2 --- /dev/null +++ b/idea/testData/addImportAlias/JavaAlias.kt @@ -0,0 +1,5 @@ +import java.util.HashMap + +fun x() { + val list = HashMap() +} \ No newline at end of file diff --git a/idea/testData/addImportAlias/JavaAlias.kt.after b/idea/testData/addImportAlias/JavaAlias.kt.after new file mode 100644 index 00000000000..ade17b25955 --- /dev/null +++ b/idea/testData/addImportAlias/JavaAlias.kt.after @@ -0,0 +1,5 @@ +import java.util.HashMap as HashMap1 + +fun x() { + val list = HashMap1() +} \ No newline at end of file diff --git a/idea/testData/addImportAlias/SimpleAlias.dependency1.kt b/idea/testData/addImportAlias/SimpleAlias.dependency1.kt new file mode 100644 index 00000000000..9c5caee212c --- /dev/null +++ b/idea/testData/addImportAlias/SimpleAlias.dependency1.kt @@ -0,0 +1,5 @@ +package foo + +class Some { + +} \ No newline at end of file diff --git a/idea/testData/addImportAlias/SimpleAlias.expected.names b/idea/testData/addImportAlias/SimpleAlias.expected.names new file mode 100644 index 00000000000..514400c78ec --- /dev/null +++ b/idea/testData/addImportAlias/SimpleAlias.expected.names @@ -0,0 +1,2 @@ +Some1 +FooSome \ No newline at end of file diff --git a/idea/testData/addImportAlias/SimpleAlias.kt b/idea/testData/addImportAlias/SimpleAlias.kt new file mode 100644 index 00000000000..a49fdeeb158 --- /dev/null +++ b/idea/testData/addImportAlias/SimpleAlias.kt @@ -0,0 +1,3 @@ +import foo.Some + +val some = Some() \ No newline at end of file diff --git a/idea/testData/addImportAlias/SimpleAlias.kt.after b/idea/testData/addImportAlias/SimpleAlias.kt.after new file mode 100644 index 00000000000..f90ed5424c0 --- /dev/null +++ b/idea/testData/addImportAlias/SimpleAlias.kt.after @@ -0,0 +1,3 @@ +import foo.Some as Some1 + +val some = Some1() \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/addImportAlias/AbstractAddImportAliasTest.kt b/idea/tests/org/jetbrains/kotlin/addImportAlias/AbstractAddImportAliasTest.kt new file mode 100644 index 00000000000..ab3e5e54f75 --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/addImportAlias/AbstractAddImportAliasTest.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.addImportAlias + +import org.jetbrains.kotlin.AbstractImportsTest +import org.jetbrains.kotlin.idea.core.util.range +import org.jetbrains.kotlin.idea.refactoring.introduce.introduceImportAlias.KotlinIntroduceImportAliasHandler +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtNameReferenceExpression +import org.jetbrains.kotlin.test.KotlinTestUtils +import org.jetbrains.kotlin.utils.sure + +abstract class AbstractAddImportAliasTest : AbstractImportsTest() { + override fun doTest(file: KtFile): String? { + val element = findNameReferenceExpression() + KotlinIntroduceImportAliasHandler.doRefactoring(project, editor, element) + + val importAliasNames = KotlinIntroduceImportAliasHandler.suggestedImportAliasNames.joinToString("\n") + KotlinTestUtils.assertEqualsToFile(testDataFile(fileName().replace(".kt", ".expected.names")), importAliasNames) + return null + } + + private fun findNameReferenceExpression(): KtNameReferenceExpression { + val offset = myFixture.caretOffset + var element = file.findElementAt(offset) + while (element != null) { + if (element is KtNameReferenceExpression || element is KtFile) break + if (offset !in element.range) break + element = element.parent + } + return (element as? KtNameReferenceExpression).sure { + "caret has to be placed at KtNameReferenceExpression, current position at $offset" + } + + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/addImportAlias/AddImportAliasTestGenerated.java b/idea/tests/org/jetbrains/kotlin/addImportAlias/AddImportAliasTestGenerated.java new file mode 100644 index 00000000000..01d86388d85 --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/addImportAlias/AddImportAliasTestGenerated.java @@ -0,0 +1,40 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.addImportAlias; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("idea/testData/addImportAlias") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class AddImportAliasTestGenerated extends AbstractAddImportAliasTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInAddImportAlias() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/addImportAlias"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @TestMetadata("JavaAlias.kt") + public void testJavaAlias() throws Exception { + runTest("idea/testData/addImportAlias/JavaAlias.kt"); + } + + @TestMetadata("SimpleAlias.kt") + public void testSimpleAlias() throws Exception { + runTest("idea/testData/addImportAlias/SimpleAlias.kt"); + } +}