Completion: prevent lookup elements from being duplicated correctly

This code prevents completion items from being submitted several times for the same descriptors
But some contributors actually do contribute extra items for already processed descriptors

Fixes a problem introduced in 1796d40118
This commit is contained in:
Pavel V. Talanov
2018-02-22 16:14:35 +01:00
parent 10f6d65e03
commit cf6fd4da81
3 changed files with 31 additions and 16 deletions
@@ -464,8 +464,14 @@ class BasicCompletionSession(
.filterNot { it.original in foundDescriptors } .filterNot { it.original in foundDescriptors }
.onEach { foundDescriptors += it.original } .onEach { foundDescriptors += it.original }
collector.addDescriptorElements(unique.toList(), factory) collector.addDescriptorElements(
collector.addDescriptorElements(uniqueNotImportedExtensions.toList(), factory, notImported = true) unique.toList(), factory,
prohibitDuplicates = true
)
collector.addDescriptorElements(
uniqueNotImportedExtensions.toList(), factory,
notImported = true, prohibitDuplicates = true
)
flushToResultSet() flushToResultSet()
} }
@@ -796,8 +802,14 @@ class BasicCompletionSession(
private fun addReferenceVariantElements(lookupElementFactory: LookupElementFactory, descriptorKindFilter: DescriptorKindFilter) { private fun addReferenceVariantElements(lookupElementFactory: LookupElementFactory, descriptorKindFilter: DescriptorKindFilter) {
fun addReferenceVariants(referenceVariants: ReferenceVariants) { fun addReferenceVariants(referenceVariants: ReferenceVariants) {
collector.addDescriptorElements(referenceVariantsHelper.excludeNonInitializedVariable(referenceVariants.imported, position), lookupElementFactory) collector.addDescriptorElements(
collector.addDescriptorElements(referenceVariants.notImportedExtensions, lookupElementFactory, notImported = true) referenceVariantsHelper.excludeNonInitializedVariable(referenceVariants.imported, position),
lookupElementFactory, prohibitDuplicates = true
)
collector.addDescriptorElements(
referenceVariants.notImportedExtensions, lookupElementFactory,
notImported = true, prohibitDuplicates = true
)
} }
val referenceVariantsCollector = referenceVariantsCollector!! val referenceVariantsCollector = referenceVariantsCollector!!
@@ -64,7 +64,7 @@ class DslMembersCompletion(
callTypeAndReceiver = callTypeAndReceiver, callTypeAndReceiver = callTypeAndReceiver,
receiverTypes = listOf(nearestReceiver.type) receiverTypes = listOf(nearestReceiver.type)
).forEach { descriptor: DeclarationDescriptor -> ).forEach { descriptor: DeclarationDescriptor ->
collector.addDescriptorElements(descriptor, factory, notImported = true, withReceiverCast = false) collector.addDescriptorElements(descriptor, factory, notImported = true, withReceiverCast = false, prohibitDuplicates = true)
} }
collector.flushToResultSet() collector.flushToResultSet()
@@ -68,23 +68,26 @@ class LookupElementsCollector(
postProcessors.add(processor) postProcessors.add(processor)
} }
fun addDescriptorElements(descriptors: Iterable<DeclarationDescriptor>, fun addDescriptorElements(
lookupElementFactory: AbstractLookupElementFactory, descriptors: Iterable<DeclarationDescriptor>,
notImported: Boolean = false, lookupElementFactory: AbstractLookupElementFactory,
withReceiverCast: Boolean = false notImported: Boolean = false,
withReceiverCast: Boolean = false,
prohibitDuplicates: Boolean = false
) { ) {
for (descriptor in descriptors) { for (descriptor in descriptors) {
addDescriptorElements(descriptor, lookupElementFactory, notImported, withReceiverCast) addDescriptorElements(descriptor, lookupElementFactory, notImported, withReceiverCast, prohibitDuplicates)
} }
} }
fun addDescriptorElements( fun addDescriptorElements(
descriptor: DeclarationDescriptor, descriptor: DeclarationDescriptor,
lookupElementFactory: AbstractLookupElementFactory, lookupElementFactory: AbstractLookupElementFactory,
notImported: Boolean = false, notImported: Boolean = false,
withReceiverCast: Boolean = false withReceiverCast: Boolean = false,
prohibitDuplicates: Boolean = false
) { ) {
if (descriptor is CallableDescriptor && descriptor in processedCallables) return if (prohibitDuplicates && descriptor is CallableDescriptor && descriptor in processedCallables) return
var lookupElements = lookupElementFactory.createStandardLookupElementsForDescriptor(descriptor, useReceiverTypes = true) var lookupElements = lookupElementFactory.createStandardLookupElementsForDescriptor(descriptor, useReceiverTypes = true)
@@ -94,7 +97,7 @@ class LookupElementsCollector(
addElements(lookupElements, notImported) addElements(lookupElements, notImported)
if (descriptor is CallableDescriptor) processedCallables.add(descriptor) if (prohibitDuplicates && descriptor is CallableDescriptor) processedCallables.add(descriptor)
} }
fun addElement(element: LookupElement, notImported: Boolean = false) { fun addElement(element: LookupElement, notImported: Boolean = false) {