package de.plushnikov.intellij.plugin.extension; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElementFinder; import com.intellij.psi.PsiMethod; import com.intellij.psi.impl.file.impl.JavaFileManager; import com.intellij.psi.search.GlobalSearchScope; import de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil; import de.plushnikov.intellij.plugin.util.PsiClassUtil; import lombok.Builder; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; public class LombokElementFinder extends PsiElementFinder { @Nullable @Override @SuppressWarnings("deprecation") public PsiClass findClass(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) { final Project project = scope.getProject(); if (null == project) { return null; } final int lastDot = qualifiedName.lastIndexOf('.'); if (lastDot < 0) { return null; } final String shortName = qualifiedName.substring(lastDot + 1); final String parentName = qualifiedName.substring(0, lastDot); if (shortName.isEmpty() || parentName.isEmpty()) { return null; } final JavaFileManager javaFileManager = ServiceManager.getService(project, JavaFileManager.class); if (null != javaFileManager) { final PsiClass parentClass = javaFileManager.findClass(parentName, scope); if (null != parentClass) { if (PsiAnnotationSearchUtil.isAnnotatedWith(parentClass, Builder.class, lombok.experimental.Builder.class)) { return parentClass.findInnerClassByName(shortName, false); } else { final Collection<PsiMethod> psiMethods = PsiClassUtil.collectClassMethodsIntern(parentClass); for (PsiMethod psiMethod : psiMethods) { if (PsiAnnotationSearchUtil.isAnnotatedWith(psiMethod, Builder.class, lombok.experimental.Builder.class)) { return parentClass.findInnerClassByName(shortName, false); } } } } } return null; } @NotNull @Override public PsiClass[] findClasses(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) { return PsiClass.EMPTY_ARRAY; } }