package de.plushnikov.intellij.plugin.processor.method;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiType;
import de.plushnikov.intellij.plugin.problem.ProblemBuilder;
import de.plushnikov.intellij.plugin.processor.handler.DelegateHandler;
import de.plushnikov.intellij.plugin.settings.ProjectSettings;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class DelegateMethodProcessor extends AbstractMethodProcessor {
private final DelegateHandler handler;
@SuppressWarnings({"deprecation", "unchecked"})
public DelegateMethodProcessor(@NotNull DelegateHandler delegateHandler) {
super(PsiMethod.class, lombok.Delegate.class, lombok.experimental.Delegate.class);
handler = delegateHandler;
}
@Override
public boolean isEnabled(@NotNull PropertiesComponent propertiesComponent) {
return ProjectSettings.isEnabled(propertiesComponent, ProjectSettings.IS_DELEGATE_ENABLED);
}
@Override
protected boolean validate(@NotNull PsiAnnotation psiAnnotation, @NotNull PsiMethod psiMethod, @NotNull ProblemBuilder builder) {
boolean result = true;
if (psiMethod.getParameterList().getParametersCount() > 0) {
builder.addError("@Delegate is legal only on no-argument methods.");
result = false;
}
final PsiType returnType = psiMethod.getReturnType();
result &= null != returnType && handler.validate(psiMethod, returnType, psiAnnotation, builder);
return result;
}
@Override
protected void processIntern(@NotNull PsiMethod psiMethod, @NotNull PsiAnnotation psiAnnotation, @NotNull List<? super PsiElement> target) {
final PsiType returnType = psiMethod.getReturnType();
if (null != returnType) {
handler.generateElements(psiMethod, returnType, psiAnnotation, target);
}
}
}