diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtConstructorDelegationReference.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtConstructorDelegationReference.java index 5ad83e1cdda..9acde94aba0 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtConstructorDelegationReference.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtConstructorDelegationReference.java @@ -17,7 +17,9 @@ package org.jetbrains.kotlin.idea.references; import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.KtConstructorDelegationReferenceExpression; @@ -39,4 +41,11 @@ public class KtConstructorDelegationReference extends KtSimpleReference getResolvesByNames() { return Collections.emptyList(); } + + @Nullable + @Override + public PsiElement handleElementRename(@Nullable String newElementName) { + // Class rename never affects this reference, so there is no need to fail with exception + return getExpression(); + } } diff --git a/idea/testData/refactoring/rename/renameJavaClassWithKtConstructorDelegation/after/Banana2.java b/idea/testData/refactoring/rename/renameJavaClassWithKtConstructorDelegation/after/Banana2.java new file mode 100644 index 00000000000..0386ac9ea0b --- /dev/null +++ b/idea/testData/refactoring/rename/renameJavaClassWithKtConstructorDelegation/after/Banana2.java @@ -0,0 +1,13 @@ +import java.util.function.Supplier; + +public class Banana2 { + final Supplier f; + + Banana2(Supplier f) {this.f = f;} + + Banana2() {this(() -> "Default");} + + void goCrazy() { + System.out.println(f.get()); + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameJavaClassWithKtConstructorDelegation/after/bananitos.kt b/idea/testData/refactoring/rename/renameJavaClassWithKtConstructorDelegation/after/bananitos.kt new file mode 100644 index 00000000000..ff9f6d2abb5 --- /dev/null +++ b/idea/testData/refactoring/rename/renameJavaClassWithKtConstructorDelegation/after/bananitos.kt @@ -0,0 +1,20 @@ +class DoesntWork : Banana2 { + constructor() : super() + constructor(f: () -> String) : super(f) + + companion object { + @JvmStatic fun main(args: Array) { + val inst = DoesntWork {"Hi there"} + inst.goCrazy() + } + } +} + +class ThisWorks(f: () -> String) : Banana2(f) { + companion object { + @JvmStatic fun main(args: Array) { + val inst = ThisWorks {"Hi there"} + inst.goCrazy() + } + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameJavaClassWithKtConstructorDelegation/before/Banana.java b/idea/testData/refactoring/rename/renameJavaClassWithKtConstructorDelegation/before/Banana.java new file mode 100644 index 00000000000..d4553cc321a --- /dev/null +++ b/idea/testData/refactoring/rename/renameJavaClassWithKtConstructorDelegation/before/Banana.java @@ -0,0 +1,13 @@ +import java.util.function.Supplier; + +public class Banana { + final Supplier f; + + Banana(Supplier f) {this.f = f;} + + Banana() {this(() -> "Default");} + + void goCrazy() { + System.out.println(f.get()); + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameJavaClassWithKtConstructorDelegation/before/bananitos.kt b/idea/testData/refactoring/rename/renameJavaClassWithKtConstructorDelegation/before/bananitos.kt new file mode 100644 index 00000000000..c595d647d4f --- /dev/null +++ b/idea/testData/refactoring/rename/renameJavaClassWithKtConstructorDelegation/before/bananitos.kt @@ -0,0 +1,20 @@ +class DoesntWork : Banana { + constructor() : super() + constructor(f: () -> String) : super(f) + + companion object { + @JvmStatic fun main(args: Array) { + val inst = DoesntWork {"Hi there"} + inst.goCrazy() + } + } +} + +class ThisWorks(f: () -> String) : Banana(f) { + companion object { + @JvmStatic fun main(args: Array) { + val inst = ThisWorks {"Hi there"} + inst.goCrazy() + } + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameJavaClassWithKtConstructorDelegation/renameJavaClassWithKtConstructorDelegation.test b/idea/testData/refactoring/rename/renameJavaClassWithKtConstructorDelegation/renameJavaClassWithKtConstructorDelegation.test new file mode 100644 index 00000000000..2a15078c79c --- /dev/null +++ b/idea/testData/refactoring/rename/renameJavaClassWithKtConstructorDelegation/renameJavaClassWithKtConstructorDelegation.test @@ -0,0 +1,5 @@ +{ + "type": "JAVA_CLASS", + "classId": "Banana", + "newName": "Banana2" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java index 847c4a42ff8..8d5e9c4afb9 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java @@ -684,6 +684,12 @@ public class RenameTestGenerated extends AbstractRenameTest { doTest(fileName); } + @TestMetadata("renameJavaClassWithKtConstructorDelegation/renameJavaClassWithKtConstructorDelegation.test") + public void testRenameJavaClassWithKtConstructorDelegation_RenameJavaClassWithKtConstructorDelegation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameJavaClassWithKtConstructorDelegation/renameJavaClassWithKtConstructorDelegation.test"); + doTest(fileName); + } + @TestMetadata("renameJavaInterface/renameJavaInterface.test") public void testRenameJavaInterface_RenameJavaInterface() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameJavaInterface/renameJavaInterface.test");