From 40c8c3b8c95956367781017523e6833b6dd4404e Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Thu, 21 Jun 2012 20:37:34 +0400 Subject: [PATCH] IDEA-82078 fix updating R references when renaming of Android resources --- .../rename/RenameJavaVariableProcessor.java | 2 +- .../android/augment/AndroidLightField.java | 125 ++++++++++++++++-- 2 files changed, 113 insertions(+), 14 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaVariableProcessor.java b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaVariableProcessor.java index 9c192e69d7a2..934c9fd6bf90 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaVariableProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaVariableProcessor.java @@ -120,7 +120,7 @@ public class RenameJavaVariableProcessor extends RenameJavaMemberProcessor { if (!(replacedOccurence instanceof PsiReferenceExpression)) return; PsiElement elem = ((PsiReferenceExpression)replacedOccurence).resolve(); - if (elem == null || elem == field) { + if (elem == null || elem == field || elem.isEquivalentTo(field)) { // If reference is unresolved, then field is not hidden by anyone... return; } diff --git a/plugins/android/src/org/jetbrains/android/augment/AndroidLightField.java b/plugins/android/src/org/jetbrains/android/augment/AndroidLightField.java index 7d780cf73532..a37874cc803e 100644 --- a/plugins/android/src/org/jetbrains/android/augment/AndroidLightField.java +++ b/plugins/android/src/org/jetbrains/android/augment/AndroidLightField.java @@ -1,39 +1,50 @@ package org.jetbrains.android.augment; +import com.intellij.lang.java.JavaLanguage; +import com.intellij.navigation.NavigationItem; import com.intellij.psi.*; +import com.intellij.psi.impl.ElementPresentationUtil; import com.intellij.psi.impl.PsiClassImplUtil; import com.intellij.psi.impl.PsiVariableEx; -import com.intellij.psi.impl.light.LightFieldBuilder; +import com.intellij.psi.impl.light.LightElement; +import com.intellij.psi.impl.light.LightModifierList; +import com.intellij.psi.javadoc.PsiDocComment; +import com.intellij.ui.RowIcon; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.PlatformIcons; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.swing.*; import java.util.ArrayList; import java.util.List; import java.util.Set; /** -* @author Eugene.Kudelevsky -*/ -class AndroidLightField extends LightFieldBuilder implements PsiVariableEx, SyntheticElement { + * @author Eugene.Kudelevsky + */ +class AndroidLightField extends LightElement implements PsiField, PsiVariableEx, NavigationItem { private final PsiClass myContext; private final PsiType myType; private final Object myConstantValue; - private final boolean myFinal; + + private volatile PsiExpression myInitializer; + private volatile String myName; + private volatile LightModifierList myModifierList; public AndroidLightField(@NotNull String name, @NotNull PsiClass context, @NotNull PsiType type, boolean isFinal, @Nullable Object constantValue) { - super(name, type, context); - myContext = context; + super(context.getManager(), JavaLanguage.INSTANCE); + myName = name; myType = type; + setNavigationElement(context); + myContext = context; myConstantValue = constantValue; - myFinal = isFinal; - setContainingClass(context); final List modifiers = new ArrayList(); modifiers.add(PsiModifier.PUBLIC); @@ -42,7 +53,7 @@ class AndroidLightField extends LightFieldBuilder implements PsiVariableEx, Synt if (isFinal) { modifiers.add(PsiModifier.FINAL); } - setModifiers(ArrayUtil.toStringArray(modifiers)); + myModifierList = new LightModifierList(getManager(), getLanguage(), ArrayUtil.toStringArray(modifiers)); } @Override @@ -58,9 +69,8 @@ class AndroidLightField extends LightFieldBuilder implements PsiVariableEx, Synt @Override public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException { - final AndroidLightField field = new AndroidLightField(name, myContext, myType, myFinal, myConstantValue); - field.setInitializer(getInitializer()); - return field; + myName = name; + return this; } @Override @@ -72,4 +82,93 @@ class AndroidLightField extends LightFieldBuilder implements PsiVariableEx, Synt public Object computeConstantValue() { return myConstantValue; } + + @Override + public void setInitializer(@Nullable PsiExpression initializer) throws IncorrectOperationException { + myInitializer = initializer; + } + + @Override + public PsiExpression getInitializer() { + return myInitializer; + } + + @Override + public PsiDocComment getDocComment() { + return null; + } + + @Override + public boolean isDeprecated() { + return false; + } + + @Override + public PsiClass getContainingClass() { + return myContext; + } + + @Override + public String toString() { + return "AndroidLightField:" + getName(); + } + + @NotNull + @Override + public PsiType getType() { + return myType; + } + + @Override + @NotNull + public PsiModifierList getModifierList() { + return myModifierList; + } + + @Override + public boolean hasModifierProperty(@NonNls @NotNull String name) { + return myModifierList.hasModifierProperty(name); + } + + @NotNull + @Override + public String getName() { + return myName; + } + + @Override + public PsiTypeElement getTypeElement() { + return null; + } + + @Override + public boolean hasInitializer() { + return false; + } + + @Override + public void normalizeDeclaration() throws IncorrectOperationException { + } + + @NotNull + @Override + public PsiIdentifier getNameIdentifier() { + throw new UnsupportedOperationException(); + } + + @Override + public PsiType getTypeNoResolve() { + return getType(); + } + + @Override + protected boolean isVisibilitySupported() { + return true; + } + + @Override + public Icon getElementIcon(final int flags) { + final RowIcon baseIcon = ElementPresentationUtil.createLayeredIcon(PlatformIcons.FIELD_ICON, this, false); + return ElementPresentationUtil.addVisibilityIcon(this, flags, baseIcon); + } }