package de.plushnikov.intellij.plugin.extension; import com.intellij.ide.structureView.StructureViewExtension; import com.intellij.ide.structureView.StructureViewTreeElement; import com.intellij.ide.structureView.impl.java.JavaClassTreeElement; import com.intellij.ide.structureView.impl.java.PsiFieldTreeElement; import com.intellij.ide.structureView.impl.java.PsiMethodTreeElement; import com.intellij.openapi.editor.Editor; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiField; import com.intellij.psi.PsiMethod; import de.plushnikov.intellij.plugin.psi.LombokLightClassBuilder; import de.plushnikov.intellij.plugin.psi.LombokLightFieldBuilder; import de.plushnikov.intellij.plugin.psi.LombokLightMethodBuilder; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; /** * Extension to populate StructureView with all fields, methods and inner classes generated by lombok */ public class LombokStructureViewExtension implements StructureViewExtension { @Override public Class<? extends PsiElement> getType() { return PsiClass.class; } @Override public StructureViewTreeElement[] getChildren(PsiElement parent) { Collection<StructureViewTreeElement> result = new ArrayList<StructureViewTreeElement>(); final PsiClass psiClass = (PsiClass) parent; for (PsiField psiField : psiClass.getFields()) { if (psiField instanceof LombokLightFieldBuilder) { result.add(new PsiFieldTreeElement(psiField, false)); } } for (PsiMethod psiMethod : psiClass.getMethods()) { if (psiMethod instanceof LombokLightMethodBuilder) { result.add(new PsiMethodTreeElement(psiMethod, false)); } } for (PsiClass psiInnerClass : psiClass.getInnerClasses()) { if (psiInnerClass instanceof LombokLightClassBuilder) { result.add(new JavaClassTreeElement(psiInnerClass, false, new HashSet<PsiClass>() {{ add(psiClass); }})); } } if (!result.isEmpty()) { return result.toArray(new StructureViewTreeElement[result.size()]); } else { return StructureViewTreeElement.EMPTY_ARRAY; } } @Nullable @Override public Object getCurrentEditorElement(Editor editor, PsiElement parent) { return null; } }