| 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.LightElement; |
| import com.intellij.psi.impl.light.LightIdentifier; |
| 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 LightElement implements PsiField, PsiVariableEx, NavigationItem { |
| private final PsiClass myContext; |
| private final PsiType myType; |
| private final Object myConstantValue; |
| |
| 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(context.getManager(), JavaLanguage.INSTANCE); |
| myName = name; |
| myType = type; |
| myContext = context; |
| myConstantValue = constantValue; |
| |
| final List<String> modifiers = new ArrayList<String>(); |
| modifiers.add(PsiModifier.PUBLIC); |
| modifiers.add(PsiModifier.STATIC); |
| |
| if (isFinal) { |
| modifiers.add(PsiModifier.FINAL); |
| } |
| myModifierList = new LightModifierList(getManager(), getLanguage(), ArrayUtil.toStringArray(modifiers)); |
| } |
| |
| @Override |
| public boolean isEquivalentTo(PsiElement another) { |
| return PsiClassImplUtil.isFieldEquivalentTo(this, another); |
| } |
| |
| @Override |
| public PsiElement getParent() { |
| return myContext; |
| } |
| |
| @Nullable |
| @Override |
| public PsiFile getContainingFile() { |
| return myContext.getContainingFile(); |
| } |
| |
| @Override |
| public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException { |
| myName = name; |
| return this; |
| } |
| |
| @Override |
| public Object computeConstantValue(Set<PsiVariable> visitedVars) { |
| return computeConstantValue(); |
| } |
| |
| @Override |
| 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() { |
| return new LightIdentifier(getManager(), myName); |
| } |
| |
| @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); |
| } |
| } |