aboutsummaryrefslogtreecommitdiffstats
path: root/sd-plugin/src/main/java/org/intellij/sdk/language/hierarchy/SdCallHierarchyProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'sd-plugin/src/main/java/org/intellij/sdk/language/hierarchy/SdCallHierarchyProvider.java')
-rw-r--r--sd-plugin/src/main/java/org/intellij/sdk/language/hierarchy/SdCallHierarchyProvider.java66
1 files changed, 66 insertions, 0 deletions
diff --git a/sd-plugin/src/main/java/org/intellij/sdk/language/hierarchy/SdCallHierarchyProvider.java b/sd-plugin/src/main/java/org/intellij/sdk/language/hierarchy/SdCallHierarchyProvider.java
new file mode 100644
index 00000000000..44bfdca134f
--- /dev/null
+++ b/sd-plugin/src/main/java/org/intellij/sdk/language/hierarchy/SdCallHierarchyProvider.java
@@ -0,0 +1,66 @@
+package org.intellij.sdk.language.hierarchy;
+
+
+import com.intellij.ide.hierarchy.CallHierarchyBrowserBase;
+import com.intellij.ide.hierarchy.HierarchyBrowser;
+import com.intellij.ide.hierarchy.HierarchyProvider;
+import com.intellij.openapi.actionSystem.DataContext;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.psi.PsiDocumentManager;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiReference;
+import org.intellij.sdk.language.SdReference;
+import org.intellij.sdk.language.SdUtil;
+import org.intellij.sdk.language.psi.SdDeclaration;
+import org.intellij.sdk.language.psi.SdFunctionDefinition;
+import org.intellij.sdk.language.psi.SdIdentifierVal;
+import org.intellij.sdk.language.psi.impl.SdPsiImplUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import com.intellij.openapi.actionSystem.CommonDataKeys;
+import com.intellij.openapi.project.Project;
+
+import com.intellij.psi.util.PsiTreeUtil;
+
+
+public class SdCallHierarchyProvider implements HierarchyProvider {
+
+ @Override
+ public @Nullable PsiElement getTarget(@NotNull DataContext dataContext) {
+ final Project project = CommonDataKeys.PROJECT.getData(dataContext);
+ final Editor editor = CommonDataKeys.EDITOR.getData(dataContext);
+ if (project == null || editor == null) return null;
+
+ final PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
+ if (file == null) {
+ return null;
+ }
+ final PsiElement element = file.findElementAt(editor.getCaretModel().getOffset());
+ if (element == null) {
+ return null;
+ }
+
+ if (element instanceof SdIdentifierVal || element.getParent() instanceof SdIdentifierVal) {
+ PsiReference ref = element instanceof SdIdentifierVal ? element.getReference() : element.getParent().getReference();
+ if (ref == null) {
+ return null;
+ }
+ PsiElement resolvedRef = ref.resolve();
+ if (resolvedRef instanceof SdFunctionDefinition) {
+ return resolvedRef;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public @NotNull HierarchyBrowser createHierarchyBrowser(@NotNull PsiElement target) {
+ return new SdCallHierarchyBrowser(target.getProject(), target);
+ }
+
+ @Override
+ public void browserActivated(@NotNull HierarchyBrowser hierarchyBrowser) {
+ ((SdCallHierarchyBrowser) hierarchyBrowser).changeView(CallHierarchyBrowserBase.getCallerType());
+ }
+}