[lc] move SymbolLightClassForDecompiledFacade to common decompiled part
^KT-53543
This commit is contained in:
+32
-6
@@ -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
-5
@@ -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
|
||||
}
|
||||
+1
-14
@@ -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 ->
|
||||
|
||||
Reference in New Issue
Block a user