Smart completion does not need SAM-constructor in declarations from scope + it's present even when not imported

This commit is contained in:
Valentin Kipyatkov
2014-11-01 18:58:54 +03:00
parent a8bd7caed1
commit 5f4220427f
7 changed files with 39 additions and 7 deletions
@@ -34,6 +34,7 @@ import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession
import org.jetbrains.jet.renderer.DescriptorRenderer
import org.jetbrains.jet.lang.psi.psiUtil.getReceiverExpression
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor
class SmartCompletion(val expression: JetSimpleNameExpression,
val resolveSession: ResolveSessionForBodies,
@@ -106,7 +107,8 @@ class SmartCompletion(val expression: JetSimpleNameExpression,
fun filterDeclaration(descriptor: DeclarationDescriptor): Collection<LookupElement> {
val result = ArrayList<LookupElement>()
if (!itemsToSkip.contains(descriptor)) {
if (!itemsToSkip.contains(descriptor)
&& descriptor !is SamConstructorDescriptor /* SAM-constructor is added explicitly and is not needed here */) {
val types = typesWithSmartCasts(descriptor)
val nonNullTypes = types.map { it.makeNotNullable() }
val classifier = { (expectedInfo: ExpectedInfo) ->
@@ -37,6 +37,8 @@ import org.jetbrains.jet.lang.descriptors.Visibilities
import org.jetbrains.jet.plugin.util.makeNotNullable
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor
import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor
class TypeInstantiationItems(val resolveSession: ResolveSessionForBodies, val bindingContext: BindingContext, val visibilityFilter: (DeclarationDescriptor) -> Boolean) {
public fun addToCollection(collection: MutableCollection<LookupElement>, expectedInfos: Collection<ExpectedInfo>) {
@@ -53,6 +55,8 @@ class TypeInstantiationItems(val resolveSession: ResolveSessionForBodies, val bi
val classifier = jetType.getConstructor().getDeclarationDescriptor()
if (classifier !is ClassDescriptor) return
addSamConstructorItem(collection, classifier, tail)
val isAbstract = classifier.getModality() == Modality.ABSTRACT
val allConstructors = classifier.getConstructors()
val visibleConstructors = allConstructors.filter {
@@ -135,4 +139,22 @@ class TypeInstantiationItems(val resolveSession: ResolveSessionForBodies, val bi
collection.add(lookupElement.addTail(tail))
}
private fun addSamConstructorItem(collection: MutableCollection<LookupElement>, `class`: ClassDescriptor, tail: Tail?) {
if (`class`.getKind() == ClassKind.TRAIT) {
val container = `class`.getContainingDeclaration()
val scope = when (container) {
is PackageFragmentDescriptor -> container.getMemberScope()
is ClassDescriptor -> container.getStaticScope()
else -> return
}
val samConstructor = scope.getFunctions(`class`.getName())
.filterIsInstance(javaClass<SamConstructorDescriptor>())
.singleOrNull() ?: return
val lookupElement = createLookupElement(samConstructor, resolveSession, bindingContext)
.assignSmartCompletionPriority(SmartCompletionItemPriority.INSTANTIATION)
.addTail(tail)
collection.add(lookupElement)
}
}
}