From 847295bf1cf1a7408c810e9d7c03b7b26ddf5d06 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Wed, 2 Oct 2019 10:16:45 +0700 Subject: [PATCH] CreateExpect: shouldn't generate expect declaration from actual function with default implementation from interface #KT-32737 Fixed --- .../quickfix/expectactual/ExpectActualUtils.kt | 7 +++++++ .../createExpect/functionInInterface/common/My.kt | 3 +++ .../functionInInterface/common/My.kt.after | 5 +++++ .../createExpect/functionInInterface/jvm/My.kt | 6 ++++++ .../functionInInterface/jvm/My.kt.after | 6 ++++++ .../common/My.kt | 3 +++ .../common/My.kt.after | 3 +++ .../jvm/My.kt | 7 +++++++ .../jvm/My.kt.after | 7 +++++++ .../common/My.kt | 3 +++ .../common/My.kt.after | 3 +++ .../jvm/My.kt | 9 +++++++++ .../jvm/My.kt.after | 9 +++++++++ .../QuickFixMultiModuleTestGenerated.java | 15 +++++++++++++++ 14 files changed, 86 insertions(+) create mode 100644 idea/testData/multiModuleQuickFix/createExpect/functionInInterface/common/My.kt create mode 100644 idea/testData/multiModuleQuickFix/createExpect/functionInInterface/common/My.kt.after create mode 100644 idea/testData/multiModuleQuickFix/createExpect/functionInInterface/jvm/My.kt create mode 100644 idea/testData/multiModuleQuickFix/createExpect/functionInInterface/jvm/My.kt.after create mode 100644 idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/common/My.kt create mode 100644 idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/common/My.kt.after create mode 100644 idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/jvm/My.kt create mode 100644 idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/jvm/My.kt.after create mode 100644 idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/common/My.kt create mode 100644 idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/common/My.kt.after create mode 100644 idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/jvm/My.kt create mode 100644 idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/jvm/My.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt index 3e29fae5fd8..f0e8f1be1c3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt @@ -30,11 +30,13 @@ import org.jetbrains.kotlin.idea.quickfix.TypeAccessibilityChecker import org.jetbrains.kotlin.idea.refactoring.createKotlinFile import org.jetbrains.kotlin.idea.refactoring.fqName.fqName import org.jetbrains.kotlin.idea.refactoring.introduce.showErrorHint +import org.jetbrains.kotlin.idea.refactoring.isInterfaceClass import org.jetbrains.kotlin.idea.util.* import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker @@ -389,6 +391,11 @@ fun TypeAccessibilityChecker.isCorrectAndHaveNonPrivateModifier(declaration: KtN return false } + if (declaration is KtFunction && declaration.hasBody() && declaration.containingClassOrObject?.isInterfaceClass() == true) { + if (showErrorHint) showInaccessibleDeclarationError(declaration, "The function declaration shouldn't have a default implementation") + return false + } + if (!showErrorHint) return checkAccessibility(declaration) val types = incorrectTypes(declaration).ifEmpty { return true } diff --git a/idea/testData/multiModuleQuickFix/createExpect/functionInInterface/common/My.kt b/idea/testData/multiModuleQuickFix/createExpect/functionInInterface/common/My.kt new file mode 100644 index 00000000000..0bb849f9461 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpect/functionInInterface/common/My.kt @@ -0,0 +1,3 @@ +// DISABLE-ERRORS + +expect interface My \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpect/functionInInterface/common/My.kt.after b/idea/testData/multiModuleQuickFix/createExpect/functionInInterface/common/My.kt.after new file mode 100644 index 00000000000..f874ab37b0a --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpect/functionInInterface/common/My.kt.after @@ -0,0 +1,5 @@ +// DISABLE-ERRORS + +expect interface My { + fun foo(param: String) +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpect/functionInInterface/jvm/My.kt b/idea/testData/multiModuleQuickFix/createExpect/functionInInterface/jvm/My.kt new file mode 100644 index 00000000000..a16d1c2becc --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpect/functionInInterface/jvm/My.kt @@ -0,0 +1,6 @@ +// "Create expected function in common module testModule_Common" "true" +// DISABLE-ERRORS + +actual interface My { + actual fun foo(param: String) +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpect/functionInInterface/jvm/My.kt.after b/idea/testData/multiModuleQuickFix/createExpect/functionInInterface/jvm/My.kt.after new file mode 100644 index 00000000000..a16d1c2becc --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpect/functionInInterface/jvm/My.kt.after @@ -0,0 +1,6 @@ +// "Create expected function in common module testModule_Common" "true" +// DISABLE-ERRORS + +actual interface My { + actual fun foo(param: String) +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/common/My.kt b/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/common/My.kt new file mode 100644 index 00000000000..0bb849f9461 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/common/My.kt @@ -0,0 +1,3 @@ +// DISABLE-ERRORS + +expect interface My \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/common/My.kt.after b/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/common/My.kt.after new file mode 100644 index 00000000000..0bb849f9461 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/common/My.kt.after @@ -0,0 +1,3 @@ +// DISABLE-ERRORS + +expect interface My \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/jvm/My.kt b/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/jvm/My.kt new file mode 100644 index 00000000000..450c34e1d31 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/jvm/My.kt @@ -0,0 +1,7 @@ +// "Create expected function in common module testModule_Common" "true" +// SHOULD_FAIL_WITH: "The function declaration shouldn't have a default implementation" +// DISABLE-ERRORS + +actual interface My { + actual fun foo(param: String) = param.length +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/jvm/My.kt.after b/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/jvm/My.kt.after new file mode 100644 index 00000000000..450c34e1d31 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/jvm/My.kt.after @@ -0,0 +1,7 @@ +// "Create expected function in common module testModule_Common" "true" +// SHOULD_FAIL_WITH: "The function declaration shouldn't have a default implementation" +// DISABLE-ERRORS + +actual interface My { + actual fun foo(param: String) = param.length +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/common/My.kt b/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/common/My.kt new file mode 100644 index 00000000000..0bb849f9461 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/common/My.kt @@ -0,0 +1,3 @@ +// DISABLE-ERRORS + +expect interface My \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/common/My.kt.after b/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/common/My.kt.after new file mode 100644 index 00000000000..0bb849f9461 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/common/My.kt.after @@ -0,0 +1,3 @@ +// DISABLE-ERRORS + +expect interface My \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/jvm/My.kt b/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/jvm/My.kt new file mode 100644 index 00000000000..cbac1789f62 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/jvm/My.kt @@ -0,0 +1,9 @@ +// "Create expected function in common module testModule_Common" "true" +// SHOULD_FAIL_WITH: "The function declaration shouldn't have a default implementation" +// DISABLE-ERRORS + +actual interface My { + actual fun foo(param: String) { + + } +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/jvm/My.kt.after b/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/jvm/My.kt.after new file mode 100644 index 00000000000..cbac1789f62 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/jvm/My.kt.after @@ -0,0 +1,9 @@ +// "Create expected function in common module testModule_Common" "true" +// SHOULD_FAIL_WITH: "The function declaration shouldn't have a default implementation" +// DISABLE-ERRORS + +actual interface My { + actual fun foo(param: String) { + + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java index f5900a36949..c5891987323 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java @@ -553,6 +553,21 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul runTest("idea/testData/multiModuleQuickFix/createExpect/function2/"); } + @TestMetadata("functionInInterface") + public void testFunctionInInterface() throws Exception { + runTest("idea/testData/multiModuleQuickFix/createExpect/functionInInterface/"); + } + + @TestMetadata("functionWithImplementationInInterface") + public void testFunctionWithImplementationInInterface() throws Exception { + runTest("idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface/"); + } + + @TestMetadata("functionWithImplementationInInterface2") + public void testFunctionWithImplementationInInterface2() throws Exception { + runTest("idea/testData/multiModuleQuickFix/createExpect/functionWithImplementationInInterface2/"); + } + @TestMetadata("inlineClass") public void testInlineClass() throws Exception { runTest("idea/testData/multiModuleQuickFix/createExpect/inlineClass/");