package de.plushnikov.intellij.plugin.util; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiAnnotationMemberValue; import com.intellij.psi.PsiAnnotationParameterList; import com.intellij.psi.PsiModifier; import com.intellij.psi.PsiModifierList; import com.intellij.psi.PsiModifierListOwner; import com.intellij.psi.util.PsiUtil; import lombok.AccessLevel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; /** * @author Plushnikov Michail */ public class LombokProcessorUtil { private static final Map<String, AccessLevel> ACCESS_LEVEL_MAP = new HashMap<String, AccessLevel>() {{ put(PsiModifier.PUBLIC, AccessLevel.PUBLIC); put(PsiModifier.PACKAGE_LOCAL, AccessLevel.PACKAGE); put(PsiModifier.PROTECTED, AccessLevel.PROTECTED); put(PsiModifier.PRIVATE, AccessLevel.PRIVATE); }}; @Nullable public static String getMethodModifier(@NotNull PsiAnnotation psiAnnotation) { return convertAccessLevelToJavaModifier(PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "value")); } @Nullable public static String getAccessVisibility(@NotNull PsiAnnotation psiAnnotation) { return convertAccessLevelToJavaModifier(PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "access")); } @NotNull public static Collection<String> getOnX(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameterName) { PsiAnnotationMemberValue onXValue = psiAnnotation.findAttributeValue(parameterName); if (!(onXValue instanceof PsiAnnotation)) { return Collections.emptyList(); } Collection<PsiAnnotation> annotations = PsiAnnotationUtil.getAnnotationValues((PsiAnnotation) onXValue, "value", PsiAnnotation.class); Collection<String> annotationStrings = new ArrayList<String>(); for (PsiAnnotation annotation : annotations) { PsiAnnotationParameterList params = annotation.getParameterList(); annotationStrings.add(PsiAnnotationSearchUtil.getSimpleNameOf(annotation) + params.getText()); } return annotationStrings; } @Nullable private static String convertAccessLevelToJavaModifier(String value) { if (null == value || value.isEmpty()) { return PsiModifier.PUBLIC; } if ("PUBLIC".equals(value)) { return PsiModifier.PUBLIC; } if ("MODULE".equals(value)) { return PsiModifier.PACKAGE_LOCAL; } if ("PROTECTED".equals(value)) { return PsiModifier.PROTECTED; } if ("PACKAGE".equals(value)) { return PsiModifier.PACKAGE_LOCAL; } if ("PRIVATE".equals(value)) { return PsiModifier.PRIVATE; } if ("NONE".equals(value)) { return null; } return null; } @NotNull public static PsiAnnotation createAnnotationWithAccessLevel(@NotNull Class<? extends Annotation> annotationClass, @NotNull PsiModifierListOwner psiModifierListOwner) { String value = ""; final PsiModifierList modifierList = psiModifierListOwner.getModifierList(); if (null != modifierList) { final String accessModifier = PsiUtil.getAccessModifier(PsiUtil.getAccessLevel(modifierList)); if (null != accessModifier) { final AccessLevel accessLevel = ACCESS_LEVEL_MAP.get(accessModifier); if (null != accessLevel && !AccessLevel.PUBLIC.equals(accessLevel)) { value = AccessLevel.class.getName() + "." + accessLevel; } } } return PsiAnnotationUtil.createPsiAnnotation(psiModifierListOwner, annotationClass, value); } }