Convert to Kotlin: KotlinTypeHierarchyProvider
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user