package de.plushnikov.intellij.plugin.processor.modifier;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.PsiModifierList;
import com.intellij.psi.PsiModifierListOwner;
import com.intellij.psi.util.PsiTreeUtil;
import de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil;
import org.jetbrains.annotations.NotNull;
import java.util.Set;
/**
* @author Alexej Kubarev
*/
public class ValueModifierProcessor implements ModifierProcessor {
@Override
@SuppressWarnings("unchecked")
public boolean isSupported(@NotNull PsiModifierList modifierList) {
final PsiElement modifierListParent = modifierList.getParent();
if (!(modifierListParent instanceof PsiField || modifierListParent instanceof PsiClass)) {
return false;
}
PsiClass searchableClass = PsiTreeUtil.getParentOfType(modifierList, PsiClass.class, true);
return null != searchableClass && PsiAnnotationSearchUtil.isAnnotatedWith(searchableClass, lombok.Value.class, lombok.experimental.Value.class);
}
@Override
public void transformModifiers(@NotNull PsiModifierList modifierList, @NotNull final Set<String> modifiers) {
final PsiModifierListOwner parentElement = PsiTreeUtil.getParentOfType(modifierList, PsiModifierListOwner.class, false);
if (null != parentElement) {
// FINAL
if (!PsiAnnotationSearchUtil.isAnnotatedWith(parentElement, lombok.experimental.NonFinal.class)) {
modifiers.add(PsiModifier.FINAL);
}
// PRIVATE
if (modifierList.getParent() instanceof PsiField &&
// Visibility is only changed for package private fields
hasPackagePrivateModifier(modifierList) &&
// except they are annotated with @PackagePrivate
!PsiAnnotationSearchUtil.isAnnotatedWith(parentElement, lombok.experimental.PackagePrivate.class)) {
modifiers.add(PsiModifier.PRIVATE);
// IDEA _right now_ checks if other modifiers are set, and ignores PACKAGE_LOCAL but may as well clean it up
modifiers.remove(PsiModifier.PACKAGE_LOCAL);
}
}
}
private boolean hasPackagePrivateModifier(@NotNull PsiModifierList modifierList) {
return !(modifierList.hasExplicitModifier(PsiModifier.PUBLIC) || modifierList.hasExplicitModifier(PsiModifier.PRIVATE) ||
modifierList.hasExplicitModifier(PsiModifier.PROTECTED));
}
}