package de.plushnikov.intellij.plugin.psi;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiIdentifier;
import com.intellij.psi.PsiManager;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.PsiType;
import com.intellij.psi.impl.CheckUtil;
import com.intellij.psi.impl.light.LightFieldBuilder;
import com.intellij.psi.impl.light.LightModifierList;
import com.intellij.util.IncorrectOperationException;
import de.plushnikov.intellij.plugin.icon.LombokIcons;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
/**
* @author Plushnikov Michail
*/
public class LombokLightFieldBuilder extends LightFieldBuilder {
protected String myName;
protected final LombokLightIdentifier myNameIdentifier;
public LombokLightFieldBuilder(@NotNull PsiManager manager, @NotNull String name, @NotNull PsiType type) {
super(manager, name, type);
myName = name;
myNameIdentifier = new LombokLightIdentifier(manager, name);
setBaseIcon(LombokIcons.FIELD_ICON);
}
public LombokLightFieldBuilder withContainingClass(PsiClass psiClass) {
setContainingClass(psiClass);
return this;
}
public LombokLightFieldBuilder withModifier(@PsiModifier.ModifierConstant @NotNull @NonNls String modifier) {
((LightModifierList) getModifierList()).addModifier(modifier);
return this;
}
public LombokLightFieldBuilder withNavigationElement(PsiElement navigationElement) {
setNavigationElement(navigationElement);
return this;
}
@NotNull
@Override
public String getName() {
return myName;
}
@Override
public PsiElement setName(@NotNull String name) {
myName = name;
myNameIdentifier.setText(myName);
return this;
}
@NotNull
@Override
public PsiIdentifier getNameIdentifier() {
return myNameIdentifier;
}
public String toString() {
return "LombokLightFieldBuilder: " + getName();
}
@Override
public PsiElement replace(@NotNull PsiElement newElement) throws IncorrectOperationException {
// just add new element to the containing class
final PsiClass containingClass = getContainingClass();
if (null != containingClass) {
CheckUtil.checkWritable(containingClass);
return containingClass.add(newElement);
}
return null;
}
@Override
public TextRange getTextRange() {
TextRange r = super.getTextRange();
return r == null ? TextRange.EMPTY_RANGE : r;
}
@Override
public void delete() throws IncorrectOperationException {
// simple do nothing
}
@Override
public void checkDelete() throws IncorrectOperationException {
// simple do nothing
}
@Override
public boolean isEquivalentTo(PsiElement another) {
if (another instanceof LombokLightFieldBuilder) {
final LombokLightFieldBuilder anotherLightField = (LombokLightFieldBuilder) another;
boolean stillEquivalent = getName().equals(anotherLightField.getName()) &&
getType().equals(anotherLightField.getType());
if (stillEquivalent) {
final PsiClass containingClass = getContainingClass();
final PsiClass anotherContainingClass = anotherLightField.getContainingClass();
stillEquivalent = (null == containingClass && null == anotherContainingClass) ||
(null != containingClass && containingClass.isEquivalentTo(anotherContainingClass));
}
return stillEquivalent;
} else {
return super.isEquivalentTo(another);
}
}
}