From dc552c9fe388b79dd9c2e3aae794f5ce2dc2c5e4 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Fri, 8 Jul 2022 18:51:37 +0200 Subject: [PATCH] [light classes] move facade creation logic to KotlinLightClassFactory ^KT-53097 --- .../jvm/compiler/CliKotlinAsJavaSupport.kt | 4 +- .../kotlin/asJava/classes/FacadeCache.kt | 4 +- .../asJava/classes/KotlinLightClassFactory.kt | 41 ++++++++++++++++++- .../classes/KtLightClassForFacadeImpl.kt | 39 ------------------ 4 files changed, 44 insertions(+), 44 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliKotlinAsJavaSupport.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliKotlinAsJavaSupport.kt index 2f75c17f800..2a3fd73f632 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliKotlinAsJavaSupport.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliKotlinAsJavaSupport.kt @@ -36,7 +36,7 @@ class CliKotlinAsJavaSupport( return findFacadeFilesInPackage(packageFqName, scope) .groupBy { it.javaFileFacadeFqName } .mapNotNull { (facadeClassFqName, _) -> - KtLightClassForFacadeImpl.createForFacade(psiManager, facadeClassFqName, scope) + KotlinLightClassFactory.createFacade(psiManager, facadeClassFqName, scope) } } @@ -53,7 +53,7 @@ class CliKotlinAsJavaSupport( .orEmpty() override fun getFacadeClasses(facadeFqName: FqName, scope: GlobalSearchScope): Collection { - return listOfNotNull(KtLightClassForFacadeImpl.createForFacade(psiManager, facadeFqName, scope)) + return listOfNotNull(KotlinLightClassFactory.createFacade(psiManager, facadeFqName, scope)) } override fun getScriptClasses(scriptFqName: FqName, scope: GlobalSearchScope): Collection { diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/FacadeCache.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/FacadeCache.kt index a5f5902528a..2843e86509d 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/FacadeCache.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/FacadeCache.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 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. */ @@ -27,7 +27,7 @@ class FacadeCache(private val project: Project) { private inner class FacadeCacheData { val cache = object : SLRUCache(20, 30) { override fun createValue(key: FacadeCacheKey): ValueWrapper = - KtLightClassForFacadeImpl.createForFacadeNoCache(key.fqName, key.searchScope, project) + KotlinLightClassFactory.createFacadeNoCache(key.fqName, key.searchScope, project) ?.let { ValueWrapper(it) } ?: ValueWrapper.Null } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinLightClassFactory.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinLightClassFactory.kt index 0c0397529ae..2be4f189053 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinLightClassFactory.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinLightClassFactory.kt @@ -3,16 +3,22 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -@file:Suppress("unused") +@file:Suppress("unused", "MemberVisibilityCanBePrivate") package org.jetbrains.kotlin.asJava.classes +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiManager +import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService +import org.jetbrains.kotlin.asJava.KotlinAsJavaSupport import org.jetbrains.kotlin.asJava.LightClassGenerationSupport +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtCodeFragment +import org.jetbrains.kotlin.psi.KtFile object KotlinLightClassFactory { fun createClass(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? = @@ -38,4 +44,37 @@ object KotlinLightClassFactory { createUltraLightClass(classOrObject) } } + + fun createFacadeNoCache(fqName: FqName, searchScope: GlobalSearchScope, project: Project): KtLightClassForFacade? { + val sources = KotlinAsJavaSupport.getInstance(project) + .findFilesForFacade(fqName, searchScope) + .filterNot { it.isCompiled || it.isScript() } + + if (sources.isEmpty()) return null + val manager = PsiManager.getInstance(project) + return LightClassGenerationSupport.getInstance(project).run { + if (!canCreateUltraLightClassForFacade(sources)) return null + createUltraLightClassForFacade(manager, fqName, sources) + ?: error("Unable to create UL class for facade: $fqName for ${sources.joinToString { it.virtualFilePath }}") + } + } + + fun createFacade( + manager: PsiManager, + facadeClassFqName: FqName, + searchScope: GlobalSearchScope + ): KtLightClassForFacade? { + return FacadeCache.getInstance(manager.project)[facadeClassFqName, searchScope] + } + + fun createFacadeForSyntheticFile( + facadeClassFqName: FqName, + file: KtFile + ): KtLightClassForFacade { + val project = file.project + val manager = PsiManager.getInstance(project) + return LightClassGenerationSupport.getInstance(project).run { + createUltraLightClassForFacade(manager, facadeClassFqName, listOf(file)) ?: error { "Unable to create UL class for facade" } + } + } } \ No newline at end of file diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacadeImpl.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacadeImpl.kt index cab430225f8..23f75516750 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacadeImpl.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacadeImpl.kt @@ -5,16 +5,12 @@ package org.jetbrains.kotlin.asJava.classes -import com.intellij.openapi.project.Project import com.intellij.openapi.util.TextRange import com.intellij.psi.* import com.intellij.psi.impl.PsiSuperMethodImplUtil import com.intellij.psi.impl.light.LightEmptyImplementsList import com.intellij.psi.impl.light.LightModifierList -import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.annotations.NonNls -import org.jetbrains.kotlin.asJava.KotlinAsJavaSupport -import org.jetbrains.kotlin.asJava.LightClassGenerationSupport import org.jetbrains.kotlin.asJava.elements.FakeFileForLightClass import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName @@ -210,39 +206,4 @@ abstract class KtLightClassForFacadeImpl constructor( override fun isWritable() = files.all { it.isWritable } override fun getVisibleSignatures(): MutableCollection = PsiSuperMethodImplUtil.getVisibleSignatures(this) - - companion object { - - fun createForFacadeNoCache(fqName: FqName, searchScope: GlobalSearchScope, project: Project): KtLightClassForFacade? { - val sources = KotlinAsJavaSupport.getInstance(project).findFilesForFacade(fqName, searchScope) - .filterNot { it.isCompiled || it.isScript() } - - if (sources.isEmpty()) return null - val manager = PsiManager.getInstance(project) - return LightClassGenerationSupport.getInstance(project).run { - if (!canCreateUltraLightClassForFacade(sources)) return null - createUltraLightClassForFacade(manager, fqName, sources) - ?: error("Unable to create UL class for facade: $fqName for ${sources.joinToString { it.virtualFilePath }}") - } - } - - fun createForFacade( - manager: PsiManager, - facadeClassFqName: FqName, - searchScope: GlobalSearchScope - ): KtLightClassForFacade? { - return FacadeCache.getInstance(manager.project)[facadeClassFqName, searchScope] - } - - fun createForSyntheticFile( - facadeClassFqName: FqName, - file: KtFile - ): KtLightClassForFacade { - val project = file.project - val manager = PsiManager.getInstance(project) - return LightClassGenerationSupport.getInstance(project).run { - createUltraLightClassForFacade(manager, facadeClassFqName, listOf(file)) ?: error { "Unable to create UL class for facade" } - } - } - } }