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