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:
+16
-4
@@ -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!!
|
||||
|
||||
+1
-1
@@ -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()
|
||||
|
||||
+14
-11
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user