[lc] move SymbolLightClassForDecompiledFacade to common decompiled part

^KT-53543
This commit is contained in:
Dmitry Gridin
2022-08-17 19:45:28 +02:00
committed by Space
parent d2ddf88cdc
commit 0ea041a1eb
3 changed files with 36 additions and 25 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2022 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.
*/
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.decompiled.light.classes
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.ClassFileViewProvider
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiManager
import com.intellij.psi.impl.compiled.ClsClassImpl
@@ -15,6 +16,8 @@ import com.intellij.psi.impl.compiled.ClsFileImpl
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.analysis.decompiler.psi.file.KtClsFile
import org.jetbrains.kotlin.asJava.builder.ClsWrapperStubPsiFactory
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtEnumEntry
@@ -81,17 +84,40 @@ object DecompiledLightClassesFactory {
}
fun createLightClassForDecompiledKotlinFile(file: KtClsFile, project: Project): KtLightClassForDecompiledDeclaration? {
return createLightClassForDecompiledKotlinFile(project, file) { kotlinClsFile, javaClsClass, classOrObject ->
KtLightClassForDecompiledDeclaration(javaClsClass, javaClsClass.parent, kotlinClsFile, classOrObject)
}
}
private fun <T> createLightClassForDecompiledKotlinFile(
project: Project,
file: KtClsFile,
builder: (kotlinClsFile: KtClsFile, javaClsClass: PsiClass, classOrObject: KtClassOrObject?) -> T
): T? {
val virtualFile = file.virtualFile ?: return null
val classOrObject = file.declarations.filterIsInstance<KtClassOrObject>().singleOrNull()
val javaClsClass = createClsJavaClassFromVirtualFile(
file, virtualFile,
mirrorFile = file,
classFile = virtualFile,
correspondingClassOrObject = classOrObject,
project,
project = project,
) ?: return null
return KtLightClassForDecompiledDeclaration(javaClsClass, javaClsClass.parent, file, classOrObject)
return builder(file, javaClsClass, classOrObject)
}
fun createLightFacadeForDecompiledKotlinFile(
project: Project,
facadeClassFqName: FqName,
files: List<KtFile>,
): KtLightClassForFacade? {
assert(files.all(KtFile::isCompiled))
val file = files.firstOrNull { it.javaFileFacadeFqName == facadeClassFqName } as? KtClsFile
?: error("Can't find the representative decompiled file for $facadeClassFqName")
return createLightClassForDecompiledKotlinFile(project, file) { kotlinClsFile, javaClsClass, classOrObject ->
KtLightClassForDecompiledFacade(javaClsClass, javaClsClass.parent, kotlinClsFile, classOrObject, files)
}
}
fun createClsJavaClassFromVirtualFile(
@@ -3,11 +3,10 @@
* 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.light.classes.symbol.decompiled
package org.jetbrains.kotlin.analysis.decompiled.light.classes
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.decompiled.light.classes.KtLightClassForDecompiledDeclaration
import org.jetbrains.kotlin.analysis.decompiler.psi.file.KtClsFile
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
@@ -16,7 +15,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtFile
internal class SymbolLightClassForDecompiledFacade(
internal class KtLightClassForDecompiledFacade(
clsDelegate: PsiClass,
clsParent: PsiElement,
file: KtClsFile,
@@ -27,6 +26,5 @@ internal class SymbolLightClassForDecompiledFacade(
override val facadeClassFqName: FqName = file.javaFileFacadeFqName
override val originKind: LightClassOriginKind
get() = LightClassOriginKind.BINARY
override val originKind: LightClassOriginKind get() = LightClassOriginKind.BINARY
}
@@ -7,18 +7,14 @@ package org.jetbrains.kotlin.light.classes.symbol.caches
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.decompiled.light.classes.DecompiledLightClassesFactory
import org.jetbrains.kotlin.analysis.decompiler.psi.file.KtClsFile
import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker
import org.jetbrains.kotlin.analysis.utils.caches.getValue
import org.jetbrains.kotlin.analysis.utils.caches.softCachedValue
import org.jetbrains.kotlin.analysis.utils.collections.ConcurrentMapBasedCache
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassForFacade
import org.jetbrains.kotlin.light.classes.symbol.classes.analyzeForLightClasses
import org.jetbrains.kotlin.light.classes.symbol.decompiled.SymbolLightClassForDecompiledFacade
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtFile
import java.util.concurrent.ConcurrentHashMap
@@ -54,16 +50,7 @@ class SymbolLightClassFacadeCache(private val project: Project) {
}
ktFiles.all { it.isCompiled } -> {
val file = ktFiles.firstOrNull { it.javaFileFacadeFqName == facadeClassFqName } as? KtClsFile
?: error("Can't find the representative decompiled file for $facadeClassFqName")
val classOrObject = file.declarations.filterIsInstance<KtClassOrObject>().singleOrNull()
val clsDelegate = DecompiledLightClassesFactory.createClsJavaClassFromVirtualFile(
mirrorFile = file,
classFile = file.virtualFile,
correspondingClassOrObject = classOrObject,
project = project,
) ?: return null
SymbolLightClassForDecompiledFacade(clsDelegate, clsDelegate.parent, file, classOrObject, ktFiles)
DecompiledLightClassesFactory.createLightFacadeForDecompiledKotlinFile(project, facadeClassFqName, ktFiles)
}
else ->