Convert to Kotlin: HierarchyUtils

This commit is contained in:
Alexey Sedunov
2016-08-18 20:59:32 +03:00
parent 91cc22e599
commit 4622f08b5e
4 changed files with 38 additions and 41 deletions
@@ -14,53 +14,50 @@
* limitations under the License.
*/
package org.jetbrains.kotlin.idea.hierarchy;
package org.jetbrains.kotlin.idea.hierarchy
import com.intellij.codeInsight.TargetElementUtilBase;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.util.ArrayUtil;
import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil;
import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt;
import com.intellij.codeInsight.TargetElementUtilBase
import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMethod
import com.intellij.util.ArrayUtil
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypesAndPredicate
public class HierarchyUtils {
public static final Function1<PsiElement, Boolean> IS_CALL_HIERARCHY_ELEMENT = new Function1<PsiElement, Boolean>() {
@Override
public Boolean invoke(@Nullable PsiElement input) {
return input instanceof PsiMethod ||
input instanceof PsiClass ||
input instanceof KtFile ||
input instanceof KtNamedFunction ||
input instanceof KtSecondaryConstructor ||
input instanceof KtObjectDeclaration ||
(input instanceof KtClass && !((KtClass) input).isInterface()) ||
input instanceof KtProperty;
}
};
object HierarchyUtils {
val IS_CALL_HIERARCHY_ELEMENT: Function1<PsiElement, Boolean> = fun(input: PsiElement?): Boolean {
return input is PsiMethod ||
input is PsiClass ||
input is KtFile ||
input is KtNamedFunction ||
input is KtSecondaryConstructor ||
input is KtObjectDeclaration ||
input is KtClass && !input.isInterface() ||
input is KtProperty
}
public static PsiElement getCurrentElement(DataContext dataContext, Project project) {
Editor editor = CommonDataKeys.EDITOR.getData(dataContext);
fun getCurrentElement(dataContext: DataContext, project: Project): PsiElement? {
val editor = CommonDataKeys.EDITOR.getData(dataContext)
if (editor != null) {
PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
if (file == null) return null;
val file = PsiDocumentManager.getInstance(project).getPsiFile(editor.document) ?: return null
if (!ProjectRootsUtil.isInProjectOrLibSource(file)) return null;
if (!ProjectRootsUtil.isInProjectOrLibSource(file)) return null
return TargetElementUtilBase.findTargetElement(editor, TargetElementUtilBase.getInstance().getAllAccepted());
return TargetElementUtilBase.findTargetElement(editor, TargetElementUtilBase.getInstance().allAccepted)
}
return CommonDataKeys.PSI_ELEMENT.getData(dataContext);
return CommonDataKeys.PSI_ELEMENT.getData(dataContext)
}
public static PsiElement getCallHierarchyElement(PsiElement element) {
fun getCallHierarchyElement(element: PsiElement): PsiElement? {
//noinspection unchecked
return PsiUtilsKt.getParentOfTypesAndPredicate(element, false, ArrayUtil.EMPTY_CLASS_ARRAY, IS_CALL_HIERARCHY_ELEMENT);
return element.getParentOfTypesAndPredicate<PsiElement>(strict = false,
parentClasses = *(ArrayUtil.EMPTY_CLASS_ARRAY as Array<Class<PsiElement>>),
predicate = IS_CALL_HIERARCHY_ELEMENT)
}
}
@@ -76,7 +76,7 @@ public class KotlinCallHierarchyBrowser extends CallHierarchyBrowserBase {
@Override
protected boolean isApplicableElement(@NotNull PsiElement element) {
if (element instanceof PsiClass) return false; // PsiClass is not allowed at the hierarchy root
return HierarchyUtils.IS_CALL_HIERARCHY_ELEMENT.invoke(element);
return HierarchyUtils.INSTANCE.getIS_CALL_HIERARCHY_ELEMENT().invoke(element);
}
@Override
@@ -42,7 +42,7 @@ public class KotlinCallHierarchyProvider implements HierarchyProvider {
PsiElement element = getCurrentElement(dataContext, project);
if (element == null) return null;
element = HierarchyUtils.getCallHierarchyElement(element);
element = HierarchyUtils.INSTANCE.getCallHierarchyElement(element);
if (element instanceof KtFile || element == null || element.getLanguage() != KotlinLanguage.INSTANCE) return null;
return element;
@@ -234,7 +234,7 @@ public class KotlinCallerMethodsTreeStructure extends KotlinCallTreeStructure {
PsiElement refElement = ref.getElement();
if (PsiTreeUtil.getParentOfType(refElement, KtImportDirective.class, true) != null) return true;
PsiElement element = HierarchyUtils.getCallHierarchyElement(refElement);
PsiElement element = HierarchyUtils.INSTANCE.getCallHierarchyElement(refElement);
if (kotlinOnly && !(element instanceof KtNamedDeclaration)) return true;
@@ -242,7 +242,7 @@ public class KotlinCallerMethodsTreeStructure extends KotlinCallTreeStructure {
if (element instanceof KtProperty) {
KtProperty property = (KtProperty) element;
if (PsiTreeUtil.isAncestor(property.getInitializer(), refElement, false)) {
element = HierarchyUtils.getCallHierarchyElement(element.getParent());
element = HierarchyUtils.INSTANCE.getCallHierarchyElement(element.getParent());
}
}