diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt index e85703308ea..eb38be9e9d4 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.core.KotlinIndicesHelper +import org.jetbrains.kotlin.idea.core.isInExcludedPackage import org.jetbrains.kotlin.idea.project.ProjectStructureUtil import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.psi.JetFile @@ -40,10 +41,14 @@ class AllClassesCompletion(private val parameters: CompletionParameters, fun collect(classDescriptorCollector: (ClassDescriptor) -> Unit, javaClassCollector: (PsiClass) -> Unit) { //TODO: this is a temporary hack until we have built-ins in indices val builtIns = JavaToKotlinClassMap.INSTANCE.allKotlinClasses() - val filteredBuiltIns = builtIns.filter { kindFilter(it.getKind()) && prefixMatcher.prefixMatches(it.getName().asString()) } + val filteredBuiltIns = builtIns + .filter { kindFilter(it.getKind()) && prefixMatcher.prefixMatches(it.getName().asString()) && !isInExcludedPackage(it) } filteredBuiltIns.forEach { classDescriptorCollector(it) } - kotlinIndicesHelper.getClassDescriptors({ prefixMatcher.prefixMatches(it) }, kindFilter).forEach { classDescriptorCollector(it) } + kotlinIndicesHelper + .getClassDescriptors({ prefixMatcher.prefixMatches(it) }, kindFilter) + .filter { !isInExcludedPackage(it) } + .forEach { classDescriptorCollector(it) } if (!ProjectStructureUtil.isJsKotlinModule(parameters.getOriginalFile() as JetFile)) { addAdaptedJavaCompletion(javaClassCollector) 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 445a2f6d240..0536e5f1642 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 @@ -37,10 +37,7 @@ import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.codeInsight.ReferenceVariantsHelper import org.jetbrains.kotlin.idea.completion.smart.LambdaItems import org.jetbrains.kotlin.idea.completion.smart.SmartCompletion -import org.jetbrains.kotlin.idea.core.KotlinIndicesHelper -import org.jetbrains.kotlin.idea.core.comparePossiblyOverridingDescriptors -import org.jetbrains.kotlin.idea.core.getResolutionScope -import org.jetbrains.kotlin.idea.core.isVisible +import org.jetbrains.kotlin.idea.core.* import org.jetbrains.kotlin.idea.references.JetSimpleNameReference import org.jetbrains.kotlin.idea.util.CallType import org.jetbrains.kotlin.idea.util.ShadowedDeclarationsFilter @@ -250,16 +247,17 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC protected fun getTopLevelCallables(): Collection { val descriptors = indicesHelper.getTopLevelCallables({ prefixMatcher.prefixMatches(it) }) - return filterShadowedNonImported(descriptors, reference!!) + return filterShadowedNonImportedAndExcluded(descriptors, reference!!) } protected fun getTopLevelExtensions(): Collection { val descriptors = indicesHelper.getCallableTopLevelExtensions({ prefixMatcher.prefixMatches(it) }, reference!!.expression, bindingContext) - return filterShadowedNonImported(descriptors, reference) + return filterShadowedNonImportedAndExcluded(descriptors, reference) } - private fun filterShadowedNonImported(descriptors: Collection, reference: JetSimpleNameReference): Collection { - return ShadowedDeclarationsFilter(bindingContext, moduleDescriptor, project).filterNonImported(descriptors, referenceVariants, reference.expression) + private fun filterShadowedNonImportedAndExcluded(descriptors: Collection, reference: JetSimpleNameReference): Collection { + val notExcluded = descriptors.filter { !isInExcludedPackage(it) } + return ShadowedDeclarationsFilter(bindingContext, moduleDescriptor, project).filterNonImported(notExcluded, referenceVariants, reference.expression) } protected fun addAllClasses(kindFilter: (ClassKind) -> Boolean) { diff --git a/idea/idea-completion/testData/basic/multifile/CallablesInExcludedPackage/CallablesInExcludedPackage.dependency1.kt b/idea/idea-completion/testData/basic/multifile/CallablesInExcludedPackage/CallablesInExcludedPackage.dependency1.kt new file mode 100644 index 00000000000..76bd2d486f0 --- /dev/null +++ b/idea/idea-completion/testData/basic/multifile/CallablesInExcludedPackage/CallablesInExcludedPackage.dependency1.kt @@ -0,0 +1,6 @@ +package excludedPackage + +fun someFunction() { +} + +val someProperty: Int = 5 \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/multifile/CallablesInExcludedPackage/CallablesInExcludedPackage.dependency2.kt b/idea/idea-completion/testData/basic/multifile/CallablesInExcludedPackage/CallablesInExcludedPackage.dependency2.kt new file mode 100644 index 00000000000..9729ec11a82 --- /dev/null +++ b/idea/idea-completion/testData/basic/multifile/CallablesInExcludedPackage/CallablesInExcludedPackage.dependency2.kt @@ -0,0 +1,6 @@ +package notExcludedPackage + +fun someOtherFunction() { +} + +val someOtherProperty: Int = 5 \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/multifile/CallablesInExcludedPackage/CallablesInExcludedPackage.kt b/idea/idea-completion/testData/basic/multifile/CallablesInExcludedPackage/CallablesInExcludedPackage.kt new file mode 100644 index 00000000000..9c3bf15ce5f --- /dev/null +++ b/idea/idea-completion/testData/basic/multifile/CallablesInExcludedPackage/CallablesInExcludedPackage.kt @@ -0,0 +1,5 @@ +val x = some + +// NUMBER: 2 +// ABSENT: someFunction, someProperty +// EXIST: someOtherFunction, someOtherProperty \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/multifile/ClassInExcludedPackage/ClassInExcludedPackage.dependency1.kt b/idea/idea-completion/testData/basic/multifile/ClassInExcludedPackage/ClassInExcludedPackage.dependency1.kt new file mode 100644 index 00000000000..00f79598da5 --- /dev/null +++ b/idea/idea-completion/testData/basic/multifile/ClassInExcludedPackage/ClassInExcludedPackage.dependency1.kt @@ -0,0 +1,3 @@ +package excludedPackage + +class SomeClass \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/multifile/ClassInExcludedPackage/ClassInExcludedPackage.dependency2.kt b/idea/idea-completion/testData/basic/multifile/ClassInExcludedPackage/ClassInExcludedPackage.dependency2.kt new file mode 100644 index 00000000000..d578d706eb3 --- /dev/null +++ b/idea/idea-completion/testData/basic/multifile/ClassInExcludedPackage/ClassInExcludedPackage.dependency2.kt @@ -0,0 +1,3 @@ +package notExcludedPackage + +class SomeOtherClass \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/multifile/ClassInExcludedPackage/ClassInExcludedPackage.kt b/idea/idea-completion/testData/basic/multifile/ClassInExcludedPackage/ClassInExcludedPackage.kt new file mode 100644 index 00000000000..5baec3ae0c8 --- /dev/null +++ b/idea/idea-completion/testData/basic/multifile/ClassInExcludedPackage/ClassInExcludedPackage.kt @@ -0,0 +1,5 @@ +val x = Some + +// NUMBER: 1 +// ABSENT: SomeClass +// EXIST: SomeOtherClass \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/multifile/ExcludedClass/ExcludedClass.dependency.kt b/idea/idea-completion/testData/basic/multifile/ExcludedClass/ExcludedClass.dependency.kt new file mode 100644 index 00000000000..4983cec7adf --- /dev/null +++ b/idea/idea-completion/testData/basic/multifile/ExcludedClass/ExcludedClass.dependency.kt @@ -0,0 +1,5 @@ +package somePackage + +class ExcludedClass + +class ExtraClass \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/multifile/ExcludedClass/ExcludedClass.kt b/idea/idea-completion/testData/basic/multifile/ExcludedClass/ExcludedClass.kt new file mode 100644 index 00000000000..f342359fe2d --- /dev/null +++ b/idea/idea-completion/testData/basic/multifile/ExcludedClass/ExcludedClass.kt @@ -0,0 +1,4 @@ +val x = Ex + +// ABSENT: ExcludedClass +// EXIST: ExtraClass \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/multifile/ExcludedJavaClass/ExcludedJavaClass.kt b/idea/idea-completion/testData/basic/multifile/ExcludedJavaClass/ExcludedJavaClass.kt new file mode 100644 index 00000000000..f342359fe2d --- /dev/null +++ b/idea/idea-completion/testData/basic/multifile/ExcludedJavaClass/ExcludedJavaClass.kt @@ -0,0 +1,4 @@ +val x = Ex + +// ABSENT: ExcludedClass +// EXIST: ExtraClass \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/multifile/ExcludedJavaClass/somePackage/ExcludedClass.java b/idea/idea-completion/testData/basic/multifile/ExcludedJavaClass/somePackage/ExcludedClass.java new file mode 100644 index 00000000000..a3272a3f71f --- /dev/null +++ b/idea/idea-completion/testData/basic/multifile/ExcludedJavaClass/somePackage/ExcludedClass.java @@ -0,0 +1,5 @@ +package somePackage; + +public class ExcludedClass { + +} \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/multifile/ExcludedJavaClass/somePackage/ExtraClass.java b/idea/idea-completion/testData/basic/multifile/ExcludedJavaClass/somePackage/ExtraClass.java new file mode 100644 index 00000000000..8e27c9baf5d --- /dev/null +++ b/idea/idea-completion/testData/basic/multifile/ExcludedJavaClass/somePackage/ExtraClass.java @@ -0,0 +1,5 @@ +package somePackage; + +public class ExtraClass { + +} \ No newline at end of file diff --git a/idea/idea-completion/testData/smartMultiFile/CallablesInExcludedPackage/CallablesInExcludedPackage.dependency1.kt b/idea/idea-completion/testData/smartMultiFile/CallablesInExcludedPackage/CallablesInExcludedPackage.dependency1.kt new file mode 100644 index 00000000000..49700a0c597 --- /dev/null +++ b/idea/idea-completion/testData/smartMultiFile/CallablesInExcludedPackage/CallablesInExcludedPackage.dependency1.kt @@ -0,0 +1,6 @@ +package excludedPackage + +fun someFunction(): Int { +} + +val someProperty: Int = 5 \ No newline at end of file diff --git a/idea/idea-completion/testData/smartMultiFile/CallablesInExcludedPackage/CallablesInExcludedPackage.dependency2.kt b/idea/idea-completion/testData/smartMultiFile/CallablesInExcludedPackage/CallablesInExcludedPackage.dependency2.kt new file mode 100644 index 00000000000..d1f7be0696e --- /dev/null +++ b/idea/idea-completion/testData/smartMultiFile/CallablesInExcludedPackage/CallablesInExcludedPackage.dependency2.kt @@ -0,0 +1,6 @@ +package notExcludedPackage + +fun someOtherFunction(): Int { +} + +val someOtherProperty: Int = 5 \ No newline at end of file diff --git a/idea/idea-completion/testData/smartMultiFile/CallablesInExcludedPackage/CallablesInExcludedPackage.kt b/idea/idea-completion/testData/smartMultiFile/CallablesInExcludedPackage/CallablesInExcludedPackage.kt new file mode 100644 index 00000000000..4df799939b6 --- /dev/null +++ b/idea/idea-completion/testData/smartMultiFile/CallablesInExcludedPackage/CallablesInExcludedPackage.kt @@ -0,0 +1,6 @@ +val x: Int = some + +// INVOCATION_COUNT: 2 +// NUMBER: 2 +// ABSENT: someFunction, someProperty +// EXIST: someOtherFunction, someOtherProperty \ No newline at end of file diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/KotlinCompletionTestCase.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/KotlinCompletionTestCase.java index bc050dda1d3..97f1ca6afb4 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/KotlinCompletionTestCase.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/KotlinCompletionTestCase.java @@ -16,8 +16,10 @@ package org.jetbrains.kotlin.idea.completion.test; +import com.intellij.codeInsight.CodeInsightSettings; import com.intellij.codeInsight.completion.CompletionTestCase; import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; +import com.intellij.util.ArrayUtil; import org.jetbrains.kotlin.test.JetTestUtils; abstract public class KotlinCompletionTestCase extends CompletionTestCase { @@ -25,10 +27,12 @@ abstract public class KotlinCompletionTestCase extends CompletionTestCase { protected void setUp() throws Exception { super.setUp(); VfsRootAccess.allowRootAccess(JetTestUtils.getHomeDirectory()); + CodeInsightSettings.getInstance().EXCLUDED_PACKAGES = new String[]{"excludedPackage", "somePackage.ExcludedClass"}; } @Override protected void tearDown() throws Exception { + CodeInsightSettings.getInstance().EXCLUDED_PACKAGES = ArrayUtil.EMPTY_STRING_ARRAY; VfsRootAccess.disallowRootAccess(JetTestUtils.getHomeDirectory()); super.tearDown(); } diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/MultiFileJvmBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/MultiFileJvmBasicCompletionTestGenerated.java index a4427324377..5712c7300b2 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/MultiFileJvmBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/MultiFileJvmBasicCompletionTestGenerated.java @@ -35,6 +35,18 @@ public class MultiFileJvmBasicCompletionTestGenerated extends AbstractMultiFileJ JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/idea-completion/testData/basic/multifile"), Pattern.compile("^([^\\.]+)$"), false); } + @TestMetadata("CallablesInExcludedPackage") + public void testCallablesInExcludedPackage() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/multifile/CallablesInExcludedPackage/"); + doTest(fileName); + } + + @TestMetadata("ClassInExcludedPackage") + public void testClassInExcludedPackage() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/multifile/ClassInExcludedPackage/"); + doTest(fileName); + } + @TestMetadata("CompleteFunctionWithNoSpecifiedType") public void testCompleteFunctionWithNoSpecifiedType() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/multifile/CompleteFunctionWithNoSpecifiedType/"); @@ -65,6 +77,18 @@ public class MultiFileJvmBasicCompletionTestGenerated extends AbstractMultiFileJ doTest(fileName); } + @TestMetadata("ExcludedClass") + public void testExcludedClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/multifile/ExcludedClass/"); + doTest(fileName); + } + + @TestMetadata("ExcludedJavaClass") + public void testExcludedJavaClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/multifile/ExcludedJavaClass/"); + doTest(fileName); + } + @TestMetadata("ExtensionFunction") public void testExtensionFunction() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/multifile/ExtensionFunction/"); diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/MultiFileSmartCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/MultiFileSmartCompletionTestGenerated.java index 44a8e4b6f6c..7caa52e3573 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/MultiFileSmartCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/MultiFileSmartCompletionTestGenerated.java @@ -41,6 +41,12 @@ public class MultiFileSmartCompletionTestGenerated extends AbstractMultiFileSmar doTest(fileName); } + @TestMetadata("CallablesInExcludedPackage") + public void testCallablesInExcludedPackage() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/smartMultiFile/CallablesInExcludedPackage/"); + doTest(fileName); + } + @TestMetadata("FunctionFromAnotherPackage") public void testFunctionFromAnotherPackage() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/smartMultiFile/FunctionFromAnotherPackage/");