[lc] KotlinAsJavaSupportBase: implement getLightClassForScript

^KT-50241
This commit is contained in:
Dmitry Gridin
2022-09-01 18:59:18 +02:00
committed by Space
parent 46548e5443
commit e58b98bb5c
7 changed files with 29 additions and 66 deletions
@@ -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<TModule>(protected val project: Project) : KotlinAsJavaSupport() {
fun createLightFacade(file: KtFile): Pair<KtLightClassForFacade?, ModificationTracker>? {
@@ -168,6 +165,25 @@ abstract class KotlinAsJavaSupportBase<TModule>(protected val project: Project)
CachedValueProvider.Result.createSingleDependency(clazz, tracker)
}
}
fun createLightScript(script: KtScript): Pair<KtLightClass?, ModificationTracker>? {
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 <T : PsiElement, V> ifValid(element: T, action: () -> V?): V? {
@@ -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)
}
}
}