diff --git a/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/imports/OptimizedImportsBuilder.kt b/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/imports/OptimizedImportsBuilder.kt index e739af9ea4bc..5edab35346d1 100644 --- a/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/imports/OptimizedImportsBuilder.kt +++ b/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/imports/OptimizedImportsBuilder.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtImportDirective +import org.jetbrains.kotlin.psi.KtUserType import org.jetbrains.kotlin.resolve.ImportPath internal fun KaSession.buildOptimizedImports( @@ -174,9 +175,16 @@ internal class OptimizedImportsBuilder( val alternativeSymbols = alternativeUsedReference?.run { resolveToReferencedSymbols() }.orEmpty() if (!areTargetsEqual(originalSymbols, alternativeSymbols)) { - val conflictingSymbols = originalSymbols + alternativeSymbols + val isTypePosition = originalReference.element.parent is KtUserType - for (conflictingSymbol in conflictingSymbols) { + val symbolsToLock = if (isTypePosition) { + originalSymbols + } else { + // TODO this can still lead to incorrect optimizations, see KTIJ-32231 + originalSymbols + alternativeSymbols + } + + for (conflictingSymbol in symbolsToLock) { lockImportForSymbol(conflictingSymbol.run { toSymbolInfo() }, names) } } diff --git a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/imports/K2JvmOptimizeImportsTestGenerated.java b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/imports/K2JvmOptimizeImportsTestGenerated.java index 14154e0c44c5..27ec61a50e8f 100644 --- a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/imports/K2JvmOptimizeImportsTestGenerated.java +++ b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/imports/K2JvmOptimizeImportsTestGenerated.java @@ -219,6 +219,16 @@ public abstract class K2JvmOptimizeImportsTestGenerated extends AbstractK2JvmOpt runTest("../../idea/tests/testData/editor/optimizeImports/jvm/FromCompanionObjectGeneric.kt"); } + @TestMetadata("JavaLangDeprecated_annotationPosition.kt") + public void testJavaLangDeprecated_annotationPosition() throws Exception { + runTest("../../idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_annotationPosition.kt"); + } + + @TestMetadata("JavaLangDeprecated_expressionPosition.kt") + public void testJavaLangDeprecated_expressionPosition() throws Exception { + runTest("../../idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_expressionPosition.kt"); + } + @TestMetadata("JavaStaticField.kt") public void testJavaStaticField() throws Exception { runTest("../../idea/tests/testData/editor/optimizeImports/jvm/JavaStaticField.kt"); diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/imports/AbstractOptimizeImportsTest.kt b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/imports/AbstractOptimizeImportsTest.kt index 3c74959156ce..e02a1ea5fd8e 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/imports/AbstractOptimizeImportsTest.kt +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/imports/AbstractOptimizeImportsTest.kt @@ -3,14 +3,23 @@ package org.jetbrains.kotlin.idea.imports import com.intellij.testFramework.LightProjectDescriptor -import junit.framework.TestCase import org.jetbrains.kotlin.AbstractImportsTest +import org.jetbrains.kotlin.idea.base.test.IgnoreTests import org.jetbrains.kotlin.idea.test.KotlinStdJSProjectDescriptor import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.idea.base.test.InTextDirectivesUtils abstract class AbstractOptimizeImportsTest : AbstractImportsTest() { + + override fun doTest(unused: String) { + IgnoreTests.runTestIfNotDisabledByFileDirective( + dataFile().toPath(), + IgnoreTests.DIRECTIVES.IGNORE_K1, + ".after", + test = { super.doTest(unused) } + ) + } + override fun doTest(file: KtFile): String { OptimizedImportsBuilder.testLog = StringBuilder() try { diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/imports/JvmOptimizeImportsTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/imports/JvmOptimizeImportsTestGenerated.java index 66c281766a43..7d40337f93a4 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/imports/JvmOptimizeImportsTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/imports/JvmOptimizeImportsTestGenerated.java @@ -219,6 +219,16 @@ public abstract class JvmOptimizeImportsTestGenerated extends AbstractJvmOptimiz runTest("testData/editor/optimizeImports/jvm/FromCompanionObjectGeneric.kt"); } + @TestMetadata("JavaLangDeprecated_annotationPosition.kt") + public void testJavaLangDeprecated_annotationPosition() throws Exception { + runTest("testData/editor/optimizeImports/jvm/JavaLangDeprecated_annotationPosition.kt"); + } + + @TestMetadata("JavaLangDeprecated_expressionPosition.kt") + public void testJavaLangDeprecated_expressionPosition() throws Exception { + runTest("testData/editor/optimizeImports/jvm/JavaLangDeprecated_expressionPosition.kt"); + } + @TestMetadata("JavaStaticField.kt") public void testJavaStaticField() throws Exception { runTest("testData/editor/optimizeImports/jvm/JavaStaticField.kt"); diff --git a/plugins/kotlin/idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_annotationPosition.kt b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_annotationPosition.kt new file mode 100644 index 000000000000..722e0a727546 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_annotationPosition.kt @@ -0,0 +1,11 @@ +package test + +import java.lang.Deprecated + +import kotlin.String +import kotlin.run + +@Deprecated +fun test(): String { + return run { "" } +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_annotationPosition.kt.after b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_annotationPosition.kt.after new file mode 100644 index 000000000000..57d7706dd1e3 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_annotationPosition.kt.after @@ -0,0 +1,8 @@ +package test + +import java.lang.Deprecated + +@Deprecated +fun test(): String { + return run { "" } +} diff --git a/plugins/kotlin/idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_annotationPosition.kt.log b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_annotationPosition.kt.log new file mode 100644 index 000000000000..e144f4925290 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_annotationPosition.kt.log @@ -0,0 +1,8 @@ +Additional checking of reference Getter: run +Additional checking of reference KtSimpleNameReference: run +Additional checking of reference KtInvokeFunctionReference: run { "" } +Changed resolve type of KtSimpleNameReference: Deprecated +Trying to build import list again with import rules: +java.lang.Deprecated +Additional checking of reference Getter: run +Additional checking of reference KtSimpleNameReference: run +Additional checking of reference KtInvokeFunctionReference: run { "" } diff --git a/plugins/kotlin/idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_expressionPosition.kt b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_expressionPosition.kt new file mode 100644 index 000000000000..2ca76ba9c796 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_expressionPosition.kt @@ -0,0 +1,14 @@ +// IGNORE_K1 +// IGNORE_K2 +// See KTIJ-32231 +package test + +import java.lang.Deprecated + +import kotlin.String +import kotlin.run + +fun test(): String { + Deprecated::class + return run { "" } +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_expressionPosition.kt.after b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_expressionPosition.kt.after new file mode 100644 index 000000000000..515c3bec2245 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/editor/optimizeImports/jvm/JavaLangDeprecated_expressionPosition.kt.after @@ -0,0 +1,11 @@ +// IGNORE_K1 +// IGNORE_K2 +// See KTIJ-32231 +package test + +import java.lang.Deprecated + +fun test(): String { + Deprecated::class + return run { "" } +} \ No newline at end of file