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 30dd6781474..dc1670111a4 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 @@ -158,7 +158,7 @@ abstract class CompletionSession( private fun isVisibleDescriptor(descriptor: DeclarationDescriptor, completeNonAccessible: Boolean): Boolean { if (!configuration.javaClassesNotToBeUsed && descriptor is ClassDescriptor) { - if (descriptor.importableFqName?.let { isJavaClassNotToBeUsedInKotlin(it) } == true) return false + if (descriptor.importableFqName?.let(::isJavaClassNotToBeUsedInKotlin) == true) return false } if (descriptor is TypeParameterDescriptor && !isTypeParameterVisible(descriptor)) return false @@ -169,6 +169,8 @@ abstract class CompletionSession( return completeNonAccessible && (!descriptor.isFromLibrary() || isDebuggerContext) } + if (descriptor.isExcludedFromAutoImport(project)) return false + return true } diff --git a/idea/idea-completion/testData/basic/common/NoCompletionForExcluded.kt b/idea/idea-completion/testData/basic/common/NoCompletionForExcluded.kt new file mode 100644 index 00000000000..89f4137c121 --- /dev/null +++ b/idea/idea-completion/testData/basic/common/NoCompletionForExcluded.kt @@ -0,0 +1,5 @@ +fun some() { + kotlin.jvm. +} + +// ABSENT: internal \ No newline at end of file diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java index 95092bea7cf..6b12b600704 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java @@ -572,6 +572,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } + @TestMetadata("NoCompletionForExcluded.kt") + public void testNoCompletionForExcluded() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/NoCompletionForExcluded.kt"); + doTest(fileName); + } + @TestMetadata("NoEmptyPackage.kt") public void testNoEmptyPackage() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/NoEmptyPackage.kt"); 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 0ef4624a714..0659225530f 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 @@ -572,6 +572,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } + @TestMetadata("NoCompletionForExcluded.kt") + public void testNoCompletionForExcluded() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/NoCompletionForExcluded.kt"); + doTest(fileName); + } + @TestMetadata("NoEmptyPackage.kt") public void testNoEmptyPackage() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/NoEmptyPackage.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 f1c70d4a51a..f3bf4b25adf 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 @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.idea.core -import com.intellij.codeInsight.JavaProjectCodeInsightSettings import com.intellij.openapi.progress.ProgressManager import com.intellij.psi.PsiFile import com.intellij.psi.PsiMember @@ -32,7 +31,6 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.KotlinShortNamesCache import org.jetbrains.kotlin.idea.caches.resolve.* import org.jetbrains.kotlin.idea.core.extension.KotlinIndicesHelperExtension -import org.jetbrains.kotlin.idea.imports.importableFqName import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.resolve.frontendService import org.jetbrains.kotlin.idea.search.excludeKotlinSources @@ -73,7 +71,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 && isExcludedFromAutoImport(it)) return@filter false + if (applyExcludeSettings && it.isExcludedFromAutoImport(project)) return@filter false true } @@ -429,11 +427,6 @@ class KotlinIndicesHelper( } } - private fun isExcludedFromAutoImport(descriptor: DeclarationDescriptor): Boolean { - val fqName = descriptor.importableFqName?.asString() ?: return false - return JavaProjectCodeInsightSettings.getSettings(project).isExcluded(fqName) - } - private inline fun KtNamedDeclaration.resolveToDescriptors(): Collection { return resolveToDescriptorsWithHack({ true }).filterIsInstance() } 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 new file mode 100644 index 00000000000..edbca5f9ae3 --- /dev/null +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/excludedFromImportsAndCompletion.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2010-2017 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.kotlin.idea.core + +import com.intellij.codeInsight.JavaProjectCodeInsightSettings +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.idea.imports.importableFqName + + +private val exclusions = + listOf( + "kotlin.jvm.internal", + "kotlin.coroutines.intrinsics" + ) + +private fun shouldBeHiddenAsInternalImplementationDetail(fqName: String) = exclusions.any { fqName.startsWith(it) } + +fun DeclarationDescriptor.isExcludedFromAutoImport(project: Project): Boolean { + val fqName = importableFqName?.asString() ?: return false + return JavaProjectCodeInsightSettings.getSettings(project).isExcluded(fqName) || + shouldBeHiddenAsInternalImplementationDetail(fqName) +} diff --git a/idea/testData/quickfix/autoImports/excludedFromImport.after b/idea/testData/quickfix/autoImports/excludedFromImport.after new file mode 100644 index 00000000000..3fdd75afeb7 --- /dev/null +++ b/idea/testData/quickfix/autoImports/excludedFromImport.after @@ -0,0 +1,13 @@ +// "Import" "false" +// 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 +// ERROR: Unresolved reference: FunctionReference + +fun some() { + FunctionReference::class +} \ No newline at end of file diff --git a/idea/testData/quickfix/autoImports/excludedFromImport.kt b/idea/testData/quickfix/autoImports/excludedFromImport.kt new file mode 100644 index 00000000000..3fdd75afeb7 --- /dev/null +++ b/idea/testData/quickfix/autoImports/excludedFromImport.kt @@ -0,0 +1,13 @@ +// "Import" "false" +// 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 +// ERROR: Unresolved reference: 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 c514b72fdd2..4b2bbe7a8c3 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -734,6 +734,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("excludedFromImport.kt") + public void testExcludedFromImport() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/autoImports/excludedFromImport.kt"); + doTest(fileName); + } + @TestMetadata("infixCallAndObject.kt") public void testInfixCallAndObject() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/autoImports/infixCallAndObject.kt");