Fixed completion to not render functional types with parameter names in lookup items

This commit is contained in:
Valentin Kipyatkov
2016-09-15 22:58:05 +03:00
parent 7f0063013c
commit b2f215227d
5 changed files with 17 additions and 11 deletions
@@ -40,6 +40,11 @@ class BasicLookupElementFactory(
private val project: Project, private val project: Project,
val insertHandlerProvider: InsertHandlerProvider val insertHandlerProvider: InsertHandlerProvider
) { ) {
companion object {
// we skip parameter names in functional types in most of cases for shortness
val SHORT_NAMES_RENDERER = DescriptorRenderer.SHORT_NAMES_IN_TYPES.withOptions { parameterNamesInFunctionalTypes = false }
}
fun createLookupElement( fun createLookupElement(
descriptor: DeclarationDescriptor, descriptor: DeclarationDescriptor,
qualifyNestedClasses: Boolean = false, qualifyNestedClasses: Boolean = false,
@@ -155,18 +160,18 @@ class BasicLookupElementFactory(
when (descriptor) { when (descriptor) {
is FunctionDescriptor -> { is FunctionDescriptor -> {
val returnType = descriptor.returnType val returnType = descriptor.returnType
element = element.withTypeText(if (returnType != null) DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(returnType) else "", parametersAndTypeGrayed) element = element.withTypeText(if (returnType != null) SHORT_NAMES_RENDERER.renderType(returnType) else "", parametersAndTypeGrayed)
val insertsLambda = (insertHandler as? KotlinFunctionInsertHandler.Normal)?.lambdaInfo != null val insertsLambda = (insertHandler as? KotlinFunctionInsertHandler.Normal)?.lambdaInfo != null
if (insertsLambda) { if (insertsLambda) {
element = element.appendTailText(" {...} ", parametersAndTypeGrayed) element = element.appendTailText(" {...} ", parametersAndTypeGrayed)
} }
element = element.appendTailText(DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderFunctionParameters(descriptor), parametersAndTypeGrayed || insertsLambda) element = element.appendTailText(SHORT_NAMES_RENDERER.renderFunctionParameters(descriptor), parametersAndTypeGrayed || insertsLambda)
} }
is VariableDescriptor -> { is VariableDescriptor -> {
element = element.withTypeText(DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(descriptor.type), parametersAndTypeGrayed) element = element.withTypeText(SHORT_NAMES_RENDERER.renderType(descriptor.type), parametersAndTypeGrayed)
} }
is ClassifierDescriptorWithTypeParameters -> { is ClassifierDescriptorWithTypeParameters -> {
@@ -178,7 +183,7 @@ class BasicLookupElementFactory(
var container = descriptor.containingDeclaration var container = descriptor.containingDeclaration
if (qualifyNestedClasses) { if (qualifyNestedClasses) {
element = element.withPresentableText(DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderClassifierName(descriptor)) element = element.withPresentableText(SHORT_NAMES_RENDERER.renderClassifierName(descriptor))
while (container is ClassDescriptor) { while (container is ClassDescriptor) {
val containerName = container.name val containerName = container.name
@@ -194,12 +199,13 @@ class BasicLookupElementFactory(
} }
if (descriptor is TypeAliasDescriptor) { if (descriptor is TypeAliasDescriptor) {
// here we render with DescriptorRenderer.SHORT_NAMES_IN_TYPES to include parameter names in functional types
element = element.withTypeText(DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(descriptor.underlyingType), false) element = element.withTypeText(DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(descriptor.underlyingType), false)
} }
} }
else -> { else -> {
element = element.withTypeText(DescriptorRenderer.SHORT_NAMES_IN_TYPES.render(descriptor), parametersAndTypeGrayed) element = element.withTypeText(SHORT_NAMES_RENDERER.render(descriptor), parametersAndTypeGrayed)
} }
} }
@@ -242,7 +248,7 @@ class BasicLookupElementFactory(
} }
extensionReceiver != null -> { extensionReceiver != null -> {
val receiverPresentation = DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(extensionReceiver.type) val receiverPresentation = SHORT_NAMES_RENDERER.renderType(extensionReceiver.type)
appendTailText(" for $receiverPresentation") appendTailText(" for $receiverPresentation")
val container = descriptor.containingDeclaration val container = descriptor.containingDeclaration
@@ -168,7 +168,7 @@ fun shouldCompleteThisItems(prefixMatcher: PrefixMatcher): Boolean {
class ThisItemLookupObject(val receiverParameter: ReceiverParameterDescriptor, val labelName: Name?) : KeywordLookupObject() class ThisItemLookupObject(val receiverParameter: ReceiverParameterDescriptor, val labelName: Name?) : KeywordLookupObject()
fun ThisItemLookupObject.createLookupElement() = createKeywordElement("this", labelName.labelNameToTail(), lookupObject = this) fun ThisItemLookupObject.createLookupElement() = createKeywordElement("this", labelName.labelNameToTail(), lookupObject = this)
.withTypeText(DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(receiverParameter.type)) .withTypeText(BasicLookupElementFactory.SHORT_NAMES_RENDERER.renderType(receiverParameter.type))
fun thisExpressionItems(bindingContext: BindingContext, position: KtExpression, prefix: String, resolutionFacade: ResolutionFacade): Collection<ThisItemLookupObject> { fun thisExpressionItems(bindingContext: BindingContext, position: KtExpression, prefix: String, resolutionFacade: ResolutionFacade): Collection<ThisItemLookupObject> {
val scope = position.getResolutionScope(bindingContext, resolutionFacade) val scope = position.getResolutionScope(bindingContext, resolutionFacade)
@@ -381,7 +381,7 @@ fun LookupElement.decorateAsStaticMember(
} }
if (presentation.typeText.isNullOrEmpty()) { if (presentation.typeText.isNullOrEmpty()) {
presentation.typeText = DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(classDescriptor.defaultType) presentation.typeText = BasicLookupElementFactory.SHORT_NAMES_RENDERER.renderType(classDescriptor.defaultType)
} }
} }
@@ -167,7 +167,7 @@ class LookupElementFactory(
val lambdaPresentation = lambdaPresentation(if (explicitLambdaParameters) parameterType else null) val lambdaPresentation = lambdaPresentation(if (explicitLambdaParameters) parameterType else null)
// render only the last parameter because all other should be optional and will be omitted // render only the last parameter because all other should be optional and will be omitted
var parametersRenderer = DescriptorRenderer.SHORT_NAMES_IN_TYPES var parametersRenderer = BasicLookupElementFactory.SHORT_NAMES_RENDERER
if (descriptor.valueParameters.size > 1) { if (descriptor.valueParameters.size > 1) {
parametersRenderer = parametersRenderer.withOptions { parametersRenderer = parametersRenderer.withOptions {
valueParametersHandler = object: DescriptorRenderer.ValueParametersHandler by this.valueParametersHandler { valueParametersHandler = object: DescriptorRenderer.ValueParametersHandler by this.valueParametersHandler {
@@ -59,7 +59,7 @@ object NamedArgumentCompletion {
} }
for ((name, types) in nameToParameterType) { for ((name, types) in nameToParameterType) {
val typeText = types.singleOrNull()?.let { DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(it) } ?: "..." val typeText = types.singleOrNull()?.let { BasicLookupElementFactory.SHORT_NAMES_RENDERER.renderType(it) } ?: "..."
val nameString = name.asString() val nameString = name.asString()
val lookupElement = LookupElementBuilder.create(nameString) val lookupElement = LookupElementBuilder.create(nameString)
.withPresentableText("$nameString =") .withPresentableText("$nameString =")
@@ -211,7 +211,7 @@ class TypeInstantiationItems(
val constructor = visibleConstructors.single() val constructor = visibleConstructors.single()
val substitutor = TypeSubstitutor.create(fuzzyType.presentationType()) val substitutor = TypeSubstitutor.create(fuzzyType.presentationType())
val substitutedConstructor = constructor.substitute(substitutor) val substitutedConstructor = constructor.substitute(substitutor)
DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderFunctionParameters(substitutedConstructor) BasicLookupElementFactory.SHORT_NAMES_RENDERER.renderFunctionParameters(substitutedConstructor)
} }
else -> "(...)" else -> "(...)"