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 }
.onEach { foundDescriptors += it.original }
collector.addDescriptorElements(unique.toList(), factory)
collector.addDescriptorElements(uniqueNotImportedExtensions.toList(), factory, notImported = true)
collector.addDescriptorElements(
unique.toList(), factory,
prohibitDuplicates = true
)
collector.addDescriptorElements(
uniqueNotImportedExtensions.toList(), factory,
notImported = true, prohibitDuplicates = true
)
flushToResultSet()
}
@@ -796,8 +802,14 @@ class BasicCompletionSession(
private fun addReferenceVariantElements(lookupElementFactory: LookupElementFactory, descriptorKindFilter: DescriptorKindFilter) {
fun addReferenceVariants(referenceVariants: ReferenceVariants) {
collector.addDescriptorElements(referenceVariantsHelper.excludeNonInitializedVariable(referenceVariants.imported, position), lookupElementFactory)
collector.addDescriptorElements(referenceVariants.notImportedExtensions, lookupElementFactory, notImported = true)
collector.addDescriptorElements(
referenceVariantsHelper.excludeNonInitializedVariable(referenceVariants.imported, position),
lookupElementFactory, prohibitDuplicates = true
)
collector.addDescriptorElements(
referenceVariants.notImportedExtensions, lookupElementFactory,
notImported = true, prohibitDuplicates = true
)
}
val referenceVariantsCollector = referenceVariantsCollector!!
@@ -64,7 +64,7 @@ class DslMembersCompletion(
callTypeAndReceiver = callTypeAndReceiver,
receiverTypes = listOf(nearestReceiver.type)
).forEach { descriptor: DeclarationDescriptor ->
collector.addDescriptorElements(descriptor, factory, notImported = true, withReceiverCast = false)
collector.addDescriptorElements(descriptor, factory, notImported = true, withReceiverCast = false, prohibitDuplicates = true)
}
collector.flushToResultSet()
@@ -68,23 +68,26 @@ class LookupElementsCollector(
postProcessors.add(processor)
}
fun addDescriptorElements(descriptors: Iterable<DeclarationDescriptor>,
lookupElementFactory: AbstractLookupElementFactory,
notImported: Boolean = false,
withReceiverCast: Boolean = false
fun addDescriptorElements(
descriptors: Iterable<DeclarationDescriptor>,
lookupElementFactory: AbstractLookupElementFactory,
notImported: Boolean = false,
withReceiverCast: Boolean = false,
prohibitDuplicates: Boolean = false
) {
for (descriptor in descriptors) {
addDescriptorElements(descriptor, lookupElementFactory, notImported, withReceiverCast)
addDescriptorElements(descriptor, lookupElementFactory, notImported, withReceiverCast, prohibitDuplicates)
}
}
fun addDescriptorElements(
descriptor: DeclarationDescriptor,
lookupElementFactory: AbstractLookupElementFactory,
notImported: Boolean = false,
withReceiverCast: Boolean = false
descriptor: DeclarationDescriptor,
lookupElementFactory: AbstractLookupElementFactory,
notImported: 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)
@@ -94,7 +97,7 @@ class LookupElementsCollector(
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) {