diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/typeUtils.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/typeUtils.kt index bb48f226dfa..a0837eb87a5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/typeUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/typeUtils.kt @@ -222,7 +222,13 @@ fun KtExpression.guessTypes( parent is KtNamedFunction && parent.name == null -> parent else -> null } - if (functionalExpression == null) return arrayOf() + if (functionalExpression == null) { + functionDescriptor.overriddenDescriptors + .mapNotNull { it.returnType } + .firstOrNull { isAcceptable(it) } + ?.let { return arrayOf(it) } + return arrayOf() + } val lambdaTypes = functionalExpression.guessTypes(context, module, pseudocode?.parent, coerceUnusedToUnit) lambdaTypes.mapNotNull { it.getFunctionType()?.arguments?.lastOrNull()?.type }.toTypedArray() } diff --git a/idea/testData/quickfix/createFromUsage/createClass/callExpression/expectedTypeBySuperFunction.kt b/idea/testData/quickfix/createFromUsage/createClass/callExpression/expectedTypeBySuperFunction.kt new file mode 100644 index 00000000000..95d8edd967e --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/callExpression/expectedTypeBySuperFunction.kt @@ -0,0 +1,9 @@ +// "Create class 'XImpl'" "true" +interface X +interface A { + fun f(): X +} + +class B : A { + override fun f() = XImpl() +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/callExpression/expectedTypeBySuperFunction.kt.after b/idea/testData/quickfix/createFromUsage/createClass/callExpression/expectedTypeBySuperFunction.kt.after new file mode 100644 index 00000000000..27a9647874b --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/callExpression/expectedTypeBySuperFunction.kt.after @@ -0,0 +1,13 @@ +// "Create class 'XImpl'" "true" +interface X +interface A { + fun f(): X +} + +class B : A { + override fun f() = XImpl() +} + +class XImpl : X { + +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 2f0a0d0a6a7..011507b6be1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -1647,6 +1647,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("expectedTypeBySuperFunction.kt") + public void testExpectedTypeBySuperFunction() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/callExpression/expectedTypeBySuperFunction.kt"); + doTest(fileName); + } + @TestMetadata("quotedName.kt") public void testQuotedName() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createClass/callExpression/quotedName.kt");