Light Classes: Track original declaration for Kotlin light fields
#KT-4902 Fixed
This commit is contained in:
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
+31
-3
@@ -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"
|
||||
}
|
||||
}
|
||||
+12
@@ -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);
|
||||
}
|
||||
}
|
||||
+4
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user