From e58b98bb5cebbe9eed7a80578ab40049acf8930c Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Thu, 1 Sep 2022 18:59:18 +0200 Subject: [PATCH] [lc] KotlinAsJavaSupportBase: implement getLightClassForScript ^KT-50241 --- .../kotlin/asJava/KotlinAsJavaSupportBase.kt | 24 ++++++++++--- .../asJava/classes/KotlinLightClassFactory.kt | 21 ------------ .../symbol/SymbolKotlinAsJavaSupport.kt | 2 +- .../jvm/compiler/CliKotlinAsJavaSupport.kt | 9 +++-- .../cli/jvm/compiler/KotlinCoreEnvironment.kt | 3 -- .../classes/KotlinK1LightClassFactory.kt | 34 ------------------- .../kotlin/asJava/classes/ultraLightClass.kt | 2 +- 7 files changed, 29 insertions(+), 66 deletions(-) delete mode 100644 analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KotlinLightClassFactory.kt delete mode 100644 compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinK1LightClassFactory.kt diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/KotlinAsJavaSupportBase.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/KotlinAsJavaSupportBase.kt index 404f2bf22a7..498dc41405a 100644 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/KotlinAsJavaSupportBase.kt +++ b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/KotlinAsJavaSupportBase.kt @@ -19,10 +19,7 @@ import org.jetbrains.kotlin.asJava.classes.shouldNotBeVisibleAsLightClass import org.jetbrains.kotlin.fileClasses.isJvmMultifileClassFile import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.psi.KotlinDeclarationNavigationPolicy -import org.jetbrains.kotlin.psi.KtClassOrObject -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.analysisContext +import org.jetbrains.kotlin.psi.* abstract class KotlinAsJavaSupportBase(protected val project: Project) : KotlinAsJavaSupport() { fun createLightFacade(file: KtFile): Pair? { @@ -168,6 +165,25 @@ abstract class KotlinAsJavaSupportBase(protected val project: Project) CachedValueProvider.Result.createSingleDependency(clazz, tracker) } } + + fun createLightScript(script: KtScript): Pair? { + val containingFile = script.containingFile + if (containingFile is KtCodeFragment) { + // Avoid building light classes for code fragments + return null + } + + return createInstanceOfLightScript(script) to projectWideOutOfBlockModificationTracker() + } + + protected abstract fun createInstanceOfLightScript(script: KtScript): KtLightClass? + + override fun getLightClassForScript(script: KtScript): KtLightClass? = ifValid(script) { + CachedValuesManager.getCachedValue(script) { + val (lightScript, tracker) = createLightScript(script) ?: (null to projectWideOutOfBlockModificationTracker()) + CachedValueProvider.Result.createSingleDependency(lightScript, tracker) + } + } } private fun ifValid(element: T, action: () -> V?): V? { diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KotlinLightClassFactory.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KotlinLightClassFactory.kt deleted file mode 100644 index 1619d460eb4..00000000000 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KotlinLightClassFactory.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * 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. - */ - -@file:Suppress("unused") - -package org.jetbrains.kotlin.asJava.classes - -import com.intellij.openapi.components.ServiceManager -import org.jetbrains.kotlin.psi.KtScript - -interface KotlinLightClassFactory { - fun createScript(script: KtScript): KtLightClassForScript? - - companion object { - fun createScript(script: KtScript): KtLightClassForScript? { - return ServiceManager.getService(KotlinLightClassFactory::class.java).createScript(script) - } - } -} \ No newline at end of file diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/SymbolKotlinAsJavaSupport.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/SymbolKotlinAsJavaSupport.kt index 3ee3a54674d..4da5797f5a7 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/SymbolKotlinAsJavaSupport.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/SymbolKotlinAsJavaSupport.kt @@ -87,7 +87,7 @@ class SymbolKotlinAsJavaSupport(project: Project) : KotlinAsJavaSupportBase (member as? PackageViewDescriptor)?.fqName } } - override fun getLightClassForScript(script: KtScript): KtLightClassForScript? = KotlinLightClassFactory.createScript(script) + override fun createInstanceOfLightScript(script: KtScript): KtLightClass { + return LightClassGenerationSupport.getInstance(script.project).createUltraLightClassForScript(script) + } override fun findClassOrObjectDeclarations(fqName: FqName, searchScope: GlobalSearchScope): Collection { return ResolveSessionUtils.getClassDescriptorsByFqName(traceHolder.module, fqName).mapNotNull { diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt index 14c148430ad..746c3848f67 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt @@ -42,8 +42,6 @@ import com.intellij.util.lang.UrlClassLoader import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.asJava.KotlinAsJavaSupport import org.jetbrains.kotlin.asJava.LightClassGenerationSupport -import org.jetbrains.kotlin.asJava.classes.KotlinK1LightClassFactory -import org.jetbrains.kotlin.asJava.classes.KotlinLightClassFactory import org.jetbrains.kotlin.asJava.finder.JavaElementFinder import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.cli.common.* @@ -674,7 +672,6 @@ class KotlinCoreEnvironment private constructor( // ability to get text from annotations xml files applicationEnvironment.registerFileType(PlainTextFileType.INSTANCE, "xml") applicationEnvironment.registerParserDefinition(JavaParserDefinition()) - applicationEnvironment.registerApplicationService(KotlinLightClassFactory::class.java, KotlinK1LightClassFactory()) } // made public for Upsource diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinK1LightClassFactory.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinK1LightClassFactory.kt deleted file mode 100644 index bc0eada4821..00000000000 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KotlinK1LightClassFactory.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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. - */ - -package org.jetbrains.kotlin.asJava.classes - -import com.intellij.psi.util.CachedValueProvider -import com.intellij.psi.util.CachedValuesManager -import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService -import org.jetbrains.kotlin.asJava.LightClassGenerationSupport -import org.jetbrains.kotlin.psi.KtCodeFragment -import org.jetbrains.kotlin.psi.KtScript - -class KotlinK1LightClassFactory : KotlinLightClassFactory { - override fun createScript(script: KtScript): KtLightClassForScript? = CachedValuesManager.getCachedValue(script) { - CachedValueProvider.Result.create( - createScriptNoCache(script), - KotlinModificationTrackerService.getInstance(script.project).outOfBlockModificationTracker, - ) - } - - companion object { - fun createScriptNoCache(script: KtScript): KtLightClassForScript? { - val containingFile = script.containingFile - if (containingFile is KtCodeFragment) { - // Avoid building light classes for code fragments - return null - } - - return LightClassGenerationSupport.getInstance(script.project).createUltraLightClassForScript(script) - } - } -} \ No newline at end of file diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt index e048bd3da64..d1dec6ca3d2 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt @@ -489,7 +489,7 @@ open class KtUltraLightClass(classOrObject: KtClassOrObject, internal val suppor val containingBlock = classOrObject.parent as? KtBlockExpression val containingScript = containingBlock?.parent as? KtScript - containingScript?.let { return KotlinLightClassFactory.createScript(it) } + containingScript?.let { return it.toLightClass() } return null }