Convert to Kotlin: KotlinTypeHierarchyProvider

This commit is contained in:
Alexey Sedunov
2016-08-18 20:42:20 +03:00
parent 438777a0de
commit 23d9f923ac
@@ -14,96 +14,81 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.kotlin.idea.hierarchy; package org.jetbrains.kotlin.idea.hierarchy
import com.intellij.codeInsight.TargetElementUtilBase; import com.intellij.codeInsight.TargetElementUtilBase
import com.intellij.ide.hierarchy.type.JavaTypeHierarchyProvider; import com.intellij.ide.hierarchy.type.JavaTypeHierarchyProvider
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.actionSystem.LangDataKeys
import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.actionSystem.PlatformDataKeys
import com.intellij.openapi.editor.Editor; import com.intellij.psi.PsiClass
import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement
import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil
import com.intellij.psi.PsiFile; import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.kotlin.idea.caches.resolve.analyze
import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.kotlin.idea.decompiler.navigation.SourceNavigationHelper
import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.idea.stubindex.KotlinClassShortNameIndex
import org.jetbrains.kotlin.descriptors.FunctionDescriptor; import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
import org.jetbrains.kotlin.idea.caches.resolve.ResolutionUtils; import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.idea.decompiler.navigation.SourceNavigationHelper; import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.idea.stubindex.KotlinClassShortNameIndex; import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil; import org.jetbrains.kotlin.resolve.BindingContext
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 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 { val editor = PlatformDataKeys.EDITOR.getData(dataContext)
@Override
public PsiElement getTarget(@NotNull DataContext dataContext) {
Project project = PlatformDataKeys.PROJECT.getData(dataContext);
if (project == null) return null;
Editor editor = PlatformDataKeys.EDITOR.getData(dataContext);
if (editor != null) { if (editor != null) {
PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()); val file = PsiDocumentManager.getInstance(project).getPsiFile(editor.document) ?: return null
if (file == null) 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) { if (target is PsiClass) {
return target; return target
} }
if (target instanceof KtClassOrObject) { if (target is KtClassOrObject) {
return SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass((KtClassOrObject) target); return SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass((target as KtClassOrObject?)!!)
} }
// Factory methods else if (target is KtNamedFunction) {
else if (target instanceof KtNamedFunction) { val functionName = target.name
KtNamedFunction function = (KtNamedFunction) target; val functionDescriptor = target.analyze().get<PsiElement, SimpleFunctionDescriptor>(BindingContext.FUNCTION, target)
String functionName = function.getName();
FunctionDescriptor functionDescriptor = ResolutionUtils.analyze(function)
.get(BindingContext.FUNCTION, target);
if (functionDescriptor != null) { if (functionDescriptor != null) {
KotlinType type = functionDescriptor.getReturnType(); val type = functionDescriptor!!.getReturnType()
if (type != null) { if (type != null) {
String returnTypeText = DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(type); val returnTypeText = DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(type!!)
if (returnTypeText.equals(functionName)) { if (returnTypeText == functionName) {
Collection<KtClassOrObject> classOrObjects = val classOrObjects = KotlinClassShortNameIndex.getInstance().get(functionName, project, GlobalSearchScope.allScope(project))
KotlinClassShortNameIndex.getInstance().get(functionName, project, GlobalSearchScope.allScope(project)); if (classOrObjects.size == 1) {
if (classOrObjects.size() == 1) { val classOrObject = classOrObjects.iterator().next()
KtClassOrObject classOrObject = classOrObjects.iterator().next(); return SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass(classOrObject)
return SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass(classOrObject);
} }
} }
} }
} }
} }// Factory methods
int offset = editor.getCaretModel().getOffset(); val offset = editor.caretModel.offset
PsiElement element = file.findElementAt(offset); val element = file.findElementAt(offset) ?: return null
if (element == null) return null;
KtClassOrObject classOrObject = PsiTreeUtil.getParentOfType(element, KtClassOrObject.class); val classOrObject = PsiTreeUtil.getParentOfType(element, KtClassOrObject::class.java)
if (classOrObject != null) { if (classOrObject != null) {
return SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass(classOrObject); return SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass(classOrObject)
} }
} }
else { else {
PsiElement element = LangDataKeys.PSI_ELEMENT.getData(dataContext); val element = LangDataKeys.PSI_ELEMENT.getData(dataContext)
if (element instanceof KtClassOrObject) { if (element is KtClassOrObject) {
return SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass((KtClassOrObject) element); return SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass((element as KtClassOrObject?)!!)
} }
} }
return null; return null
} }
} }