From 4678a5866ac15985cb5cd406dc470e2d1d437008 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 28 May 2014 14:35:04 +0400 Subject: [PATCH] Light Classes: Track original declaration for Kotlin light fields #KT-4902 Fixed --- .../jet/asJava/KotlinWrappingLightClass.java | 9 +++-- ...{LightField.java => KotlinLightField.java} | 34 +++++++++++++++++-- .../javaClassObjectPropertyUsages.0.kt | 9 +++++ .../javaClassObjectPropertyUsages.1.java | 12 +++++++ .../javaClassObjectPropertyUsages.results.txt | 4 +++ .../JetFindUsagesTestGenerated.java | 5 +++ 6 files changed, 68 insertions(+), 5 deletions(-) rename compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/light/{LightField.java => KotlinLightField.java} (78%) create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/javaClassObjectPropertyUsages.0.kt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/javaClassObjectPropertyUsages.1.java create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/javaClassObjectPropertyUsages.results.txt diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinWrappingLightClass.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinWrappingLightClass.java index e47e79a18f5..44b7c2aac39 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinWrappingLightClass.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinWrappingLightClass.java @@ -23,7 +23,8 @@ import com.intellij.psi.PsiManager; import com.intellij.psi.PsiMethod; import com.intellij.psi.impl.PsiClassImplUtil; import com.intellij.psi.impl.light.AbstractLightClass; -import org.jetbrains.jet.asJava.light.LightField; +import com.intellij.psi.impl.light.LightField; +import org.jetbrains.jet.asJava.light.KotlinLightField; import com.intellij.psi.impl.light.LightMethod; import com.intellij.psi.impl.source.ClassInnerStuffCache; import com.intellij.psi.impl.source.PsiExtensibleClass; @@ -31,6 +32,7 @@ import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetDeclaration; +import org.jetbrains.jet.lang.psi.JetProperty; import java.util.List; @@ -109,7 +111,10 @@ public abstract class KotlinWrappingLightClass extends AbstractLightClass implem return ContainerUtil.map(getDelegate().getFields(), new Function() { @Override public PsiField fun(PsiField field) { - return new LightField(myManager, field, KotlinWrappingLightClass.this); + JetDeclaration declaration = ClsWrapperStubPsiFactory.getOriginalDeclaration(field); + return declaration instanceof JetProperty + ? new KotlinLightField(myManager, (JetProperty) declaration, field, KotlinWrappingLightClass.this) + : new LightField(myManager, field, KotlinWrappingLightClass.this); } }); } diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/light/LightField.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/light/KotlinLightField.java similarity index 78% rename from compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/light/LightField.java rename to compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/light/KotlinLightField.java index 0205398a85c..e61d14a2b36 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/light/LightField.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/light/KotlinLightField.java @@ -26,15 +26,24 @@ import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.psi.JetProperty; +import org.jetbrains.jet.lang.resolve.java.jetAsJava.KotlinLightElement; // Copy of com.intellij.psi.impl.light.LightField @SuppressWarnings("UnnecessaryFinalOnLocalVariableOrParameter") -public class LightField extends LightElement implements PsiField { +public class KotlinLightField extends LightElement implements PsiField, KotlinLightElement { + private final JetProperty myOriginalProperty; private final PsiField myField; private final PsiClass myContainingClass; - public LightField(@NotNull final PsiManager manager, @NotNull final PsiField field, @NotNull final PsiClass containingClass) { + public KotlinLightField( + @NotNull final PsiManager manager, + @NotNull final JetProperty originalProperty, + @NotNull final PsiField field, + @NotNull final PsiClass containingClass + ) { super(manager, JavaLanguage.INSTANCE); + myOriginalProperty = originalProperty; myField = field; myContainingClass = containingClass; } @@ -127,9 +136,10 @@ public class LightField extends LightElement implements PsiField { return myField.getText(); } + @NotNull @Override public PsiElement copy() { - return new LightField(myManager, (PsiField)myField.copy(), myContainingClass); + return new KotlinLightField(myManager, myOriginalProperty, (PsiField)myField.copy(), myContainingClass); } @Override @@ -146,4 +156,22 @@ public class LightField extends LightElement implements PsiField { public String toString() { return "PsiField:" + getName(); } + + @NotNull + @Override + public JetProperty getOrigin() { + return myOriginalProperty; + } + + @NotNull + @Override + public PsiField getDelegate() { + return myField; + } + + @NotNull + @Override + public PsiElement getNavigationElement() { + return getOrigin(); + } } diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaClassObjectPropertyUsages.0.kt b/idea/testData/findUsages/kotlin/findPropertyUsages/javaClassObjectPropertyUsages.0.kt new file mode 100644 index 00000000000..08da5552512 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaClassObjectPropertyUsages.0.kt @@ -0,0 +1,9 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetProperty +// OPTIONS: usages +package server; + +class A { + class object { + var foo: String = "foo" + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaClassObjectPropertyUsages.1.java b/idea/testData/findUsages/kotlin/findPropertyUsages/javaClassObjectPropertyUsages.1.java new file mode 100644 index 00000000000..c64c7e1c2bc --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaClassObjectPropertyUsages.1.java @@ -0,0 +1,12 @@ +package client; + +import server.* + +class Client { + fun fooBar() { + A.object$.setFoo("a"); + A.foo = "a"; + println("a.foo = " + A.object$.getFoo()); + println("a.foo = " + A.foo); + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaClassObjectPropertyUsages.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/javaClassObjectPropertyUsages.results.txt new file mode 100644 index 00000000000..bd873eac76b --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaClassObjectPropertyUsages.results.txt @@ -0,0 +1,4 @@ +Unclassified usage (10: 32) println("a.foo = " + A.foo); +Unclassified usage (7: 19) A.object$.setFoo("a"); +Unclassified usage (8: 11) A.foo = "a"; +Unclassified usage (9: 40) println("a.foo = " + A.object$.getFoo()); \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java index f9829a9077c..a6613f63e57 100644 --- a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java @@ -422,6 +422,11 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { doTest("idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.0.kt"); } + @TestMetadata("javaClassObjectPropertyUsages.0.kt") + public void testJavaClassObjectPropertyUsages() throws Exception { + doTest("idea/testData/findUsages/kotlin/findPropertyUsages/javaClassObjectPropertyUsages.0.kt"); + } + @TestMetadata("javaPropertyReadUsages.0.kt") public void testJavaPropertyReadUsages() throws Exception { doTest("idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages.0.kt");