Light Classes: Track original declaration for Kotlin light fields

#KT-4902 Fixed
This commit is contained in:
Alexey Sedunov
2014-05-28 14:35:04 +04:00
parent ab5e0c8c9c
commit 4678a5866a
6 changed files with 68 additions and 5 deletions
@@ -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<PsiField, PsiField>() {
@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);
}
});
}
@@ -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<JetProperty, PsiField> {
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();
}
}
@@ -0,0 +1,9 @@
// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetProperty
// OPTIONS: usages
package server;
class A {
class object {
var <caret>foo: String = "foo"
}
}
@@ -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);
}
}
@@ -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());
@@ -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");