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 903a144390d..a81bb480456 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 @@ -463,6 +463,10 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { else if (isExtension) "private " else "" + val isExpectClassMember by lazy { + containingElement is KtClassOrObject && (containingElement.resolveToDescriptorIfAny() as? ClassDescriptor)?.isExpect ?: false + } + val declaration: KtNamedDeclaration = when (callableInfo.kind) { CallableKind.FUNCTION, CallableKind.SECONDARY_CONSTRUCTOR -> { val body = when { @@ -473,6 +477,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { containingElement is KtObjectDeclaration && containingElement.isCompanion() && containingElement.parent.parent is KtClass && (containingElement.parent.parent as KtClass).hasModifier(KtTokens.EXTERNAL_KEYWORD) -> "" + isExpectClassMember -> "" else -> "{}" } @@ -517,7 +522,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { CallableKind.PROPERTY -> { val isVar = (callableInfo as PropertyInfo).writable val valVar = if (isVar) "var" else "val" - val accessors = if (isExtension) { + val accessors = if (isExtension && !isExpectClassMember) { buildString { append("\nget() {}") if (isVar) { diff --git a/idea/testData/multiModuleQuickFix/createFunInExpectClass/header/header.kt b/idea/testData/multiModuleQuickFix/createFunInExpectClass/header/header.kt new file mode 100644 index 00000000000..c07b6c7941f --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createFunInExpectClass/header/header.kt @@ -0,0 +1,8 @@ +// "Create member function 'Foo.foo'" "true" +// ERROR: Unresolved reference: foo + +expect class Foo + +fun test(f: Foo) { + f.foo("a", 1) +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createFunInExpectClass/header/header.kt.after b/idea/testData/multiModuleQuickFix/createFunInExpectClass/header/header.kt.after new file mode 100644 index 00000000000..0638f48a1a8 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createFunInExpectClass/header/header.kt.after @@ -0,0 +1,10 @@ +// "Create member function 'Foo.foo'" "true" +// ERROR: Unresolved reference: foo + +expect class Foo { + fun foo(s: String, i: Int) +} + +fun test(f: Foo) { + f.foo("a", 1) +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createFunInExpectClass/jvm/impl.kt b/idea/testData/multiModuleQuickFix/createFunInExpectClass/jvm/impl.kt new file mode 100644 index 00000000000..de536b7d559 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createFunInExpectClass/jvm/impl.kt @@ -0,0 +1 @@ +actual class Foo \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createFunInExpectClass/jvm/impl.kt.after b/idea/testData/multiModuleQuickFix/createFunInExpectClass/jvm/impl.kt.after new file mode 100644 index 00000000000..de536b7d559 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createFunInExpectClass/jvm/impl.kt.after @@ -0,0 +1 @@ +actual class Foo \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createValInExpectClass/header/header.kt b/idea/testData/multiModuleQuickFix/createValInExpectClass/header/header.kt new file mode 100644 index 00000000000..1abc190f832 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createValInExpectClass/header/header.kt @@ -0,0 +1,12 @@ +// "Create member property 'Foo.foo'" "true" +// ERROR: Unresolved reference: foo + +expect class Foo + +fun test(f: Foo) { + takeInt(f.foo) +} + +fun takeInt(n: Int) { + +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createValInExpectClass/header/header.kt.after b/idea/testData/multiModuleQuickFix/createValInExpectClass/header/header.kt.after new file mode 100644 index 00000000000..171a0757ef7 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createValInExpectClass/header/header.kt.after @@ -0,0 +1,14 @@ +// "Create member property 'Foo.foo'" "true" +// ERROR: Unresolved reference: foo + +expect class Foo { + val foo: Int +} + +fun test(f: Foo) { + takeInt(f.foo) +} + +fun takeInt(n: Int) { + +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createValInExpectClass/jvm/impl.kt b/idea/testData/multiModuleQuickFix/createValInExpectClass/jvm/impl.kt new file mode 100644 index 00000000000..de536b7d559 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createValInExpectClass/jvm/impl.kt @@ -0,0 +1 @@ +actual class Foo \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createValInExpectClass/jvm/impl.kt.after b/idea/testData/multiModuleQuickFix/createValInExpectClass/jvm/impl.kt.after new file mode 100644 index 00000000000..de536b7d559 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createValInExpectClass/jvm/impl.kt.after @@ -0,0 +1 @@ +actual class Foo \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createVarInExpectClass/header/header.kt b/idea/testData/multiModuleQuickFix/createVarInExpectClass/header/header.kt new file mode 100644 index 00000000000..13961bbe98a --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createVarInExpectClass/header/header.kt @@ -0,0 +1,8 @@ +// "Create member property 'Foo.foo'" "true" +// ERROR: Unresolved reference: foo + +expect class Foo + +fun test(f: Foo) { + f.foo = 1 +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createVarInExpectClass/header/header.kt.after b/idea/testData/multiModuleQuickFix/createVarInExpectClass/header/header.kt.after new file mode 100644 index 00000000000..1639e39be72 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createVarInExpectClass/header/header.kt.after @@ -0,0 +1,10 @@ +// "Create member property 'Foo.foo'" "true" +// ERROR: Unresolved reference: foo + +expect class Foo { + var foo: Int +} + +fun test(f: Foo) { + f.foo = 1 +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createVarInExpectClass/jvm/impl.kt b/idea/testData/multiModuleQuickFix/createVarInExpectClass/jvm/impl.kt new file mode 100644 index 00000000000..de536b7d559 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createVarInExpectClass/jvm/impl.kt @@ -0,0 +1 @@ +actual class Foo \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createVarInExpectClass/jvm/impl.kt.after b/idea/testData/multiModuleQuickFix/createVarInExpectClass/jvm/impl.kt.after new file mode 100644 index 00000000000..de536b7d559 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createVarInExpectClass/jvm/impl.kt.after @@ -0,0 +1 @@ +actual class Foo \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt index 8a60f582a87..ae1fd006303 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTest.kt @@ -249,4 +249,13 @@ class QuickFixMultiModuleTest : AbstractQuickFixMultiModuleTest() { @Test fun testAddActualToTopLevelMember() = doMultiPlatformTest() + + @Test + fun testCreateFunInExpectClass() = doMultiPlatformTest() + + @Test + fun testCreateValInExpectClass() = doMultiPlatformTest() + + @Test + fun testCreateVarInExpectClass() = doMultiPlatformTest() }