From 9a1253c5c75b4fd16c6cd37c9e6ba41241e384ff Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 8 May 2018 16:24:50 +0300 Subject: [PATCH] Specify type explicitly: suggest also types from overridden So #KT-22092 Fixed --- .../SpecifyTypeExplicitlyIntention.kt | 37 +++++++++++++++---- .../KotlinInplaceVariableIntroducer.java | 2 +- .../specifyTypeExplicitly/overriddenAsNull.kt | 9 +++++ .../overriddenAsNull.kt.after | 9 +++++ .../intentions/IntentionTestGenerated.java | 5 +++ 5 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 idea/testData/intentions/specifyTypeExplicitly/overriddenAsNull.kt create mode 100644 idea/testData/intentions/specifyTypeExplicitly/overriddenAsNull.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/SpecifyTypeExplicitlyIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/SpecifyTypeExplicitlyIntention.kt index 77358c8b2b5..40011d9a360 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/SpecifyTypeExplicitlyIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/SpecifyTypeExplicitlyIntention.kt @@ -119,7 +119,11 @@ class SpecifyTypeExplicitlyIntention : SelfTargetingRangeIntention flatMap { - listOf(TypeUtils.makeNotNullable(it), TypeUtils.makeNullable(it)) + fun KotlinType.toResolvableApproximations(): List = + with(getResolvableApproximations(scope, checkTypeParameters).toList()) { + when { + exprType.isNullabilityFlexible() -> flatMap { + listOf(TypeUtils.makeNotNullable(it), TypeUtils.makeNullable(it)) + } + else -> this } - else -> this } + + val overriddenTypes: List = if (!useTypesFromOverridden) { + null + } else { + val declarationDescriptor = contextElement.resolveToDescriptorIfAny() as? CallableDescriptor + declarationDescriptor?.overriddenDescriptors?.mapNotNull { it.returnType } + } ?: emptyList() + val types = (listOf(exprType) + overriddenTypes).distinct().flatMap { + it.toResolvableApproximations() }.ifEmpty { return null } if (ApplicationManager.getApplication().isUnitTestMode) { @@ -150,6 +165,14 @@ class SpecifyTypeExplicitlyIntention : SelfTargetingRangeIntention()?.takeIf { + it.text == "// DO_NOT_CHOOSE_NOTHING" + } != null) { + val targetType = types.firstOrNull { !KotlinBuiltIns.isNothingOrNullableNothing(it) } ?: types.first() + return TypeChooseValueExpression(listOf(targetType), targetType) + } + } return TypeChooseValueExpression(types, types.first()) @@ -204,7 +227,7 @@ class SpecifyTypeExplicitlyIntention : SelfTargetingRangeIntention