diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinWrappingLightClass.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinWrappingLightClass.java index 44c86be46a2..cf6b811f186 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinWrappingLightClass.java +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinWrappingLightClass.java @@ -149,6 +149,9 @@ public abstract class KotlinWrappingLightClass extends AbstractLightClass implem @Override public PsiMethod invoke(PsiMethod method) { JetDeclaration declaration = ClsWrapperStubPsiFactory.getOriginalDeclaration(method); + if (declaration instanceof JetPropertyAccessor) { + declaration = PsiTreeUtil.getParentOfType(declaration, JetProperty.class); + } if (declaration != null) { return !isTraitFakeOverride(declaration) ? diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.java index 0a019020254..26ae3767cc7 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.java +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.java @@ -146,7 +146,18 @@ public class LightClassUtil { @Nullable public static PsiMethod getLightClassAccessorMethod(@NotNull JetPropertyAccessor accessor) { - return getPsiMethodWrapper(accessor); + JetProperty property = PsiTreeUtil.getParentOfType(accessor, JetProperty.class); + if (property == null) { + return null; + } + List wrappers = getPsiMethodWrappers(property, true); + for (PsiMethod wrapper : wrappers) { + if ((accessor.isGetter() && !wrapper.getName().startsWith(JvmAbi.SETTER_PREFIX)) || + (accessor.isSetter() && wrapper.getName().startsWith(JvmAbi.SETTER_PREFIX))) { + return wrapper; + } + } + return null; } @Nullable @@ -331,13 +342,13 @@ public class LightClassUtil { for (PsiMethod wrapper : wrappers) { if (wrapper.getName().startsWith(JvmAbi.SETTER_PREFIX)) { - assert setterWrapper == null : String.format( + assert setterWrapper == null || setterWrapper == specialSetter: String.format( "Setter accessor isn't expected to be reassigned (old: %s, new: %s)", setterWrapper, wrapper); setterWrapper = wrapper; } else { - assert getterWrapper == null : String.format( + assert getterWrapper == null || getterWrapper == specialGetter: String.format( "Getter accessor isn't expected to be reassigned (old: %s, new: %s)", getterWrapper, wrapper); getterWrapper = wrapper; diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinWrapperForJavaUsageInfos.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinWrapperForJavaUsageInfos.kt index f1ade8c2a92..a1c3559cc11 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinWrapperForJavaUsageInfos.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinWrapperForJavaUsageInfos.kt @@ -30,6 +30,6 @@ public class KotlinWrapperForJavaUsageInfos( } override fun equals(other: Any?): Boolean { - return other == this || (other is KotlinWrapperForJavaUsageInfos && javaChangeInfo.getMethod() == other.javaChangeInfo.getMethod()) + return other === this || (other is KotlinWrapperForJavaUsageInfos && javaChangeInfo.getMethod() == other.javaChangeInfo.getMethod()) } } diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides.results.txt index f5ce8878615..08e43f8055f 100644 --- a/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides.results.txt +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides.results.txt @@ -1,5 +1,4 @@ -[javaAndKotlinOverrides.0.kt] Unclassified usage (13: 9) set(value: String) { [javaAndKotlinOverrides.0.kt] Unclassified usage (25: 18) override var foo: String = "" -[javaAndKotlinOverrides.0.kt] Unclassified usage (9: 9) get() { +[javaAndKotlinOverrides.0.kt] Unclassified usage (8: 18) override var foo: String [javaAndKotlinOverrides.1.java] Unclassified usage (12: 17) public void setFoo(String s) { [javaAndKotlinOverrides.1.java] Unclassified usage (7: 19) public String getFoo() { \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.results.txt index 9f2fb628229..c0b4bafa005 100644 --- a/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.results.txt +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.results.txt @@ -1,6 +1,5 @@ -[javaAndKotlinOverrides2.0.kt] Unclassified usage (11: 9) set(value: String) { [javaAndKotlinOverrides2.0.kt] Unclassified usage (23: 18) override var foo: String = "" [javaAndKotlinOverrides2.0.kt] Unclassified usage (26: 30) open class E(override var foo: T): A(foo) -[javaAndKotlinOverrides2.0.kt] Unclassified usage (7: 9) get() { +[javaAndKotlinOverrides2.0.kt] Unclassified usage (6: 18) override var foo: String [javaAndKotlinOverrides2.1.java] Unclassified usage (12: 17) public void setFoo(String s) { [javaAndKotlinOverrides2.1.java] Unclassified usage (7: 19) public String getFoo() { \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameKotlinValProperty/after/testing/GroovyClient.groovy b/idea/testData/refactoring/rename/renameKotlinValProperty/after/testing/GroovyClient.groovy new file mode 100644 index 00000000000..3b5e23de5cf --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinValProperty/after/testing/GroovyClient.groovy @@ -0,0 +1,32 @@ +package testing; + +import testing.rename.*; + +class GroovyClient { + public void foo(AP ap, DP dp) { + ap.getSecond + new BP().getSecond + new CP().getSecond + + dp.getSecond + new EP().second + new FP().second + } + + public interface DP extends AP { + } + + public static class EP implements DP { + @Override + public int getSecond() { + return 3; + } + } + + public static class FP extends EP { + @Override + public int getSecond() { + return 4; + } + } +} diff --git a/idea/testData/refactoring/rename/renameKotlinValProperty/before/testing/GroovyClient.groovy b/idea/testData/refactoring/rename/renameKotlinValProperty/before/testing/GroovyClient.groovy new file mode 100644 index 00000000000..31b44c9c796 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinValProperty/before/testing/GroovyClient.groovy @@ -0,0 +1,32 @@ +package testing; + +import testing.rename.*; + +class GroovyClient { + public void foo(AP ap, DP dp) { + ap.first + new BP().first + new CP().first + + dp.first + new EP().first + new FP().first + } + + public interface DP extends AP { + } + + public static class EP implements DP { + @Override + public int getFirst() { + return 3; + } + } + + public static class FP extends EP { + @Override + public int getFirst() { + return 4; + } + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/javaFacade/JetJavaFacadeTest.java b/idea/tests/org/jetbrains/kotlin/idea/javaFacade/JetJavaFacadeTest.java index f41d01efdbd..5f89796501e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/javaFacade/JetJavaFacadeTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/javaFacade/JetJavaFacadeTest.java @@ -241,11 +241,8 @@ public class JetJavaFacadeTest extends JetLightCodeInsightFixtureTestCase { // Should not fail! LightClassUtil.PropertyAccessorsPsiMethods propertyAccessors = LightClassUtil.getLightClassPropertyMethods(jetProperty); - JetPropertyAccessor getter = jetProperty.getGetter(); - JetPropertyAccessor setter = jetProperty.getSetter(); - - checkDeclarationMethodWrapped(shouldWrapGetter, getter != null ? getter : jetProperty, propertyAccessors.getGetter()); - checkDeclarationMethodWrapped(shouldWrapSetter, setter != null ? setter : jetProperty, propertyAccessors.getSetter()); + checkDeclarationMethodWrapped(shouldWrapGetter, jetProperty, propertyAccessors.getGetter()); + checkDeclarationMethodWrapped(shouldWrapSetter, jetProperty, propertyAccessors.getSetter()); } private void doTestWrapPropertyAccessor(boolean shouldWrapAccessor) { @@ -253,7 +250,9 @@ public class JetJavaFacadeTest extends JetLightCodeInsightFixtureTestCase { // Should not fail! PsiMethod propertyAccessors = LightClassUtil.getLightClassAccessorMethod(jetPropertyAccessor); - checkDeclarationMethodWrapped(shouldWrapAccessor, jetPropertyAccessor, propertyAccessors); + checkDeclarationMethodWrapped(shouldWrapAccessor, + PsiTreeUtil.getParentOfType(jetPropertyAccessor, JetProperty.class), + propertyAccessors); } @NotNull