package de.plushnikov.intellij.plugin.extension; import com.intellij.find.findUsages.FindUsagesHandler; import com.intellij.find.findUsages.JavaFindUsagesHandler; import com.intellij.find.findUsages.JavaFindUsagesHandlerFactory; import com.intellij.ide.util.SuperMethodWarningUtil; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiField; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiType; import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.containers.ContainerUtil; import de.plushnikov.intellij.plugin.processor.field.AccessorsInfo; import de.plushnikov.intellij.plugin.thirdparty.LombokUtils; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import java.util.Set; public class LombokFieldFindUsagesHandlerFactory extends JavaFindUsagesHandlerFactory { public LombokFieldFindUsagesHandlerFactory(Project project) { super(project); } @Override public boolean canFindUsages(@NotNull PsiElement element) { return element instanceof PsiField; } @Override public FindUsagesHandler createFindUsagesHandler(@NotNull PsiElement element, boolean forHighlightUsages) { return new JavaFindUsagesHandler(element, this) { @NotNull @Override public PsiElement[] getSecondaryElements() { final PsiField psiField = (PsiField) getPsiElement(); final PsiClass containingClass = psiField.getContainingClass(); if (containingClass != null) { final AccessorsInfo accessorsInfo = AccessorsInfo.build(psiField); final String psiFieldName = psiField.getName(); final String fieldName = accessorsInfo.removePrefix(psiFieldName); if (!fieldName.equals(psiFieldName)) { final boolean isBoolean = PsiType.BOOLEAN.equals(psiField.getType()); final String getterName = LombokUtils.toGetterName(accessorsInfo, psiFieldName, isBoolean); final String setterName = LombokUtils.toSetterName(accessorsInfo, psiFieldName, isBoolean); final PsiMethod[] psiGetterMethods = containingClass.findMethodsByName(getterName, false); final PsiMethod[] psiSetterMethods = containingClass.findMethodsByName(setterName, false); final Set<PsiElement> elements = new THashSet<PsiElement>(psiGetterMethods.length + psiSetterMethods.length); for (PsiMethod accessor : psiGetterMethods) { ContainerUtil.addAll(elements, SuperMethodWarningUtil.checkSuperMethods(accessor, ACTION_STRING)); } for (PsiMethod accessor : psiSetterMethods) { ContainerUtil.addAll(elements, SuperMethodWarningUtil.checkSuperMethods(accessor, ACTION_STRING)); } return PsiUtilCore.toPsiElementArray(elements); } } return super.getSecondaryElements(); } }; } }