diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt index 4e5598eca9c..63394864c71 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt @@ -214,7 +214,8 @@ class BasicCompletionSession( collector.addDescriptorElements(notImported, lookupElementFactory, notImported = true) } - val staticMembersCompletion = StaticMembersCompletion(collector, prefixMatcher, resolutionFacade, lookupElementFactory, referenceVariants!!.imported) + val staticMembersCompletion = StaticMembersCompletion( + collector, prefixMatcher, resolutionFacade, lookupElementFactory, referenceVariants!!.imported, isJvmModule) if (callTypeAndReceiver is CallTypeAndReceiver.DEFAULT) { staticMembersCompletion.completeFromImports(position.containingFile as KtFile) } diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/StaticMembersCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/StaticMembersCompletion.kt index c1e209a664f..f62aac81bcc 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/StaticMembersCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/StaticMembersCompletion.kt @@ -37,7 +37,8 @@ class StaticMembersCompletion( private val prefixMatcher: PrefixMatcher, private val resolutionFacade: ResolutionFacade, private val lookupElementFactory: LookupElementFactory, - alreadyAdded: Collection + alreadyAdded: Collection, + private val isJvmModule: Boolean ) { private val alreadyAdded = alreadyAdded.mapTo(HashSet()) { if (it is ImportedFromObjectCallableDescriptor<*>) it.callableFromObject else it @@ -64,10 +65,8 @@ class StaticMembersCompletion( } } - //TODO: SAM-adapters //TODO: filter out those that are accessible from SmartCompletion.additionalItems //TODO: what about enum members? - //TODO: filter out Kotlin functions from file facades //TODO: better presentation for lookup elements from imports too //TODO: better sorting //TODO: from the same file @@ -75,13 +74,15 @@ class StaticMembersCompletion( val descriptorKindFilter = DescriptorKindFilter.CALLABLES exclude DescriptorKindExclude.Extensions val nameFilter: (String) -> Boolean = { prefixMatcher.prefixMatches(it) } - indicesHelper.getJavaStaticMembers(descriptorKindFilter, nameFilter).forEach { addFromDescriptor(it, ItemPriority.STATIC_MEMBER) } + if (isJvmModule) { + indicesHelper.getJavaStaticMembers(descriptorKindFilter, nameFilter).forEach { addFromDescriptor(it, ItemPriority.STATIC_MEMBER) } + } indicesHelper.getObjectMembers(descriptorKindFilter, nameFilter).forEach { addFromDescriptor(it, ItemPriority.STATIC_MEMBER) } } private fun addFromDescriptor(member: CallableDescriptor, itemPriority: ItemPriority) { - if (member !in alreadyAdded) { + if (member !in alreadyAdded) { //TODO: substitution collector.addElement(createLookupElement(member, itemPriority) ?: return) } } diff --git a/idea/idea-completion/testData/basic/common/staticMembers/JavaStaticMethods.kt b/idea/idea-completion/testData/basic/common/staticMembers/JavaStaticMethods.kt index 53abdefad7d..c7e88e48fdb 100644 --- a/idea/idea-completion/testData/basic/common/staticMembers/JavaStaticMethods.kt +++ b/idea/idea-completion/testData/basic/common/staticMembers/JavaStaticMethods.kt @@ -5,4 +5,5 @@ fun foo() { // INVOCATION_COUNT: 2 // EXIST_JAVA_ONLY: { allLookupStrings: "invokeLater", itemText: "SwingUtilities.invokeLater", tailText: "(Runnable!) (javax.swing)", typeText: "Unit", attributes: "" } // EXIST_JAVA_ONLY: { allLookupStrings: "invokeAndWait", itemText: "SwingUtilities.invokeAndWait", tailText: "(Runnable!) (javax.swing)", typeText: "Unit", attributes: "" } +// EXIST_JAVA_ONLY: { allLookupStrings: "invokeLater", itemText: "SwingUtilities.invokeLater", tailText: " {...} ((() -> Unit)!) (javax.swing)", typeText: "Unit", attributes: "" } // ABSENT: { itemText: "SwingUtilities.convertScreenLocationToParent" } diff --git a/idea/idea-completion/testData/handlers/basic/staticMembers/JavaStaticMethod.kt b/idea/idea-completion/testData/handlers/basic/staticMembers/JavaStaticMethod.kt index 3d74bb7608d..17643b39aea 100644 --- a/idea/idea-completion/testData/handlers/basic/staticMembers/JavaStaticMethod.kt +++ b/idea/idea-completion/testData/handlers/basic/staticMembers/JavaStaticMethod.kt @@ -4,3 +4,4 @@ fun foo() { // INVOCATION_COUNT: 2 // ELEMENT_TEXT: "SwingUtilities.invokeLater" +// TAIL_TEXT: "(Runnable!) (javax.swing)" diff --git a/idea/idea-completion/testData/handlers/basic/staticMembers/JavaStaticMethod.kt.after b/idea/idea-completion/testData/handlers/basic/staticMembers/JavaStaticMethod.kt.after index 28a783270e3..980ef7b3b9f 100644 --- a/idea/idea-completion/testData/handlers/basic/staticMembers/JavaStaticMethod.kt.after +++ b/idea/idea-completion/testData/handlers/basic/staticMembers/JavaStaticMethod.kt.after @@ -6,3 +6,4 @@ fun foo() { // INVOCATION_COUNT: 2 // ELEMENT_TEXT: "SwingUtilities.invokeLater" +// TAIL_TEXT: "(Runnable!) (javax.swing)" 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 daaf72bc277..8cd47498ffd 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 @@ -35,7 +35,9 @@ import org.jetbrains.kotlin.idea.util.CallType import org.jetbrains.kotlin.idea.util.CallTypeAndReceiver import org.jetbrains.kotlin.idea.util.receiverTypes import org.jetbrains.kotlin.idea.util.substituteExtensionIfCallable +import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.load.java.descriptors.SamAdapterDescriptor import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallableDeclaration import org.jetbrains.kotlin.psi.KtExpression @@ -229,8 +231,14 @@ public class KotlinIndicesHelper( if (!method.hasModifierProperty(PsiModifier.STATIC)) continue if (!visibilityFilterMayIncludeAccessible && method.hasModifierProperty(PsiModifier.PRIVATE)) continue val descriptor = method.getJavaMethodDescriptor() ?: continue + val container = descriptor.containingDeclaration as? ClassDescriptor ?: continue if (descriptorKindFilter.accepts(descriptor) && descriptorFilter(descriptor)) { result.add(descriptor) + + val samAdapter = container.staticScope.getContributedFunctions(descriptor.name, NoLookupLocation.FROM_IDE) + .filterIsInstance>() + .firstOrNull { it.originForSam.original == descriptor.original } + result.addIfNotNull(samAdapter) } } true