From 23d9f923ac4b6d22b709c20e25ba21d0e944221a Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 18 Aug 2016 20:42:20 +0300 Subject: [PATCH] Convert to Kotlin: KotlinTypeHierarchyProvider --- .../hierarchy/KotlinTypeHierarchyProvider.kt | 115 ++++++++---------- 1 file changed, 50 insertions(+), 65 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/hierarchy/KotlinTypeHierarchyProvider.kt b/idea/src/org/jetbrains/kotlin/idea/hierarchy/KotlinTypeHierarchyProvider.kt index 99ac56465fc..521f3564662 100644 --- a/idea/src/org/jetbrains/kotlin/idea/hierarchy/KotlinTypeHierarchyProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/hierarchy/KotlinTypeHierarchyProvider.kt @@ -14,96 +14,81 @@ * limitations under the License. */ -package org.jetbrains.kotlin.idea.hierarchy; +package org.jetbrains.kotlin.idea.hierarchy -import com.intellij.codeInsight.TargetElementUtilBase; -import com.intellij.ide.hierarchy.type.JavaTypeHierarchyProvider; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.actionSystem.LangDataKeys; -import com.intellij.openapi.actionSystem.PlatformDataKeys; -import com.intellij.openapi.editor.Editor; -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.PsiFile; -import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.util.PsiTreeUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.descriptors.FunctionDescriptor; -import org.jetbrains.kotlin.idea.caches.resolve.ResolutionUtils; -import org.jetbrains.kotlin.idea.decompiler.navigation.SourceNavigationHelper; -import org.jetbrains.kotlin.idea.stubindex.KotlinClassShortNameIndex; -import org.jetbrains.kotlin.idea.util.ProjectRootsUtil; -import org.jetbrains.kotlin.psi.KtClassOrObject; -import org.jetbrains.kotlin.psi.KtNamedFunction; -import org.jetbrains.kotlin.renderer.DescriptorRenderer; -import org.jetbrains.kotlin.resolve.BindingContext; -import org.jetbrains.kotlin.types.KotlinType; +import com.intellij.codeInsight.TargetElementUtilBase +import com.intellij.ide.hierarchy.type.JavaTypeHierarchyProvider +import com.intellij.openapi.actionSystem.DataContext +import com.intellij.openapi.actionSystem.LangDataKeys +import com.intellij.openapi.actionSystem.PlatformDataKeys +import com.intellij.psi.PsiClass +import com.intellij.psi.PsiDocumentManager +import com.intellij.psi.PsiElement +import com.intellij.psi.search.GlobalSearchScope +import com.intellij.psi.util.PsiTreeUtil +import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor +import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.decompiler.navigation.SourceNavigationHelper +import org.jetbrains.kotlin.idea.stubindex.KotlinClassShortNameIndex +import org.jetbrains.kotlin.idea.util.ProjectRootsUtil +import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.KtNamedFunction +import org.jetbrains.kotlin.renderer.DescriptorRenderer +import org.jetbrains.kotlin.resolve.BindingContext -import java.util.Collection; +class KotlinTypeHierarchyProvider : JavaTypeHierarchyProvider() { + override fun getTarget(dataContext: DataContext): PsiElement? { + val project = PlatformDataKeys.PROJECT.getData(dataContext) ?: return null -public class KotlinTypeHierarchyProvider extends JavaTypeHierarchyProvider { - @Override - public PsiElement getTarget(@NotNull DataContext dataContext) { - Project project = PlatformDataKeys.PROJECT.getData(dataContext); - if (project == null) return null; - - Editor editor = PlatformDataKeys.EDITOR.getData(dataContext); + val editor = PlatformDataKeys.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 - PsiElement target = TargetElementUtilBase.findTargetElement(editor, TargetElementUtilBase.getInstance().getAllAccepted()); + val target = TargetElementUtilBase.findTargetElement(editor, TargetElementUtilBase.getInstance().allAccepted) - if (target instanceof PsiClass) { - return target; + if (target is PsiClass) { + return target } - if (target instanceof KtClassOrObject) { - return SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass((KtClassOrObject) target); + if (target is KtClassOrObject) { + return SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass((target as KtClassOrObject?)!!) } - // Factory methods - else if (target instanceof KtNamedFunction) { - KtNamedFunction function = (KtNamedFunction) target; - String functionName = function.getName(); - FunctionDescriptor functionDescriptor = ResolutionUtils.analyze(function) - .get(BindingContext.FUNCTION, target); + else if (target is KtNamedFunction) { + val functionName = target.name + val functionDescriptor = target.analyze().get(BindingContext.FUNCTION, target) if (functionDescriptor != null) { - KotlinType type = functionDescriptor.getReturnType(); + val type = functionDescriptor!!.getReturnType() if (type != null) { - String returnTypeText = DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(type); - if (returnTypeText.equals(functionName)) { - Collection classOrObjects = - KotlinClassShortNameIndex.getInstance().get(functionName, project, GlobalSearchScope.allScope(project)); - if (classOrObjects.size() == 1) { - KtClassOrObject classOrObject = classOrObjects.iterator().next(); - return SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass(classOrObject); + val returnTypeText = DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(type!!) + if (returnTypeText == functionName) { + val classOrObjects = KotlinClassShortNameIndex.getInstance().get(functionName, project, GlobalSearchScope.allScope(project)) + if (classOrObjects.size == 1) { + val classOrObject = classOrObjects.iterator().next() + return SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass(classOrObject) } } } } - } + }// Factory methods - int offset = editor.getCaretModel().getOffset(); - PsiElement element = file.findElementAt(offset); - if (element == null) return null; + val offset = editor.caretModel.offset + val element = file.findElementAt(offset) ?: return null - KtClassOrObject classOrObject = PsiTreeUtil.getParentOfType(element, KtClassOrObject.class); + val classOrObject = PsiTreeUtil.getParentOfType(element, KtClassOrObject::class.java) if (classOrObject != null) { - return SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass(classOrObject); + return SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass(classOrObject) } } else { - PsiElement element = LangDataKeys.PSI_ELEMENT.getData(dataContext); - if (element instanceof KtClassOrObject) { - return SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass((KtClassOrObject) element); + val element = LangDataKeys.PSI_ELEMENT.getData(dataContext) + if (element is KtClassOrObject) { + return SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass((element as KtClassOrObject?)!!) } } - return null; + return null } }