aboutsummaryrefslogtreecommitdiffstats
path: root/sd-plugin/src/main/java/org/intellij/sdk/language/hierarchy/SdHierarchyUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'sd-plugin/src/main/java/org/intellij/sdk/language/hierarchy/SdHierarchyUtil.java')
-rw-r--r--sd-plugin/src/main/java/org/intellij/sdk/language/hierarchy/SdHierarchyUtil.java67
1 files changed, 67 insertions, 0 deletions
diff --git a/sd-plugin/src/main/java/org/intellij/sdk/language/hierarchy/SdHierarchyUtil.java b/sd-plugin/src/main/java/org/intellij/sdk/language/hierarchy/SdHierarchyUtil.java
new file mode 100644
index 00000000000..b3376a85524
--- /dev/null
+++ b/sd-plugin/src/main/java/org/intellij/sdk/language/hierarchy/SdHierarchyUtil.java
@@ -0,0 +1,67 @@
+package org.intellij.sdk.language.hierarchy;
+
+import com.intellij.ide.hierarchy.HierarchyBrowserManager;
+import com.intellij.ide.util.treeView.AlphaComparator;
+import com.intellij.ide.util.treeView.NodeDescriptor;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.*;
+import com.intellij.psi.util.PsiTreeUtil;
+
+import org.intellij.sdk.language.SdUtil;
+import org.intellij.sdk.language.psi.SdFile;
+import org.intellij.sdk.language.psi.SdFunctionDefinition;
+import org.intellij.sdk.language.psi.SdRankProfileDefinition;
+
+import java.util.Comparator;
+import java.util.HashSet;
+
+
+public class SdHierarchyUtil {
+
+ private static final Comparator<NodeDescriptor<?>> NODE_DESCRIPTOR_COMPARATOR = Comparator.comparingInt(NodeDescriptor::getIndex);
+
+ private SdHierarchyUtil() {
+ }
+
+ public static boolean isExecutable(PsiElement component) {
+ return component instanceof SdFunctionDefinition;
+ }
+
+ public static HashSet<SdRankProfileDefinition> getRankProfileChildren(SdFile file, SdRankProfileDefinition rankProfileTarget) {
+ HashSet<SdRankProfileDefinition> result = new HashSet<>();
+ HashSet<SdRankProfileDefinition> notResult = new HashSet<>();
+
+ for (SdRankProfileDefinition rank : PsiTreeUtil.collectElementsOfType(file, SdRankProfileDefinition.class)) {
+ if (notResult.contains(rank)) {
+ continue;
+ }
+ HashSet<SdRankProfileDefinition> tempRanks = new HashSet<>();
+ SdRankProfileDefinition curRank = rank;
+ while (curRank != null) {
+ if (curRank.getName().equals(rankProfileTarget.getName())) {
+ result.addAll(tempRanks);
+ break;
+ }
+ tempRanks.add(curRank);
+ PsiElement temp = SdUtil.getRankProfileParent(curRank);
+ curRank = temp != null ? (SdRankProfileDefinition) temp : null;
+ }
+ if (curRank == null) {
+ notResult.addAll(tempRanks);
+ }
+ }
+ return result;
+ }
+
+
+ public static Comparator<NodeDescriptor<?>> getComparator(Project project) {
+ final HierarchyBrowserManager.State state = HierarchyBrowserManager.getInstance(project).getState();
+ if (state != null && state.SORT_ALPHABETICALLY) {
+ return AlphaComparator.INSTANCE;
+ }
+ else {
+ return NODE_DESCRIPTOR_COMPARATOR;
+ }
+ }
+
+}