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 5bde17a58c3..862896b760d 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,7 +23,6 @@ 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") @@ -51,23 +50,22 @@ class CliExtraDiagnosticsProvider : KotlinExtraDiagnosticsProvider { .findFilesForFacade(facadeFqName, moduleScope) .ifEmpty { return Diagnostics.EMPTY } - 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) + 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) codegen.generate() state.factory.done() + return@generate } - }.extraDiagnostics + + val codegen = state.factory.forMultifileClass(facadeFqName, files) + codegen.generate() + state.factory.done() + } + }.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 cefecc7c63a..4929b664251 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 } - fun createDataHolderForClass(classOrObject: KtClassOrObject, builder: LightClassBuilder): LightClassDataHolder.ForClass { + override 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) } - fun createDataHolderForFacade(builder: LightClassBuilder): LightClassDataHolder.ForFacade { + override fun createDataHolderForFacade(files: Collection, builder: LightClassBuilder): LightClassDataHolder.ForFacade { val (_, _, diagnostics) = builder(getContext()) return LightClassDataHolderImpl(diagnostics) } - fun createDataHolderForScript(builder: LightClassBuilder): LightClassDataHolder.ForScript { + override fun createDataHolderForScript(script: KtScript, 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 1b233412c78..92ce93de6f0 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,7 +19,6 @@ 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( @@ -28,7 +27,7 @@ internal class LightClassDataProviderForClassOrObject( private fun computeLightClassData(): LightClassDataHolder.ForClass { val file = classOrObject.containingKtFile val packageFqName = file.packageFqName - return LightClassGenerationSupport.getInstance(classOrObject.project).cast() + return LightClassGenerationSupport.getInstance(classOrObject.project) .createDataHolderForClass(classOrObject) { constructionContext -> buildLightClass( packageFqName, @@ -45,7 +44,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(), @@ -53,7 +52,9 @@ internal class LightClassDataProviderForClassOrObject( ) } - override fun toString(): String = this::class.java.name + " for " + classOrObject.name + override fun toString(): String { + return this::class.java.name + " for " + classOrObject.name + } } private class ClassFilterForClassOrObject(private val classOrObject: KtClassOrObject) : GenerationState.GenerateClassFilter() { @@ -101,21 +102,19 @@ 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) - .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() - } + 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() } + } } 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 bab06f96522..8f3afc4f54f 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassGenerationSupport.kt @@ -10,6 +10,7 @@ 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 @@ -24,6 +25,12 @@ 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