[light classes] move script creation logic to KotlinLightClassFactory

^KT-53097
This commit is contained in:
Dmitry Gridin
2022-07-08 18:54:28 +02:00
committed by Space
parent dc552c9fe3
commit e5519064f4
4 changed files with 23 additions and 30 deletions
@@ -110,7 +110,7 @@ class CliKotlinAsJavaSupport(
override fun getLightClass(classOrObject: KtClassOrObject): KtLightClass? = KotlinLightClassFactory.createClass(classOrObject)
override fun getLightClassForScript(script: KtScript): KtLightClassForScript? = KtLightClassForScript.create(script)
override fun getLightClassForScript(script: KtScript): KtLightClassForScript? = KotlinLightClassFactory.createScript(script)
override fun findClassOrObjectDeclarations(fqName: FqName, searchScope: GlobalSearchScope): Collection<KtClassOrObject> {
return ResolveSessionUtils.getClassDescriptorsByFqName(traceHolder.module, fqName).mapNotNull {
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtCodeFragment
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtScript
object KotlinLightClassFactory {
fun createClass(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? =
@@ -77,4 +78,24 @@ object KotlinLightClassFactory {
createUltraLightClassForFacade(manager, facadeClassFqName, listOf(file)) ?: error { "Unable to create UL class for facade" }
}
}
fun createScript(script: KtScript): KtLightClassForScript? =
CachedValuesManager.getCachedValue(script) {
CachedValueProvider.Result.create(
createScriptNoCache(script),
KotlinModificationTrackerService.getInstance(script.project).outOfBlockModificationTracker,
)
}
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).run {
createUltraLightClassForScript(script)
}
}
}
@@ -9,18 +9,13 @@ 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.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager
import com.intellij.util.IncorrectOperationException
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.asJava.elements.FakeFileForLightClass
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtCodeFragment
import org.jetbrains.kotlin.psi.KtScript
import javax.swing.Icon
@@ -157,27 +152,4 @@ abstract class KtLightClassForScript(val script: KtScript) : KtLightClassBase(sc
}
override fun toString() = "${KtLightClassForScript::class.java.simpleName}:${script.fqName}"
companion object {
fun create(script: KtScript): KtLightClassForScript? =
CachedValuesManager.getCachedValue(script) {
CachedValueProvider.Result
.create(
createNoCache(script),
KotlinModificationTrackerService.getInstance(script.project).outOfBlockModificationTracker,
)
}
fun createNoCache(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).run {
createUltraLightClassForScript(script)
}
}
}
}
@@ -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 KtLightClassForScript.create(it) }
containingScript?.let { return KotlinLightClassFactory.createScript(it) }
return null
}