diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt index 91747e7fc5a..72ddc335557 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt @@ -438,7 +438,13 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { else "" val declaration : JetNamedDeclaration = when (callableInfo.kind) { - CallableKind.FUNCTION -> psiFactory.createFunction("${modifiers}fun<> $header {}") + CallableKind.FUNCTION -> { + val body = when { + containingElement is JetClass && containingElement.isTrait() && !config.isExtension -> "" + else -> "{}" + } + psiFactory.createFunction("${modifiers}fun<> $header $body") + } CallableKind.CONSTRUCTOR -> { with((callableInfo as ConstructorInfo).classInfo) { val classBody = when (kind) { @@ -620,6 +626,8 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { } private fun setupFunctionBody(func: JetNamedFunction) { + val oldBody = func.getBodyExpression() ?: return + val fileTemplate = FileTemplateManager.getInstance()!!.getCodeTemplate(TEMPLATE_FROM_USAGE_FUNCTION_BODY) val properties = Properties() properties.setProperty(FileTemplate.ATTRIBUTE_RETURN_TYPE, if (skipReturnType) "Unit" else func.getTypeReference()!!.getText()) @@ -641,8 +649,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { throw IncorrectOperationException("Failed to parse file template", e) } - val newBodyExpression = JetPsiFactory(func).createFunctionBody(bodyText) - func.getBodyExpression()!!.replace(newBodyExpression) + oldBody.replace(JetPsiFactory(func).createFunctionBody(bodyText)) } private fun setupCallTypeArguments(callElement: JetCallElement, typeParameters: List) { diff --git a/idea/testData/quickfix/createFromUsage/createFunction/call/afterExtensionFunOnTrait.kt b/idea/testData/quickfix/createFromUsage/createFunction/call/afterExtensionFunOnTrait.kt new file mode 100644 index 00000000000..4847a49e2c7 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createFunction/call/afterExtensionFunOnTrait.kt @@ -0,0 +1,11 @@ +// "Create extension function 'foo'" "true" + +trait T + +fun test(t: T) { + val b: Boolean = t.foo("1", 2) +} + +fun T.foo(s: String, i: Int): Boolean { + throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. +} diff --git a/idea/testData/quickfix/createFromUsage/createFunction/call/afterFunOnTrait.kt b/idea/testData/quickfix/createFromUsage/createFunction/call/afterFunOnTrait.kt new file mode 100644 index 00000000000..2d513870e32 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createFunction/call/afterFunOnTrait.kt @@ -0,0 +1,9 @@ +// "Create function 'foo'" "true" + +trait T { + fun foo(s: String, i: Int): Boolean +} + +fun test(t: T) { + val b: Boolean = t.foo("1", 2) +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createFunction/call/beforeExtensionFunOnTrait.kt b/idea/testData/quickfix/createFromUsage/createFunction/call/beforeExtensionFunOnTrait.kt new file mode 100644 index 00000000000..1b151716133 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createFunction/call/beforeExtensionFunOnTrait.kt @@ -0,0 +1,7 @@ +// "Create extension function 'foo'" "true" + +trait T + +fun test(t: T) { + val b: Boolean = t.foo("1", 2) +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createFunction/call/beforeFunOnTrait.kt b/idea/testData/quickfix/createFromUsage/createFunction/call/beforeFunOnTrait.kt new file mode 100644 index 00000000000..7982ddb2102 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createFunction/call/beforeFunOnTrait.kt @@ -0,0 +1,7 @@ +// "Create function 'foo'" "true" + +trait T + +fun test(t: T) { + val b: Boolean = t.foo("1", 2) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 0b61ca2b253..b2b640823e3 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -1534,6 +1534,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("beforeExtensionFunOnTrait.kt") + public void testExtensionFunOnTrait() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/beforeExtensionFunOnTrait.kt"); + doTest(fileName); + } + @TestMetadata("beforeFunExtraArgs.kt") public void testFunExtraArgs() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/beforeFunExtraArgs.kt"); @@ -1570,6 +1576,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("beforeFunOnTrait.kt") + public void testFunOnTrait() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/beforeFunOnTrait.kt"); + doTest(fileName); + } + @TestMetadata("beforeFunOnUserObject.kt") public void testFunOnUserObject() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/beforeFunOnUserObject.kt");