[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.
|
* 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.project.Project
|
||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import com.intellij.psi.ClassFileViewProvider
|
import com.intellij.psi.ClassFileViewProvider
|
||||||
|
import com.intellij.psi.PsiClass
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiManager
|
import com.intellij.psi.PsiManager
|
||||||
import com.intellij.psi.impl.compiled.ClsClassImpl
|
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 com.intellij.psi.util.PsiTreeUtil
|
||||||
import org.jetbrains.kotlin.analysis.decompiler.psi.file.KtClsFile
|
import org.jetbrains.kotlin.analysis.decompiler.psi.file.KtClsFile
|
||||||
import org.jetbrains.kotlin.asJava.builder.ClsWrapperStubPsiFactory
|
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.name.FqName
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.KtEnumEntry
|
import org.jetbrains.kotlin.psi.KtEnumEntry
|
||||||
@@ -81,17 +84,40 @@ object DecompiledLightClassesFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun createLightClassForDecompiledKotlinFile(file: KtClsFile, project: Project): KtLightClassForDecompiledDeclaration? {
|
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 virtualFile = file.virtualFile ?: return null
|
||||||
|
|
||||||
val classOrObject = file.declarations.filterIsInstance<KtClassOrObject>().singleOrNull()
|
val classOrObject = file.declarations.filterIsInstance<KtClassOrObject>().singleOrNull()
|
||||||
|
|
||||||
val javaClsClass = createClsJavaClassFromVirtualFile(
|
val javaClsClass = createClsJavaClassFromVirtualFile(
|
||||||
file, virtualFile,
|
mirrorFile = file,
|
||||||
|
classFile = virtualFile,
|
||||||
correspondingClassOrObject = classOrObject,
|
correspondingClassOrObject = classOrObject,
|
||||||
project,
|
project = project,
|
||||||
) ?: return null
|
) ?: 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(
|
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.
|
* 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.PsiClass
|
||||||
import com.intellij.psi.PsiElement
|
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.analysis.decompiler.psi.file.KtClsFile
|
||||||
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
|
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
|
||||||
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
|
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.KtClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
internal class SymbolLightClassForDecompiledFacade(
|
internal class KtLightClassForDecompiledFacade(
|
||||||
clsDelegate: PsiClass,
|
clsDelegate: PsiClass,
|
||||||
clsParent: PsiElement,
|
clsParent: PsiElement,
|
||||||
file: KtClsFile,
|
file: KtClsFile,
|
||||||
@@ -27,6 +26,5 @@ internal class SymbolLightClassForDecompiledFacade(
|
|||||||
|
|
||||||
override val facadeClassFqName: FqName = file.javaFileFacadeFqName
|
override val facadeClassFqName: FqName = file.javaFileFacadeFqName
|
||||||
|
|
||||||
override val originKind: LightClassOriginKind
|
override val originKind: LightClassOriginKind get() = LightClassOriginKind.BINARY
|
||||||
get() = LightClassOriginKind.BINARY
|
|
||||||
}
|
}
|
||||||
+1
-14
@@ -7,18 +7,14 @@ package org.jetbrains.kotlin.light.classes.symbol.caches
|
|||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import org.jetbrains.kotlin.analysis.decompiled.light.classes.DecompiledLightClassesFactory
|
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.providers.createProjectWideOutOfBlockModificationTracker
|
||||||
import org.jetbrains.kotlin.analysis.utils.caches.getValue
|
import org.jetbrains.kotlin.analysis.utils.caches.getValue
|
||||||
import org.jetbrains.kotlin.analysis.utils.caches.softCachedValue
|
import org.jetbrains.kotlin.analysis.utils.caches.softCachedValue
|
||||||
import org.jetbrains.kotlin.analysis.utils.collections.ConcurrentMapBasedCache
|
import org.jetbrains.kotlin.analysis.utils.collections.ConcurrentMapBasedCache
|
||||||
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
|
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.SymbolLightClassForFacade
|
||||||
import org.jetbrains.kotlin.light.classes.symbol.classes.analyzeForLightClasses
|
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.name.FqName
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
|
||||||
@@ -54,16 +50,7 @@ class SymbolLightClassFacadeCache(private val project: Project) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ktFiles.all { it.isCompiled } -> {
|
ktFiles.all { it.isCompiled } -> {
|
||||||
val file = ktFiles.firstOrNull { it.javaFileFacadeFqName == facadeClassFqName } as? KtClsFile
|
DecompiledLightClassesFactory.createLightFacadeForDecompiledKotlinFile(project, facadeClassFqName, ktFiles)
|
||||||
?: 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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else ->
|
else ->
|
||||||
|
|||||||
Reference in New Issue
Block a user