[light classes] move script creation logic to KotlinLightClassFactory
^KT-53097
This commit is contained in:
@@ -110,7 +110,7 @@ class CliKotlinAsJavaSupport(
|
|||||||
|
|
||||||
override fun getLightClass(classOrObject: KtClassOrObject): KtLightClass? = KotlinLightClassFactory.createClass(classOrObject)
|
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> {
|
override fun findClassOrObjectDeclarations(fqName: FqName, searchScope: GlobalSearchScope): Collection<KtClassOrObject> {
|
||||||
return ResolveSessionUtils.getClassDescriptorsByFqName(traceHolder.module, fqName).mapNotNull {
|
return ResolveSessionUtils.getClassDescriptorsByFqName(traceHolder.module, fqName).mapNotNull {
|
||||||
|
|||||||
+21
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.name.FqName
|
|||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.KtCodeFragment
|
import org.jetbrains.kotlin.psi.KtCodeFragment
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
import org.jetbrains.kotlin.psi.KtScript
|
||||||
|
|
||||||
object KotlinLightClassFactory {
|
object KotlinLightClassFactory {
|
||||||
fun createClass(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? =
|
fun createClass(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? =
|
||||||
@@ -77,4 +78,24 @@ object KotlinLightClassFactory {
|
|||||||
createUltraLightClassForFacade(manager, facadeClassFqName, listOf(file)) ?: error { "Unable to create UL class for facade" }
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
-28
@@ -9,18 +9,13 @@ import com.intellij.psi.*
|
|||||||
import com.intellij.psi.impl.PsiSuperMethodImplUtil
|
import com.intellij.psi.impl.PsiSuperMethodImplUtil
|
||||||
import com.intellij.psi.impl.light.LightEmptyImplementsList
|
import com.intellij.psi.impl.light.LightEmptyImplementsList
|
||||||
import com.intellij.psi.impl.light.LightModifierList
|
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 com.intellij.util.IncorrectOperationException
|
||||||
import org.jetbrains.annotations.NonNls
|
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.asJava.elements.FakeFileForLightClass
|
||||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||||
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
|
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.KtCodeFragment
|
|
||||||
import org.jetbrains.kotlin.psi.KtScript
|
import org.jetbrains.kotlin.psi.KtScript
|
||||||
import javax.swing.Icon
|
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}"
|
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 containingBlock = classOrObject.parent as? KtBlockExpression
|
||||||
val containingScript = containingBlock?.parent as? KtScript
|
val containingScript = containingBlock?.parent as? KtScript
|
||||||
containingScript?.let { return KtLightClassForScript.create(it) }
|
containingScript?.let { return KotlinLightClassFactory.createScript(it) }
|
||||||
|
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user