package de.plushnikov.intellij.plugin.provider; import com.intellij.codeInsight.daemon.ImplicitUsageProvider; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiField; import de.plushnikov.intellij.plugin.processor.LombokPsiElementUsage; import java.util.Collection; /** * Provides implicit usages of lombok fields */ public class LombokImplicitUsageProvider implements ImplicitUsageProvider { @Override public boolean isImplicitUsage(PsiElement element) { return isImplicitWrite(element) || isImplicitRead(element); } @Override public boolean isImplicitRead(PsiElement element) { return checkUsage(element, LombokPsiElementUsage.READ); } @Override public boolean isImplicitWrite(PsiElement element) { return checkUsage(element, LombokPsiElementUsage.WRITE); } private boolean checkUsage(PsiElement element, LombokPsiElementUsage elementUsage) { boolean result = false; if (element instanceof PsiField) { final LombokProcessorProvider processorProvider = LombokProcessorProvider.getInstance(element.getProject()); final Collection<LombokProcessorData> applicableProcessors = processorProvider.getApplicableProcessors((PsiField) element); for (LombokProcessorData processorData : applicableProcessors) { final LombokPsiElementUsage psiElementUsage = processorData.getProcessor().checkFieldUsage((PsiField) element, processorData.getPsiAnnotation()); if (elementUsage == psiElementUsage || LombokPsiElementUsage.READ_WRITE == psiElementUsage) { result = true; break; } } } return result; } }