From bdd495460be536a7a3dc9b2fcac622e374733bae Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 16 Oct 2015 18:58:33 +0300 Subject: [PATCH] Extraction Engine: Properly retrieve declaration for overriden/delegated Java synthetic properties #KT-9554 Fixed --- .../introduce/extractionEngine/ExtractionData.kt | 10 +++------- .../javaSyntheticPropertyWithDelegation.java | 6 ++++++ .../javaSyntheticPropertyWithDelegation.kt | 11 +++++++++++ .../javaSyntheticPropertyWithDelegation.kt.after | 13 +++++++++++++ .../javaSyntheticPropertyWithOverride.java | 10 ++++++++++ .../javaSyntheticPropertyWithOverride.kt | 7 +++++++ .../javaSyntheticPropertyWithOverride.kt.after | 9 +++++++++ .../introduce/JetExtractionTestGenerated.java | 12 ++++++++++++ 8 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithDelegation.java create mode 100644 idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithDelegation.kt create mode 100644 idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithDelegation.kt.after create mode 100644 idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithOverride.java create mode 100644 idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithOverride.kt create mode 100644 idea/testData/refactoring/extractFunction/parameters/extractThis/javaSyntheticPropertyWithOverride.kt.after 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");