From 0ea041a1eb3b469a7dd97cd4ca54c50a808a3937 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Wed, 17 Aug 2022 19:45:28 +0200 Subject: [PATCH] [lc] move SymbolLightClassForDecompiledFacade to common decompiled part ^KT-53543 --- .../classes/DecompiledLightClassesFactory.kt | 38 ++++++++++++++++--- .../KtLightClassForDecompiledFacade.kt} | 8 ++-- .../caches/SymbolLightClassFacadeCache.kt | 15 +------- 3 files changed, 36 insertions(+), 25 deletions(-) rename analysis/{symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassForDecompiledFacade.kt => decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightClassForDecompiledFacade.kt} (77%) diff --git a/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/DecompiledLightClassesFactory.kt b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/DecompiledLightClassesFactory.kt index 65bc495c3e8..4ee840fb338 100644 --- a/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/DecompiledLightClassesFactory.kt +++ b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/DecompiledLightClassesFactory.kt @@ -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 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().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, + ): 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( diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassForDecompiledFacade.kt b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightClassForDecompiledFacade.kt similarity index 77% rename from analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassForDecompiledFacade.kt rename to analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightClassForDecompiledFacade.kt index 25a1f1b77de..ea59888034c 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassForDecompiledFacade.kt +++ b/analysis/decompiled/light-classes-for-decompiled/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/KtLightClassForDecompiledFacade.kt @@ -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 } \ No newline at end of file diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/caches/SymbolLightClassFacadeCache.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/caches/SymbolLightClassFacadeCache.kt index 8b4a385300d..4765b3ee598 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/caches/SymbolLightClassFacadeCache.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/caches/SymbolLightClassFacadeCache.kt @@ -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().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 ->