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();
}
}