diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/klib/compilerPipeline.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/klib/compilerPipeline.kt index 9398d2e2d9a..7610800fc32 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/klib/compilerPipeline.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/klib/compilerPipeline.kt @@ -176,6 +176,7 @@ fun compileModuleToAnalyzedFirWithPsi( }, useWasmPlatform = useWasmPlatform, ) + output.runPlatformCheckers(diagnosticsReporter) return AnalyzedFirWithPsiOutput(output, ktFiles) } @@ -204,6 +205,7 @@ fun compileModulesToAnalyzedFirWithLightTree( }, useWasmPlatform = useWasmPlatform, ) + output.runPlatformCheckers(diagnosticsReporter) return AnalyzedFirOutput(output) } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt index 0b0abafa36e..7b526d65235 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.fir.packageFqName import org.jetbrains.kotlin.fir.pipeline.Fir2IrActualizedResult import org.jetbrains.kotlin.fir.pipeline.FirResult import org.jetbrains.kotlin.fir.pipeline.buildResolveAndCheckFirFromKtFiles +import org.jetbrains.kotlin.fir.pipeline.runPlatformCheckers import org.jetbrains.kotlin.fir.types.arrayElementType import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.isArrayType @@ -220,6 +221,7 @@ object FirKotlinToJvmBytecodeCompiler { val outputs = sessionsWithSources.map { (session, sources) -> buildResolveAndCheckFirFromKtFiles(session, sources, diagnosticsReporter) } + outputs.runPlatformCheckers(diagnosticsReporter) return runUnless(syntaxErrors || diagnosticsReporter.hasErrors) { FirResult(outputs) } } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt index 348663ca99e..6f9d9ca849d 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt @@ -314,6 +314,7 @@ fun compileModuleToAnalyzedFir( val outputs = sessionWithSources.map { (session, sources) -> buildResolveAndCheckFirViaLightTree(session, sources, diagnosticsReporter, countFilesAndLines) } + outputs.runPlatformCheckers(diagnosticsReporter) return FirResult(outputs) } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt index 8f61965694c..9ddcb5babeb 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.fir.pipeline.buildFirFromKtFiles import org.jetbrains.kotlin.fir.pipeline.buildFirViaLightTree import org.jetbrains.kotlin.fir.pipeline.resolveAndCheckFir import org.jetbrains.kotlin.fir.resolve.providers.firProvider +import org.jetbrains.kotlin.fir.pipeline.* import org.jetbrains.kotlin.fir.serialization.FirKLibSerializerExtension import org.jetbrains.kotlin.fir.serialization.serializeSingleFirFile import org.jetbrains.kotlin.library.SerializedMetadata @@ -148,6 +149,7 @@ internal class FirMetadataSerializer( } } + outputs.runPlatformCheckers(diagnosticsReporter) return if (diagnosticsReporter.hasErrors) { val renderDiagnosticNames = configuration.getBoolean(CLIConfigurationKeys.RENDER_DIAGNOSTIC_INTERNAL_NAME) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/analyse.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/analyse.kt index 853ea056811..34773f97052 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/analyse.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/analyse.kt @@ -25,7 +25,7 @@ fun FirSession.runCheckers( scopeSession: ScopeSession, firFiles: Collection, reporter: BaseDiagnosticsCollector, - mppCheckerKind: MppCheckerKind = TODO() + mppCheckerKind: MppCheckerKind ): Map> { val collector = DiagnosticComponentsFactory.create(this, scopeSession, mppCheckerKind) collector.collectDiagnosticsInSettings(reporter) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt index d2cb5032ec0..35ae687b50c 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt @@ -13,7 +13,9 @@ import org.jetbrains.kotlin.backend.common.actualizer.SpecialFakeOverrideSymbols import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProvider import org.jetbrains.kotlin.fir.declarations.FirFile @@ -41,6 +43,15 @@ data class Fir2IrActualizedResult( val irActualizedResult: IrActualizedResult?, ) +fun List.runPlatformCheckers(reporter: BaseDiagnosticsCollector) { + val platformModule = this.last() + val session = platformModule.session + val scopeSession = platformModule.scopeSession + + val allFiles = this.flatMap { it.fir } + session.runCheckers(scopeSession, allFiles, reporter, MppCheckerKind.Platform) +} + fun FirResult.convertToIrAndActualize( fir2IrExtensions: Fir2IrExtensions, fir2IrConfiguration: Fir2IrConfiguration, diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/firUtils.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/firUtils.kt index 38793e8be3e..584d985ac92 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/firUtils.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/firUtils.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.KtSourceFile import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind import org.jetbrains.kotlin.fir.builder.PsiRawFirBuilder import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir @@ -63,13 +64,17 @@ fun buildResolveAndCheckFirFromKtFiles( return resolveAndCheckFir(session, session.buildFirFromKtFiles(ktFiles), diagnosticsReporter) } +/** + * This function runs only common checkers + * Platform checkers should be run separately, after all parts of MPP structure will be resolved + */ fun resolveAndCheckFir( session: FirSession, firFiles: List, diagnosticsReporter: BaseDiagnosticsCollector ): ModuleCompilerAnalyzedOutput { val (scopeSession, fir) = session.runResolution(firFiles) - session.runCheckers(scopeSession, fir, diagnosticsReporter) + session.runCheckers(scopeSession, fir, diagnosticsReporter, MppCheckerKind.Common) return ModuleCompilerAnalyzedOutput(session, scopeSession, fir) } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirFrontend.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirFrontend.kt index 1d3965da87b..ba5931b75c4 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirFrontend.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FirFrontend.kt @@ -12,10 +12,7 @@ import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.backend.native.FirNativeOverrideChecker import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar -import org.jetbrains.kotlin.fir.pipeline.FirResult -import org.jetbrains.kotlin.fir.pipeline.ModuleCompilerAnalyzedOutput -import org.jetbrains.kotlin.fir.pipeline.buildResolveAndCheckFirViaLightTree -import org.jetbrains.kotlin.fir.pipeline.buildResolveAndCheckFirFromKtFiles +import org.jetbrains.kotlin.fir.pipeline.* import org.jetbrains.kotlin.fir.resolve.ImplicitIntegerCoercionModuleCapability import org.jetbrains.kotlin.fir.scopes.FirOverrideChecker import org.jetbrains.kotlin.library.isInterop @@ -84,6 +81,8 @@ internal inline fun PhaseContext.firFrontend( } } + outputs.runPlatformCheckers(diagnosticsReporter) + return if (syntaxErrors || diagnosticsReporter.hasErrors) { FirDiagnosticsCompilerResultsReporter.reportToMessageCollector(diagnosticsReporter, messageCollector, renderDiagnosticNames) throw KonanCompilationException("Compilation failed: there were frontend errors") diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/ScriptJvmCompilerImpls.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/ScriptJvmCompilerImpls.kt index 1c17e535433..ace04ca6fdf 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/ScriptJvmCompilerImpls.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/ScriptJvmCompilerImpls.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory +import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar import org.jetbrains.kotlin.fir.pipeline.* @@ -420,7 +421,8 @@ private fun doCompileWithK2( val (scopeSession, fir) = session.runResolution(orderedRawFir) // checkers - session.runCheckers(scopeSession, fir, diagnosticsReporter) + session.runCheckers(scopeSession, fir, diagnosticsReporter, MppCheckerKind.Common) + session.runCheckers(scopeSession, fir, diagnosticsReporter, MppCheckerKind.Platform) val analysisResults = FirResult(listOf(ModuleCompilerAnalyzedOutput(session, scopeSession, fir)))