From 651d4d8be010f58be76d89fa7a8605470bff61b5 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Mon, 18 Jul 2022 16:25:00 +0200 Subject: [PATCH] [light classes] move getParentForLocalDeclaration to light-classes-base ^KT-53097 --- .../asJava/classes/lightClassPlatformUtils.kt | 78 ++++++++++++++++++ .../ultraLightClassForLocalDeclaration.kt | 79 +------------------ 2 files changed, 79 insertions(+), 78 deletions(-) diff --git a/compiler/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/lightClassPlatformUtils.kt b/compiler/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/lightClassPlatformUtils.kt index 21626b93f3b..d9c3a23be7b 100644 --- a/compiler/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/lightClassPlatformUtils.kt +++ b/compiler/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/lightClassPlatformUtils.kt @@ -5,9 +5,87 @@ package org.jetbrains.kotlin.asJava.classes +import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement +import com.intellij.psi.PsiMethod import com.intellij.psi.augment.PsiAugmentProvider +import com.intellij.psi.impl.light.LightClass +import com.intellij.psi.impl.light.LightMethod +import org.jetbrains.kotlin.asJava.LightClassUtil +import org.jetbrains.kotlin.asJava.toLightClass +import org.jetbrains.kotlin.idea.KotlinLanguage +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType internal fun collectAugments(element: PsiElement, type: Class): List { return PsiAugmentProvider.collectAugments(element, type, null) } + +fun getParentForLocalDeclaration(classOrObject: KtClassOrObject): PsiElement? { + fun getParentByPsiMethod(method: PsiMethod?, name: String?, forceMethodWrapping: Boolean): PsiElement? { + if (method == null || name == null) return null + + var containingClass: PsiClass? = method.containingClass ?: return null + + val currentFileName = classOrObject.containingFile.name + + var createWrapper = forceMethodWrapping + // Use PsiClass wrapper instead of package light class to avoid names like "FooPackage" in Type Hierarchy and related views + if (containingClass is KtLightClassForFacade) { + containingClass = object : LightClass(containingClass as KtLightClassForFacade, KotlinLanguage.INSTANCE) { + override fun getName(): String = currentFileName + } + createWrapper = true + } + + if (createWrapper) { + return object : LightMethod(classOrObject.manager, method, containingClass!!, KotlinLanguage.INSTANCE) { + override fun getParent(): PsiElement = getContainingClass() + override fun getName(): String = name + } + } + + return method + } + + var declaration: PsiElement? = KtPsiUtil.getTopmostParentOfTypes( + classOrObject, + KtNamedFunction::class.java, + KtConstructor::class.java, + KtProperty::class.java, + KtAnonymousInitializer::class.java, + KtParameter::class.java + ) + + if (declaration is KtParameter) { + declaration = declaration.getStrictParentOfType() + } + + if (declaration is KtFunction) { + return getParentByPsiMethod( + LightClassUtil.getLightClassMethod(declaration), + declaration.name, + forceMethodWrapping = false + ) + } + + // Represent the property as a fake method with the same name + if (declaration is KtProperty) { + return getParentByPsiMethod( + LightClassUtil.getLightClassPropertyMethods(declaration).getter, + declaration.name, + forceMethodWrapping = true + ) + } + + if (declaration is KtAnonymousInitializer) { + val parent = declaration.parent + val grandparent = parent.parent + + if (parent is KtClassBody && grandparent is KtClassOrObject) { + return grandparent.toLightClass() + } + } + + return if (declaration is KtClass) declaration.toLightClass() else null +} \ No newline at end of file diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClassForLocalDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClassForLocalDeclaration.kt index d4e26ff336a..38346a7bc15 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClassForLocalDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClassForLocalDeclaration.kt @@ -5,16 +5,8 @@ package org.jetbrains.kotlin.asJava.classes -import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement -import com.intellij.psi.PsiMethod -import com.intellij.psi.impl.light.LightClass -import com.intellij.psi.impl.light.LightMethod -import org.jetbrains.kotlin.asJava.LightClassUtil -import org.jetbrains.kotlin.asJava.toLightClass -import org.jetbrains.kotlin.idea.KotlinLanguage -import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType +import org.jetbrains.kotlin.psi.KtClassOrObject open class KtUltraLightClassForLocalDeclaration( classOrObject: KtClassOrObject, @@ -29,72 +21,3 @@ open class KtUltraLightClassForLocalDeclaration( override fun getParent() = _parent } - -fun getParentForLocalDeclaration(classOrObject: KtClassOrObject): PsiElement? { - fun getParentByPsiMethod(method: PsiMethod?, name: String?, forceMethodWrapping: Boolean): PsiElement? { - if (method == null || name == null) return null - - var containingClass: PsiClass? = method.containingClass ?: return null - - val currentFileName = classOrObject.containingFile.name - - var createWrapper = forceMethodWrapping - // Use PsiClass wrapper instead of package light class to avoid names like "FooPackage" in Type Hierarchy and related views - if (containingClass is KtLightClassForFacade) { - containingClass = object : LightClass(containingClass as KtLightClassForFacade, KotlinLanguage.INSTANCE) { - override fun getName(): String = currentFileName - } - createWrapper = true - } - - if (createWrapper) { - return object : LightMethod(classOrObject.manager, method, containingClass!!, KotlinLanguage.INSTANCE) { - override fun getParent(): PsiElement = getContainingClass() - override fun getName(): String = name - } - } - - return method - } - - var declaration: PsiElement? = KtPsiUtil.getTopmostParentOfTypes( - classOrObject, - KtNamedFunction::class.java, - KtConstructor::class.java, - KtProperty::class.java, - KtAnonymousInitializer::class.java, - KtParameter::class.java - ) - - if (declaration is KtParameter) { - declaration = declaration.getStrictParentOfType() - } - - if (declaration is KtFunction) { - return getParentByPsiMethod( - LightClassUtil.getLightClassMethod(declaration), - declaration.name, - forceMethodWrapping = false - ) - } - - // Represent the property as a fake method with the same name - if (declaration is KtProperty) { - return getParentByPsiMethod( - LightClassUtil.getLightClassPropertyMethods(declaration).getter, - declaration.name, - forceMethodWrapping = true - ) - } - - if (declaration is KtAnonymousInitializer) { - val parent = declaration.parent - val grandparent = parent.parent - - if (parent is KtClassBody && grandparent is KtClassOrObject) { - return grandparent.toLightClass() - } - } - - return if (declaration is KtClass) declaration.toLightClass() else null -} \ No newline at end of file