diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt
index 2ded6d7cd7d..60e41b48671 100644
--- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt
+++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt
@@ -43,7 +43,6 @@ import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory
import org.jetbrains.kotlin.resolve.calls.tasks.isSynthesizedInvoke
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
import org.jetbrains.kotlin.resolve.scopes.receivers.ThisReceiver
-import org.jetbrains.kotlin.resolve.source.getPsi
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
import org.jetbrains.kotlin.types.KotlinType
import java.util.*
@@ -126,17 +125,14 @@ data class ExtractionData(
return function == null || !function.isInsideOf(originalElements)
}
- fun getSyntheticPropertyAccessorDeclarationIfAny(descriptor: DeclarationDescriptor): PsiNameIdentifierOwner? {
- return (descriptor as? SyntheticJavaPropertyDescriptor ?: return null).getMethod.source.getPsi() as? PsiNameIdentifierOwner
- }
-
- fun getDeclaration(descriptor: DeclarationDescriptor, context: BindingContext): PsiNameIdentifierOwner? {
+ tailrec fun getDeclaration(descriptor: DeclarationDescriptor, context: BindingContext): PsiNameIdentifierOwner? {
(DescriptorToSourceUtilsIde.getAnyDeclaration(project, descriptor) as? PsiNameIdentifierOwner)?.let { return it }
return when {
isExtractableIt(descriptor, context) -> itFakeDeclaration
isSynthesizedInvoke(descriptor) -> synthesizedInvokeDeclaration
- else -> getSyntheticPropertyAccessorDeclarationIfAny(descriptor)
+ descriptor is SyntheticJavaPropertyDescriptor -> getDeclaration(descriptor.getMethod, context)
+ else -> null
}
}
diff --git a/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithDelegation.java b/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithDelegation.java
new file mode 100644
index 00000000000..b37222cd4d2
--- /dev/null
+++ b/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithDelegation.java
@@ -0,0 +1,6 @@
+import org.jetbrains.annotations.NotNull;
+
+interface Named {
+ @NotNull
+ String getName();
+}
\ No newline at end of file
diff --git a/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithDelegation.kt b/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithDelegation.kt
new file mode 100644
index 00000000000..e9a694da3a9
--- /dev/null
+++ b/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithDelegation.kt
@@ -0,0 +1,11 @@
+// WITH_RUNTIME
+// PARAM_DESCRIPTOR: private final fun NamedEx.foo(): [@org.jetbrains.annotations.NotNull] String defined in Test
+// PARAM_TYPES: NamedEx
+// SIBLING:
+public class Test {
+ private fun NamedEx.foo() = name
+}
+
+public class NamedEx : Named by object : Named {
+ override fun getName(): String = "foo"
+}
\ No newline at end of file
diff --git a/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithDelegation.kt.after b/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithDelegation.kt.after
new file mode 100644
index 00000000000..410e675fa89
--- /dev/null
+++ b/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithDelegation.kt.after
@@ -0,0 +1,13 @@
+// WITH_RUNTIME
+// PARAM_DESCRIPTOR: private final fun NamedEx.foo(): [@org.jetbrains.annotations.NotNull] String defined in Test
+// PARAM_TYPES: NamedEx
+// SIBLING:
+public class Test {
+ private fun NamedEx.foo() = s()
+}
+
+private fun NamedEx.s() = name
+
+public class NamedEx : Named by object : Named {
+ override fun getName(): String = "foo"
+}
\ No newline at end of file
diff --git a/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithOverride.java b/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithOverride.java
new file mode 100644
index 00000000000..ba7b0a4a459
--- /dev/null
+++ b/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithOverride.java
@@ -0,0 +1,10 @@
+import org.jetbrains.annotations.NotNull;
+
+interface Named {
+ @NotNull
+ String getName();
+}
+
+interface NamedEx extends Named {
+
+}
\ No newline at end of file
diff --git a/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithOverride.kt b/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithOverride.kt
new file mode 100644
index 00000000000..1b0cd1955a7
--- /dev/null
+++ b/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithOverride.kt
@@ -0,0 +1,7 @@
+// WITH_RUNTIME
+// PARAM_DESCRIPTOR: private final fun NamedEx.foo(): [@org.jetbrains.annotations.NotNull] String defined in Test
+// PARAM_TYPES: NamedEx
+// SIBLING:
+public class Test {
+ private fun NamedEx.foo() = name
+}
\ No newline at end of file
diff --git a/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithOverride.kt.after b/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithOverride.kt.after
new file mode 100644
index 00000000000..781ced9165f
--- /dev/null
+++ b/idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithOverride.kt.after
@@ -0,0 +1,9 @@
+// WITH_RUNTIME
+// PARAM_DESCRIPTOR: private final fun NamedEx.foo(): [@org.jetbrains.annotations.NotNull] String defined in Test
+// PARAM_TYPES: NamedEx
+// SIBLING:
+public class Test {
+ private fun NamedEx.foo() = s()
+}
+
+private fun NamedEx.s() = name
\ No newline at end of file
diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java
index aecaae99df2..74ec28c9f81 100644
--- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java
+++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java
@@ -1997,6 +1997,18 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
doExtractFunctionTest(fileName);
}
+ @TestMetadata("javaSyntheticPropertyWithDelegation.kt")
+ public void testJavaSyntheticPropertyWithDelegation() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithDelegation.kt");
+ doExtractFunctionTest(fileName);
+ }
+
+ @TestMetadata("javaSyntheticPropertyWithOverride.kt")
+ public void testJavaSyntheticPropertyWithOverride() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithOverride.kt");
+ doExtractFunctionTest(fileName);
+ }
+
@TestMetadata("missingReceiver.kt")
public void testMissingReceiver() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/missingReceiver.kt");