diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt index dc1670111a4..7c5a5257d3f 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt @@ -153,7 +153,8 @@ abstract class CompletionSession( searchScope, filter, filterOutPrivate = !mayIncludeInaccessible, - declarationTranslator = { toFromOriginalFileMapper.toSyntheticFile(it) }) + declarationTranslator = { toFromOriginalFileMapper.toSyntheticFile(it) }, + file = file) } private fun isVisibleDescriptor(descriptor: DeclarationDescriptor, completeNonAccessible: Boolean): Boolean { @@ -169,7 +170,7 @@ abstract class CompletionSession( return completeNonAccessible && (!descriptor.isFromLibrary() || isDebuggerContext) } - if (descriptor.isExcludedFromAutoImport(project)) return false + if (descriptor.isExcludedFromAutoImport(project, file)) return false return true } diff --git a/idea/idea-completion/testData/basic/java/CompletionForExcludedWhenInternalUse.kt b/idea/idea-completion/testData/basic/java/CompletionForExcludedWhenInternalUse.kt new file mode 100644 index 00000000000..97445bbb299 --- /dev/null +++ b/idea/idea-completion/testData/basic/java/CompletionForExcludedWhenInternalUse.kt @@ -0,0 +1,7 @@ +package kotlin + +fun some() { + kotlin.jvm. +} + +// EXIST: internal \ No newline at end of file diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java index 83510bd5291..51c3f27d2a7 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java @@ -2789,6 +2789,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } + @TestMetadata("CompletionForExcludedWhenInternalUse.kt") + public void testCompletionForExcludedWhenInternalUse() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/java/CompletionForExcludedWhenInternalUse.kt"); + doTest(fileName); + } + @TestMetadata("ExtensionFromStandardLibrary.kt") public void testExtensionFromStandardLibrary() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/java/ExtensionFromStandardLibrary.kt"); diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt index 9801489409b..4cd2e804af9 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt @@ -58,7 +58,8 @@ class KotlinIndicesHelper( visibilityFilter: (DeclarationDescriptor) -> Boolean, private val declarationTranslator: (KtDeclaration) -> KtDeclaration? = { it }, applyExcludeSettings: Boolean = true, - private val filterOutPrivate: Boolean = true + private val filterOutPrivate: Boolean = true, + private val file: KtFile? = null ) { private val moduleDescriptor = resolutionFacade.moduleDescriptor @@ -68,7 +69,7 @@ class KotlinIndicesHelper( private val descriptorFilter: (DeclarationDescriptor) -> Boolean = filter@ { if (it.isHiddenInResolution(resolutionFacade.frontendService())) return@filter false if (!visibilityFilter(it)) return@filter false - if (applyExcludeSettings && it.isExcludedFromAutoImport(project)) return@filter false + if (applyExcludeSettings && it.isExcludedFromAutoImport(project, file)) return@filter false true } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/excludedFromImportsAndCompletion.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/excludedFromImportsAndCompletion.kt index 69835cff703..80842e7ef77 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/excludedFromImportsAndCompletion.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/excludedFromImportsAndCompletion.kt @@ -20,6 +20,7 @@ import com.intellij.codeInsight.JavaProjectCodeInsightSettings import com.intellij.openapi.project.Project import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.idea.imports.importableFqName +import org.jetbrains.kotlin.psi.KtFile private val exclusions = @@ -30,10 +31,12 @@ private val exclusions = "kotlin.reflect.jvm.internal" ) -private fun shouldBeHiddenAsInternalImplementationDetail(fqName: String) = exclusions.any { fqName.startsWith(it) } +private fun shouldBeHiddenAsInternalImplementationDetail(fqName: String, locationFqName: String) = + exclusions.any { fqName.startsWith(it) } + && (locationFqName.isBlank() || !fqName.startsWith(locationFqName)) -fun DeclarationDescriptor.isExcludedFromAutoImport(project: Project): Boolean { +fun DeclarationDescriptor.isExcludedFromAutoImport(project: Project, inFile: KtFile?): Boolean { val fqName = importableFqName?.asString() ?: return false return JavaProjectCodeInsightSettings.getSettings(project).isExcluded(fqName) || - shouldBeHiddenAsInternalImplementationDetail(fqName) + shouldBeHiddenAsInternalImplementationDetail(fqName, inFile?.packageFqName?.asString() ?: "") } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt index 69455898198..7f57ddc4c34 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt @@ -175,7 +175,7 @@ internal abstract class ImportFixBase protected constructor( return true } - val indicesHelper = KotlinIndicesHelper(resolutionFacade, searchScope, ::isVisible) + val indicesHelper = KotlinIndicesHelper(resolutionFacade, searchScope, ::isVisible, file = file) var result = fillCandidates(nameStr, callTypeAndReceiver, bindingContext, indicesHelper) diff --git a/idea/testData/quickfix/autoImports/notExcludedFromImportWhenInternalUse.kt b/idea/testData/quickfix/autoImports/notExcludedFromImportWhenInternalUse.kt new file mode 100644 index 00000000000..387afd586cf --- /dev/null +++ b/idea/testData/quickfix/autoImports/notExcludedFromImportWhenInternalUse.kt @@ -0,0 +1,14 @@ +// "Import" "true" +// WITH_RUNTIME +// ACTION: Create local variable 'FunctionReference' +// ACTION: Create object 'FunctionReference' +// ACTION: Create parameter 'FunctionReference' +// ACTION: Create property 'FunctionReference' +// ACTION: Introduce local variable +// ACTION: Rename reference + +package kotlin + +fun some() { + FunctionReference::class +} \ No newline at end of file diff --git a/idea/testData/quickfix/autoImports/notExcludedFromImportWhenInternalUse.kt.after b/idea/testData/quickfix/autoImports/notExcludedFromImportWhenInternalUse.kt.after new file mode 100644 index 00000000000..b980fe9dd6e --- /dev/null +++ b/idea/testData/quickfix/autoImports/notExcludedFromImportWhenInternalUse.kt.after @@ -0,0 +1,16 @@ +// "Import" "true" +// WITH_RUNTIME +// ACTION: Create local variable 'FunctionReference' +// ACTION: Create object 'FunctionReference' +// ACTION: Create parameter 'FunctionReference' +// ACTION: Create property 'FunctionReference' +// ACTION: Introduce local variable +// ACTION: Rename reference + +package kotlin + +import kotlin.jvm.internal.FunctionReference + +fun some() { + FunctionReference::class +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 7c82afeca97..6926dd74f61 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -824,6 +824,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("notExcludedFromImportWhenInternalUse.kt") + public void testNotExcludedFromImportWhenInternalUse() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/autoImports/notExcludedFromImportWhenInternalUse.kt"); + doTest(fileName); + } + @TestMetadata("notForThisLabel.kt") public void testNotForThisLabel() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/autoImports/notForThisLabel.kt");