diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/psi/internal/builditems/QuarkusBuildItemUtils.java b/src/main/java/com/redhat/devtools/intellij/quarkus/psi/internal/builditems/QuarkusBuildItemUtils.java new file mode 100644 index 000000000..d55e7887f --- /dev/null +++ b/src/main/java/com/redhat/devtools/intellij/quarkus/psi/internal/builditems/QuarkusBuildItemUtils.java @@ -0,0 +1,53 @@ +package com.redhat.devtools.intellij.quarkus.psi.internal.builditems; + +import com.intellij.openapi.module.Module; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiModifier; +import com.intellij.psi.search.ProjectScope; +import com.intellij.psi.search.searches.DefinitionsScopedSearch; +import com.redhat.devtools.intellij.lsp4mp4ij.psi.core.utils.PsiTypeUtils; +import com.redhat.devtools.intellij.quarkus.QuarkusConstants; +import com.redhat.microprofile.psi.internal.quarkus.renarde.java.RenardeConstants; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +public class QuarkusBuildItemUtils { + + private QuarkusBuildItemUtils() { + + } + + /** + * Returns a set of all classes in the given project that extend Renarde's + * Controller class. + * + * @param project the project to search in + * @param monitor the progress monitor + * @return a set of all classes in the given project that extend Renarde's + * Controller class + */ + public static Set getAllBuildItemClasses(Module project, ProgressIndicator monitor) { + PsiClass buildItemType = PsiTypeUtils.findType(project, QuarkusConstants.QUARKUS_BUILD_ITEM_CLASS_NAME); + if (buildItemType == null) { + return Collections.emptySet(); + } + + Set types = new HashSet<>(); + DefinitionsScopedSearch.search(buildItemType, ProjectScope.getAllScope(project.getProject()), true) + .forEach(element -> { + if (element instanceof PsiClass type && isValidBuildItem(type)) { + types.add(type); + } + }); + return types; + } + + + public static boolean isValidBuildItem(PsiClass psiClass) { + return psiClass.hasModifierProperty(PsiModifier.FINAL) + || psiClass.hasModifierProperty(PsiModifier.ABSTRACT); + } +} diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/psi/internal/validators/QuarkusBuildItemDiagnosticsParticipant.java b/src/main/java/com/redhat/devtools/intellij/quarkus/psi/internal/validators/QuarkusBuildItemDiagnosticsParticipant.java index b467e94e0..50465090b 100644 --- a/src/main/java/com/redhat/devtools/intellij/quarkus/psi/internal/validators/QuarkusBuildItemDiagnosticsParticipant.java +++ b/src/main/java/com/redhat/devtools/intellij/quarkus/psi/internal/validators/QuarkusBuildItemDiagnosticsParticipant.java @@ -33,6 +33,8 @@ import java.util.ArrayList; import java.util.List; +import static com.redhat.devtools.intellij.quarkus.psi.internal.builditems.QuarkusBuildItemUtils.isValidBuildItem; + /** * Validates io.quarkus.builder.item.BuildItem subclasses. *