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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user