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.PsiMethod;
|
||||||
import com.intellij.psi.impl.PsiClassImplUtil;
|
import com.intellij.psi.impl.PsiClassImplUtil;
|
||||||
import com.intellij.psi.impl.light.AbstractLightClass;
|
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.light.LightMethod;
|
||||||
import com.intellij.psi.impl.source.ClassInnerStuffCache;
|
import com.intellij.psi.impl.source.ClassInnerStuffCache;
|
||||||
import com.intellij.psi.impl.source.PsiExtensibleClass;
|
import com.intellij.psi.impl.source.PsiExtensibleClass;
|
||||||
@@ -31,6 +32,7 @@ import com.intellij.util.Function;
|
|||||||
import com.intellij.util.containers.ContainerUtil;
|
import com.intellij.util.containers.ContainerUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.psi.JetDeclaration;
|
import org.jetbrains.jet.lang.psi.JetDeclaration;
|
||||||
|
import org.jetbrains.jet.lang.psi.JetProperty;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -109,7 +111,10 @@ public abstract class KotlinWrappingLightClass extends AbstractLightClass implem
|
|||||||
return ContainerUtil.map(getDelegate().getFields(), new Function<PsiField, PsiField>() {
|
return ContainerUtil.map(getDelegate().getFields(), new Function<PsiField, PsiField>() {
|
||||||
@Override
|
@Override
|
||||||
public PsiField fun(PsiField field) {
|
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.NonNls;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
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
|
// Copy of com.intellij.psi.impl.light.LightField
|
||||||
@SuppressWarnings("UnnecessaryFinalOnLocalVariableOrParameter")
|
@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 PsiField myField;
|
||||||
private final PsiClass myContainingClass;
|
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);
|
super(manager, JavaLanguage.INSTANCE);
|
||||||
|
myOriginalProperty = originalProperty;
|
||||||
myField = field;
|
myField = field;
|
||||||
myContainingClass = containingClass;
|
myContainingClass = containingClass;
|
||||||
}
|
}
|
||||||
@@ -127,9 +136,10 @@ public class LightField extends LightElement implements PsiField {
|
|||||||
return myField.getText();
|
return myField.getText();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public PsiElement copy() {
|
public PsiElement copy() {
|
||||||
return new LightField(myManager, (PsiField)myField.copy(), myContainingClass);
|
return new KotlinLightField(myManager, myOriginalProperty, (PsiField)myField.copy(), myContainingClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -146,4 +156,22 @@ public class LightField extends LightElement implements PsiField {
|
|||||||
public String toString() {
|
public String toString() {
|
||||||
return "PsiField:" + getName();
|
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");
|
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")
|
@TestMetadata("javaPropertyReadUsages.0.kt")
|
||||||
public void testJavaPropertyReadUsages() throws Exception {
|
public void testJavaPropertyReadUsages() throws Exception {
|
||||||
doTest("idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages.0.kt");
|
doTest("idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages.0.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user