diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/DeclaredHeaderMarker.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/DeclaredHeaderMarker.kt index 8fd9027d68a..4d3354187d7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/DeclaredHeaderMarker.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/DeclaredHeaderMarker.kt @@ -21,7 +21,9 @@ import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.core.toDescriptor import org.jetbrains.kotlin.idea.highlighter.sourceKind +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.MultiTargetPlatform import org.jetbrains.kotlin.resolve.checkers.HeaderImplDeclarationChecker @@ -63,6 +65,9 @@ internal fun KtDeclaration.headerDeclarationIfAny(): KtDeclaration? { return DescriptorToSourceUtils.descriptorToDeclaration(headerDescriptor) as? KtDeclaration } +internal fun KtDeclaration.isHeaderOrHeaderClassMember() = + hasModifier(KtTokens.HEADER_KEYWORD) || (containingClassOrObject?.hasModifier(KtTokens.HEADER_KEYWORD) ?: false) + private fun DeclarationDescriptor.liftToHeader(): DeclarationDescriptor? { if (this is MemberDescriptor) { return when { diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureData.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureData.kt index c2083fa285e..559277172b7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureData.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureData.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.highlighter.markers.headerImplementations +import org.jetbrains.kotlin.idea.highlighter.markers.isHeaderOrHeaderClassMember import org.jetbrains.kotlin.idea.highlighter.markers.liftToHeader import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinCallableDefinitionUsage import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers @@ -101,7 +102,7 @@ class KotlinChangeSignatureData( primaryCallables + primaryCallables.flatMapTo(HashSet()) { primaryFunction -> val primaryDeclaration = primaryFunction.declaration as? KtCallableDeclaration ?: return@flatMapTo emptyList() - if (primaryDeclaration.hasModifier(KtTokens.HEADER_KEYWORD)) { + if (primaryDeclaration.isHeaderOrHeaderClassMember()) { return@flatMapTo primaryDeclaration.headerImplementations().map { KotlinCallableDefinitionUsage(it, it.resolveToDescriptor() as CallableDescriptor, primaryFunction, null) } diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/Common/Common.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/Common/Common.iml new file mode 100644 index 00000000000..0ecf9949f6c --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/Common/Common.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/Common/src/test/test.kt b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/Common/src/test/test.kt new file mode 100644 index 00000000000..63dba006a15 --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/Common/src/test/test.kt @@ -0,0 +1,13 @@ +package test + +header class C { + fun foo() + fun baz(n: Int) + fun bar(n: Int) +} + +fun test(c: C) { + c.foo() + c.baz(1) + c.bar(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JS/JS.iml new file mode 100644 index 00000000000..82d3e6bdf49 --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JS/JS.iml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JS/src/test/test.kt b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JS/src/test/test.kt new file mode 100644 index 00000000000..157331fee4d --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JS/src/test/test.kt @@ -0,0 +1,13 @@ +package test + +impl class C { + impl fun foo() { } + impl fun baz(n: Int) { } + impl fun bar(n: Int) { } +} + +fun test(c: C) { + c.foo() + c.baz(1) + c.bar(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JVM/JVM.iml new file mode 100644 index 00000000000..c3173af9ec7 --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JVM/JVM.iml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JVM/src/test/test.kt b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JVM/src/test/test.kt new file mode 100644 index 00000000000..157331fee4d --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/after/JVM/src/test/test.kt @@ -0,0 +1,13 @@ +package test + +impl class C { + impl fun foo() { } + impl fun baz(n: Int) { } + impl fun bar(n: Int) { } +} + +fun test(c: C) { + c.foo() + c.baz(1) + c.bar(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/Common/Common.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/Common/Common.iml new file mode 100644 index 00000000000..0ecf9949f6c --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/Common/Common.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/Common/src/test/test.kt b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/Common/src/test/test.kt new file mode 100644 index 00000000000..b216717ed20 --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/Common/src/test/test.kt @@ -0,0 +1,13 @@ +package test + +header class C { + fun foo() + fun foo(n: Int) + fun bar(n: Int) +} + +fun test(c: C) { + c.foo() + c.foo(1) + c.bar(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JS/JS.iml new file mode 100644 index 00000000000..82d3e6bdf49 --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JS/JS.iml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JS/src/test/test.kt b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JS/src/test/test.kt new file mode 100644 index 00000000000..6ac1f5603bc --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JS/src/test/test.kt @@ -0,0 +1,13 @@ +package test + +impl class C { + impl fun foo() { } + impl fun foo(n: Int) { } + impl fun bar(n: Int) { } +} + +fun test(c: C) { + c.foo() + c.foo(1) + c.bar(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JVM/JVM.iml new file mode 100644 index 00000000000..c3173af9ec7 --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JVM/JVM.iml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JVM/src/test/test.kt b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JVM/src/test/test.kt new file mode 100644 index 00000000000..6ac1f5603bc --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByHeaderClassMemberFun/before/JVM/src/test/test.kt @@ -0,0 +1,13 @@ +package test + +impl class C { + impl fun foo() { } + impl fun foo(n: Int) { } + impl fun bar(n: Int) { } +} + +fun test(c: C) { + c.foo() + c.foo(1) + c.bar(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/Common/Common.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/Common/Common.iml new file mode 100644 index 00000000000..0ecf9949f6c --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/Common/Common.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/Common/src/test/test.kt b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/Common/src/test/test.kt new file mode 100644 index 00000000000..63dba006a15 --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/Common/src/test/test.kt @@ -0,0 +1,13 @@ +package test + +header class C { + fun foo() + fun baz(n: Int) + fun bar(n: Int) +} + +fun test(c: C) { + c.foo() + c.baz(1) + c.bar(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JS/JS.iml new file mode 100644 index 00000000000..82d3e6bdf49 --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JS/JS.iml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JS/src/test/test.kt b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JS/src/test/test.kt new file mode 100644 index 00000000000..157331fee4d --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JS/src/test/test.kt @@ -0,0 +1,13 @@ +package test + +impl class C { + impl fun foo() { } + impl fun baz(n: Int) { } + impl fun bar(n: Int) { } +} + +fun test(c: C) { + c.foo() + c.baz(1) + c.bar(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JVM/JVM.iml new file mode 100644 index 00000000000..c3173af9ec7 --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JVM/JVM.iml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JVM/src/test/test.kt b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JVM/src/test/test.kt new file mode 100644 index 00000000000..157331fee4d --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/after/JVM/src/test/test.kt @@ -0,0 +1,13 @@ +package test + +impl class C { + impl fun foo() { } + impl fun baz(n: Int) { } + impl fun bar(n: Int) { } +} + +fun test(c: C) { + c.foo() + c.baz(1) + c.bar(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/Common/Common.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/Common/Common.iml new file mode 100644 index 00000000000..0ecf9949f6c --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/Common/Common.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/Common/src/test/test.kt b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/Common/src/test/test.kt new file mode 100644 index 00000000000..7e3180861af --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/Common/src/test/test.kt @@ -0,0 +1,13 @@ +package test + +header class C { + fun foo() + fun foo(n: Int) + fun bar(n: Int) +} + +fun test(c: C) { + c.foo() + c.foo(1) + c.bar(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JS/JS.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JS/JS.iml new file mode 100644 index 00000000000..82d3e6bdf49 --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JS/JS.iml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JS/src/test/test.kt b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JS/src/test/test.kt new file mode 100644 index 00000000000..453add37d7d --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JS/src/test/test.kt @@ -0,0 +1,13 @@ +package test + +impl class C { + impl fun foo() { } + impl fun foo(n: Int) { } + impl fun bar(n: Int) { } +} + +fun test(c: C) { + c.foo() + c.foo(1) + c.bar(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JVM/JVM.iml b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JVM/JVM.iml new file mode 100644 index 00000000000..c3173af9ec7 --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JVM/JVM.iml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JVM/src/test/test.kt b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JVM/src/test/test.kt new file mode 100644 index 00000000000..6ac1f5603bc --- /dev/null +++ b/idea/testData/refactoring/changeSignatureMultiModule/headersAndImplsByImplClassMemberFun/before/JVM/src/test/test.kt @@ -0,0 +1,13 @@ +package test + +impl class C { + impl fun foo() { } + impl fun foo(n: Int) { } + impl fun bar(n: Int) { } +} + +fun test(c: C) { + c.foo() + c.foo(1) + c.bar(1) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinMultiModuleChangeSignatureTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinMultiModuleChangeSignatureTest.kt index ccd6e40bdc2..e7b87e58a90 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinMultiModuleChangeSignatureTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinMultiModuleChangeSignatureTest.kt @@ -55,4 +55,12 @@ class KotlinMultiModuleChangeSignatureTest : KotlinMultiFileTestCase() { fun testHeadersAndImplsByImplFun() = doTest("JS/src/test/test.kt") { newName = "baz" } + + fun testHeadersAndImplsByHeaderClassMemberFun() = doTest("Common/src/test/test.kt") { + newName = "baz" + } + + fun testHeadersAndImplsByImplClassMemberFun() = doTest("JS/src/test/test.kt") { + newName = "baz" + } }