[light classes] move KtFakeLightClass to light-classes-base module
^KT-53097
This commit is contained in:
+3
-63
@@ -5,59 +5,27 @@
|
||||
|
||||
package org.jetbrains.kotlin.asJava.classes
|
||||
|
||||
import com.intellij.ide.highlighter.JavaFileType
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.*
|
||||
import com.intellij.psi.impl.PsiClassImplUtil
|
||||
import com.intellij.psi.impl.light.AbstractLightClass
|
||||
import com.intellij.psi.PsiClass
|
||||
import com.intellij.psi.PsiMethod
|
||||
import com.intellij.psi.impl.light.LightMethod
|
||||
import com.intellij.psi.search.SearchScope
|
||||
import com.intellij.util.IncorrectOperationException
|
||||
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
|
||||
import org.jetbrains.kotlin.asJava.elements.KtLightElement
|
||||
import org.jetbrains.kotlin.asJava.toFakeLightClass
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
|
||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||
import org.jetbrains.kotlin.psi.KtNamedDeclaration
|
||||
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import javax.swing.Icon
|
||||
|
||||
// Used as a placeholder when actual light class does not exist (expect-classes, for example)
|
||||
// The main purpose is to allow search of inheritors within hierarchies containing such classes
|
||||
abstract class KtFakeLightClass(override val kotlinOrigin: KtClassOrObject) :
|
||||
AbstractLightClass(kotlinOrigin.manager, KotlinLanguage.INSTANCE),
|
||||
KtLightClass {
|
||||
|
||||
private val _delegate: PsiClass by lazy { DummyJavaPsiFactory.createDummyClass(kotlinOrigin.project) }
|
||||
|
||||
override val originKind get() = LightClassOriginKind.SOURCE
|
||||
|
||||
override fun getName(): String? = kotlinOrigin.name
|
||||
override fun getDelegate(): PsiClass = _delegate
|
||||
abstract override fun copy(): KtFakeLightClass
|
||||
|
||||
override fun getQualifiedName(): String? = kotlinOrigin.fqName?.asString()
|
||||
abstract override fun getContainingClass(): KtFakeLightClass?
|
||||
override fun getNavigationElement(): PsiElement = kotlinOrigin.navigationElement
|
||||
override fun getIcon(flags: Int): Icon? = kotlinOrigin.getIcon(flags)
|
||||
override fun getContainingFile(): PsiFile = kotlinOrigin.containingFile
|
||||
override fun getUseScope(): SearchScope = kotlinOrigin.useScope
|
||||
|
||||
abstract override fun isInheritor(baseClass: PsiClass, checkDeep: Boolean): Boolean
|
||||
|
||||
override fun isEquivalentTo(another: PsiElement?): Boolean = PsiClassImplUtil.isClassEquivalentTo(this, another)
|
||||
}
|
||||
|
||||
class KtDescriptorBasedFakeLightClass(kotlinOrigin: KtClassOrObject) : KtFakeLightClass(kotlinOrigin) {
|
||||
|
||||
override fun copy(): KtFakeLightClass = KtDescriptorBasedFakeLightClass(kotlinOrigin)
|
||||
|
||||
private val _containingClass: KtFakeLightClass? by lazy {
|
||||
kotlinOrigin.containingClassOrObject?.let { KtDescriptorBasedFakeLightClass(it) }
|
||||
}
|
||||
|
||||
override fun getContainingClass(): KtFakeLightClass? = _containingClass
|
||||
|
||||
override fun isInheritor(baseClass: PsiClass, checkDeep: Boolean): Boolean {
|
||||
@@ -106,31 +74,3 @@ class KtFakeLightMethod private constructor(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private object DummyJavaPsiFactory {
|
||||
fun createDummyVoidMethod(project: Project): PsiMethod {
|
||||
// Can't use PsiElementFactory.createMethod() because of formatting in PsiElementFactoryImpl.
|
||||
val name = "dummy"
|
||||
val returnType = PsiType.VOID
|
||||
|
||||
val canonicalText = GenericsUtil.getVariableTypeByExpressionType(returnType).getCanonicalText(true)
|
||||
val file = createDummyJavaFile(project, "class _Dummy_ { public $canonicalText $name() {\n} }")
|
||||
val klass = file.classes.singleOrNull()
|
||||
?: throw IncorrectOperationException("Class was not created. Method name: $name; return type: $canonicalText")
|
||||
|
||||
return klass.methods.singleOrNull()
|
||||
?: throw IncorrectOperationException("Method was not created. Method name: $name; return type: $canonicalText")
|
||||
}
|
||||
|
||||
fun createDummyClass(project: Project): PsiClass = PsiElementFactory.getInstance(project).createClass("dummy")
|
||||
|
||||
private fun createDummyJavaFile(project: Project, text: String): PsiJavaFile {
|
||||
return PsiFileFactory.getInstance(project).createFileFromText(
|
||||
DUMMY_FILE_NAME,
|
||||
JavaFileType.INSTANCE,
|
||||
text
|
||||
) as PsiJavaFile
|
||||
}
|
||||
|
||||
private val DUMMY_FILE_NAME = "_Dummy_." + JavaFileType.INSTANCE.defaultExtension
|
||||
}
|
||||
Reference in New Issue
Block a user