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:
committed by
Ilya Kirillov
parent
efba90c6f1
commit
225e3a747c
@@ -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
|
||||
}
|
||||
|
||||
+16
@@ -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()
|
||||
}
|
||||
+10
-11
@@ -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
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
+1
-1
@@ -147,6 +147,6 @@ class KtUltraLightClassForFacade(
|
||||
|
||||
override fun getOwnMethods() = _ownMethods
|
||||
|
||||
override fun copy(): KtLightClassForFacadeImpl =
|
||||
override fun copy(): KtLightClassForFacade =
|
||||
KtUltraLightClassForFacade(manager, facadeClassFqName, lightClassDataCache, files, filesWithSupports)
|
||||
}
|
||||
|
||||
+2
-2
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user