diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliExtraDiagnosticsProvider.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliExtraDiagnosticsProvider.kt index 862896b760d..5bde17a58c3 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliExtraDiagnosticsProvider.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliExtraDiagnosticsProvider.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtScript import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics +import org.jetbrains.kotlin.utils.addToStdlib.cast private val JAVA_API_STUB_FOR_SCRIPT = Key.create>("JAVA_API_STUB_FOR_SCRIPT") private val JAVA_API_STUB = Key.create>("JAVA_API_STUB") @@ -50,22 +51,23 @@ class CliExtraDiagnosticsProvider : KotlinExtraDiagnosticsProvider { .findFilesForFacade(facadeFqName, moduleScope) .ifEmpty { return Diagnostics.EMPTY } - return LightClassGenerationSupport.getInstance(project).createDataHolderForFacade(files) { constructionContext -> - buildLightClass(facadeFqName.parent(), files, ClassFilterForFacade, constructionContext) generate@{ state, files -> - val representativeFile = files.first() - val fileClassInfo = JvmFileClassUtil.getFileClassInfoNoResolve(representativeFile) - if (!fileClassInfo.withJvmMultifileClass) { - val codegen = state.factory.forPackage(representativeFile.packageFqName, files) + return LightClassGenerationSupport.getInstance(project).cast() + .createDataHolderForFacade { constructionContext -> + buildLightClass(facadeFqName.parent(), files, ClassFilterForFacade, constructionContext) generate@{ state, files -> + val representativeFile = files.first() + val fileClassInfo = JvmFileClassUtil.getFileClassInfoNoResolve(representativeFile) + if (!fileClassInfo.withJvmMultifileClass) { + val codegen = state.factory.forPackage(representativeFile.packageFqName, files) + codegen.generate() + state.factory.done() + return@generate + } + + val codegen = state.factory.forMultifileClass(facadeFqName, files) codegen.generate() state.factory.done() - return@generate } - - val codegen = state.factory.forMultifileClass(facadeFqName, files) - codegen.generate() - state.factory.done() - } - }.extraDiagnostics + }.extraDiagnostics } } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt index 4929b664251..cefecc7c63a 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CliLightClassGenerationSupport.kt @@ -93,7 +93,7 @@ class CliLightClassGenerationSupport( return ultraLightSupport } - override fun createDataHolderForClass(classOrObject: KtClassOrObject, builder: LightClassBuilder): LightClassDataHolder.ForClass { + fun createDataHolderForClass(classOrObject: KtClassOrObject, builder: LightClassBuilder): LightClassDataHolder.ForClass { //force resolve companion for light class generation traceHolder.bindingContext.get(BindingContext.CLASS, classOrObject)?.companionObjectDescriptor @@ -104,12 +104,12 @@ class CliLightClassGenerationSupport( return LightClassDataHolderImpl(diagnostics) } - override fun createDataHolderForFacade(files: Collection, builder: LightClassBuilder): LightClassDataHolder.ForFacade { + fun createDataHolderForFacade(builder: LightClassBuilder): LightClassDataHolder.ForFacade { val (_, _, diagnostics) = builder(getContext()) return LightClassDataHolderImpl(diagnostics) } - override fun createDataHolderForScript(script: KtScript, builder: LightClassBuilder): LightClassDataHolder.ForScript { + fun createDataHolderForScript(builder: LightClassBuilder): LightClassDataHolder.ForScript { val (_, _, diagnostics) = builder(getContext()) return LightClassDataHolderImpl(diagnostics) } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/LightClassDataProvider.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/LightClassDataProvider.kt index 92ce93de6f0..1b233412c78 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/LightClassDataProvider.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/LightClassDataProvider.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.isAncestor +import org.jetbrains.kotlin.utils.addToStdlib.cast import org.jetbrains.org.objectweb.asm.Type internal class LightClassDataProviderForClassOrObject( @@ -27,7 +28,7 @@ internal class LightClassDataProviderForClassOrObject( private fun computeLightClassData(): LightClassDataHolder.ForClass { val file = classOrObject.containingKtFile val packageFqName = file.packageFqName - return LightClassGenerationSupport.getInstance(classOrObject.project) + return LightClassGenerationSupport.getInstance(classOrObject.project).cast() .createDataHolderForClass(classOrObject) { constructionContext -> buildLightClass( packageFqName, @@ -44,7 +45,7 @@ internal class LightClassDataProviderForClassOrObject( } } - override fun compute(): CachedValueProvider.Result? { + override fun compute(): CachedValueProvider.Result { val trackerService = KotlinModificationTrackerService.getInstance(classOrObject.project) return CachedValueProvider.Result.create( computeLightClassData(), @@ -52,9 +53,7 @@ internal class LightClassDataProviderForClassOrObject( ) } - override fun toString(): String { - return this::class.java.name + " for " + classOrObject.name - } + override fun toString(): String = this::class.java.name + " for " + classOrObject.name } private class ClassFilterForClassOrObject(private val classOrObject: KtClassOrObject) : GenerationState.GenerateClassFilter() { @@ -102,19 +101,21 @@ private class ClassFilterForClassOrObject(private val classOrObject: KtClassOrOb internal class LightClassDataProviderForScript(private val script: KtScript) : CachedValueProvider { private fun computeLightClassData(): LightClassDataHolder.ForScript { - return LightClassGenerationSupport.getInstance(script.project).createDataHolderForScript(script) { constructionContext -> - buildLightClass( - script.fqName.parent(), - listOf(script.containingKtFile), - ClassFilterForScript(script), - constructionContext - ) generate@{ state, files -> - val scriptFile = files.first() - val codegen = state.factory.forPackage(scriptFile.packageFqName, files) - codegen.generate() - state.factory.done() + return LightClassGenerationSupport.getInstance(script.project) + .cast() + .createDataHolderForScript { constructionContext -> + buildLightClass( + script.fqName.parent(), + listOf(script.containingKtFile), + ClassFilterForScript(script), + constructionContext + ) generate@{ state, files -> + val scriptFile = files.first() + val codegen = state.factory.forPackage(scriptFile.packageFqName, files) + codegen.generate() + state.factory.done() + } } - } } override fun compute(): CachedValueProvider.Result = diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.kt index 8f3afc4f54f..bab06f96522 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.kt @@ -10,7 +10,6 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiManager import org.jetbrains.kotlin.asJava.builder.LightClassBuilderResult import org.jetbrains.kotlin.asJava.builder.LightClassConstructionContext -import org.jetbrains.kotlin.asJava.builder.LightClassDataHolder import org.jetbrains.kotlin.asJava.classes.* import org.jetbrains.kotlin.config.AnalysisFlags import org.jetbrains.kotlin.descriptors.DeclarationDescriptor @@ -25,12 +24,6 @@ import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor typealias LightClassBuilder = (LightClassConstructionContext) -> LightClassBuilderResult abstract class LightClassGenerationSupport { - abstract fun createDataHolderForClass(classOrObject: KtClassOrObject, builder: LightClassBuilder): LightClassDataHolder.ForClass - - abstract fun createDataHolderForFacade(files: Collection, builder: LightClassBuilder): LightClassDataHolder.ForFacade - - abstract fun createDataHolderForScript(script: KtScript, builder: LightClassBuilder): LightClassDataHolder.ForScript - abstract fun resolveToDescriptor(declaration: KtDeclaration): DeclarationDescriptor? abstract fun analyze(element: KtElement): BindingContext