package de.plushnikov.intellij.plugin.processor.clazz.constructor; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiField; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiModifier; import de.plushnikov.intellij.plugin.problem.ProblemBuilder; import de.plushnikov.intellij.plugin.processor.LombokPsiElementUsage; import de.plushnikov.intellij.plugin.util.LombokProcessorUtil; import de.plushnikov.intellij.plugin.util.PsiClassUtil; import lombok.RequiredArgsConstructor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.List; /** * @author Plushnikov Michail */ public class RequiredArgsConstructorProcessor extends AbstractConstructorClassProcessor { public RequiredArgsConstructorProcessor() { super(RequiredArgsConstructor.class, PsiMethod.class); } @Override protected boolean validate(@NotNull PsiAnnotation psiAnnotation, @NotNull PsiClass psiClass, @NotNull ProblemBuilder builder) { boolean result; result = super.validate(psiAnnotation, psiClass, builder); final Collection<PsiField> allReqFields = getRequiredFields(psiClass); final String staticConstructorName = getStaticConstructorName(psiAnnotation); if (!validateIsConstructorDefined(psiClass, staticConstructorName, allReqFields, builder)) { result = false; } return result; } protected void generatePsiElements(@NotNull PsiClass psiClass, @NotNull PsiAnnotation psiAnnotation, @NotNull List<? super PsiElement> target) { final String methodVisibility = LombokProcessorUtil.getAccessVisibility(psiAnnotation); if (null != methodVisibility) { target.addAll(createRequiredArgsConstructor(psiClass, methodVisibility, psiAnnotation, getStaticConstructorName(psiAnnotation))); } } @NotNull public Collection<PsiMethod> createRequiredArgsConstructor(@NotNull PsiClass psiClass, @PsiModifier.ModifierConstant @NotNull String methodModifier, @NotNull PsiAnnotation psiAnnotation, @Nullable String staticName) { final Collection<PsiField> allReqFields = getRequiredFields(psiClass); return createConstructorMethod(psiClass, methodModifier, psiAnnotation, false, allReqFields, staticName); } @Override public LombokPsiElementUsage checkFieldUsage(@NotNull PsiField psiField, @NotNull PsiAnnotation psiAnnotation) { final PsiClass containingClass = psiField.getContainingClass(); if (null != containingClass) { if (PsiClassUtil.getNames(getRequiredFields(containingClass)).contains(psiField.getName())) { return LombokPsiElementUsage.WRITE; } } return LombokPsiElementUsage.NONE; } }