[FIR] Part 3. Setup running platform checkers in CLI

^KT-58881
This commit is contained in:
Dmitriy Novozhilov
2024-01-09 13:23:18 +02:00
committed by Nikolay Lunyak
parent c4e4776c5e
commit ed874262e3
9 changed files with 31 additions and 7 deletions
@@ -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)
}
@@ -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) }
}
@@ -314,6 +314,7 @@ fun compileModuleToAnalyzedFir(
val outputs = sessionWithSources.map { (session, sources) ->
buildResolveAndCheckFirViaLightTree(session, sources, diagnosticsReporter, countFilesAndLines)
}
outputs.runPlatformCheckers(diagnosticsReporter)
return FirResult(outputs)
}
@@ -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)
@@ -25,7 +25,7 @@ fun FirSession.runCheckers(
scopeSession: ScopeSession,
firFiles: Collection<FirFile>,
reporter: BaseDiagnosticsCollector,
mppCheckerKind: MppCheckerKind = TODO()
mppCheckerKind: MppCheckerKind
): Map<FirFile, List<KtDiagnostic>> {
val collector = DiagnosticComponentsFactory.create(this, scopeSession, mppCheckerKind)
collector.collectDiagnosticsInSettings(reporter)
@@ -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<ModuleCompilerAnalyzedOutput>.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,
@@ -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<FirFile>,
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)
}
@@ -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 <F> PhaseContext.firFrontend(
}
}
outputs.runPlatformCheckers(diagnosticsReporter)
return if (syntaxErrors || diagnosticsReporter.hasErrors) {
FirDiagnosticsCompilerResultsReporter.reportToMessageCollector(diagnosticsReporter, messageCollector, renderDiagnosticNames)
throw KonanCompilationException("Compilation failed: there were frontend errors")
@@ -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)))