LC: introduce light class interface for facade

so that FIR-based light class for facade can work well in LC utils
This commit is contained in:
Jinseong Jeon
2021-05-04 14:53:35 -07:00
committed by Ilya Kirillov
parent efba90c6f1
commit 225e3a747c
28 changed files with 86 additions and 67 deletions
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.name.FqName
private data class FacadeCacheKey(val fqName: FqName, val searchScope: GlobalSearchScope)
private data class ValueWrapper(val value: KtLightClassForFacadeImpl?) {
private data class ValueWrapper(val value: KtLightClassForFacade?) {
companion object {
val Null = ValueWrapper(null)
}
@@ -42,7 +42,7 @@ class FacadeCache(private val project: Project) {
}, false
)
operator fun get(qualifiedName: FqName, searchScope: GlobalSearchScope): KtLightClassForFacadeImpl? {
operator fun get(qualifiedName: FqName, searchScope: GlobalSearchScope): KtLightClassForFacade? {
synchronized(cachedValue) {
return cachedValue.value.cache.get(FacadeCacheKey(qualifiedName, searchScope)).value
}
@@ -0,0 +1,16 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.asJava.classes
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtFile
interface KtLightClassForFacade : KtLightClass {
val facadeClassFqName: FqName
val files: Collection<KtFile>
override fun getName() = facadeClassFqName.shortName().asString()
}
@@ -47,10 +47,10 @@ import javax.swing.Icon
open class KtLightClassForFacadeImpl constructor(
manager: PsiManager,
protected val facadeClassFqName: FqName,
override val facadeClassFqName: FqName,
myLightClassDataCache: CachedValue<LightClassDataHolder.ForFacade>,
files: Collection<KtFile>
) : KtLazyLightClass(manager) {
override val files: Collection<KtFile>
) : KtLazyLightClass(manager), KtLightClassForFacade {
protected open val lightClassDataCache: CachedValue<LightClassDataHolder.ForFacade> = myLightClassDataCache
@@ -60,8 +60,6 @@ open class KtLightClassForFacadeImpl constructor(
override val lightClassData
get() = lightClassDataCache.value.findDataForFacade(facadeClassFqName)
val files: Collection<KtFile> = files.toSet()
private val firstFileInFacade by lazyPub { files.iterator().next() }
private val hashCode: Int =
@@ -138,7 +136,7 @@ open class KtLightClassForFacadeImpl constructor(
override fun getRBrace(): PsiElement? = null
override fun getName() = facadeClassFqName.shortName().asString()
override fun getName() = super<KtLightClassForFacade>.getName()
override fun setName(name: String): PsiElement? {
for (file in files) {
@@ -184,13 +182,14 @@ open class KtLightClassForFacadeImpl constructor(
override fun isValid() = files.all { it.isValid && it.hasTopLevelCallables() && facadeClassFqName == it.javaFileFacadeFqName }
override fun copy() = KtLightClassForFacadeImpl(manager, facadeClassFqName, lightClassDataCache, files)
override fun copy(): KtLightClassForFacade =
KtLightClassForFacadeImpl(manager, facadeClassFqName, lightClassDataCache, files)
override fun getNavigationElement() = firstFileInFacade
override fun isEquivalentTo(another: PsiElement?): Boolean =
equals(another) ||
(another is KtLightClassForFacadeImpl && another.facadeClassFqName == facadeClassFqName)
(another is KtLightClassForFacade && another.facadeClassFqName == facadeClassFqName)
override fun getElementIcon(flags: Int): Icon? = throw UnsupportedOperationException("This should be done by JetIconProvider")
@@ -254,7 +253,7 @@ open class KtLightClassForFacadeImpl constructor(
companion object {
fun createForFacadeNoCache(fqName: FqName, searchScope: GlobalSearchScope, project: Project): KtLightClassForFacadeImpl? {
fun createForFacadeNoCache(fqName: FqName, searchScope: GlobalSearchScope, project: Project): KtLightClassForFacade? {
val sources = KotlinAsJavaSupport.getInstance(project).findFilesForFacade(fqName, searchScope)
.filterNot { it.isCompiled }
@@ -278,7 +277,7 @@ open class KtLightClassForFacadeImpl constructor(
manager: PsiManager,
facadeClassFqName: FqName,
searchScope: GlobalSearchScope
): KtLightClassForFacadeImpl? {
): KtLightClassForFacade? {
return FacadeCache.getInstance(manager.project)[facadeClassFqName, searchScope]
}
@@ -286,7 +285,7 @@ open class KtLightClassForFacadeImpl constructor(
manager: PsiManager,
facadeClassFqName: FqName,
file: KtFile
): KtLightClassForFacadeImpl {
): KtLightClassForFacade {
// TODO: refactor, using cached value doesn't make sense for this case
val cachedValue = CachedValuesManager.getManager(manager.project).createCachedValue(
LightClassDataProviderForFileFacade.ByFile(manager.project, facadeClassFqName, file), false
@@ -41,8 +41,8 @@ open class KtLightClassForLocalDeclaration(
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 KtLightClassForFacadeImpl) {
containingClass = object : LightClass(containingClass as KtLightClassForFacadeImpl, KotlinLanguage.INSTANCE) {
if (containingClass is KtLightClassForFacade) {
containingClass = object : LightClass(containingClass as KtLightClassForFacade, KotlinLanguage.INSTANCE) {
override fun getName(): String? = currentFileName
}
createWrapper = true
@@ -147,6 +147,6 @@ class KtUltraLightClassForFacade(
override fun getOwnMethods() = _ownMethods
override fun copy(): KtLightClassForFacadeImpl =
override fun copy(): KtLightClassForFacade =
KtUltraLightClassForFacade(manager, facadeClassFqName, lightClassDataCache, files, filesWithSupports)
}
@@ -35,7 +35,7 @@ import com.intellij.psi.util.PsiUtil
import com.intellij.reference.SoftReference
import com.intellij.util.AstLoadingFilter
import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacadeImpl
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
import org.jetbrains.kotlin.asJava.classes.KtLightClassForSourceDeclaration
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtFile
@@ -127,7 +127,7 @@ open class FakeFileForLightClass(
override fun isEquivalentTo(another: PsiElement?) = this == another
override fun setPackageName(packageName: String) {
if (lightClass() is KtLightClassForFacadeImpl) {
if (lightClass() is KtLightClassForFacade) {
ktFile.packageDirective?.fqName = FqName(packageName)
} else {
super.setPackageName(packageName)
@@ -56,7 +56,7 @@ fun KtClassOrObject.toFakeLightClass(): KtFakeLightClass = KotlinAsJavaSupport.g
fun KtFile.findFacadeClass(): KtLightClass? {
return KotlinAsJavaSupport.getInstance(project)
.getFacadeClassesInPackage(packageFqName, this.useScope as? GlobalSearchScope ?: GlobalSearchScope.projectScope(project))
.firstOrNull { it is KtLightClassForFacadeImpl && this in it.files } as? KtLightClass
.firstOrNull { it is KtLightClassForFacade && this in it.files } as? KtLightClass
}
fun KtScript.toLightClass(): KtLightClass? = KotlinAsJavaSupport.getInstance(project).getLightClassForScript(this)