@@ -42,15 +42,15 @@ import org.jetbrains.kotlin.config.CompilerConfiguration
42
42
import org.jetbrains.kotlin.config.JVMConfigurationKeys
43
43
import org.jetbrains.kotlin.config.languageVersionSettings
44
44
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
45
+ import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector
45
46
import org.jetbrains.kotlin.ir.backend.jvm.jvmResolveLibraries
46
47
import org.jetbrains.kotlin.load.kotlin.ModuleVisibilityManager
47
48
import org.jetbrains.kotlin.modules.Module
48
49
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus
49
50
import org.jetbrains.kotlin.psi.KtFile
51
+ import org.jetbrains.kotlin.resolve.BindingContext
50
52
import org.jetbrains.kotlin.resolve.jvm.KotlinJavaPsiFacade
51
- import org.jetbrains.kotlin.utils.newLinkedHashMapWithExpectedSize
52
53
import java.io.File
53
- import kotlin.collections.set
54
54
55
55
object KotlinToJVMBytecodeCompiler {
56
56
internal fun compileModules (
@@ -111,11 +111,12 @@ object KotlinToJVMBytecodeCompiler {
111
111
findMainClass(result.bindingContext, projectConfiguration.languageVersionSettings, environment.getSourceFiles())
112
112
else null
113
113
114
- val outputs = newLinkedHashMapWithExpectedSize<Module , GenerationState >(chunk.size)
115
-
116
114
val localFileSystem = VirtualFileManager .getInstance().getFileSystem(StandardFileSystems .FILE_PROTOCOL )
117
115
118
116
val (codegenFactory, wholeBackendInput) = convertToIr(environment, result)
117
+ val diagnosticsReporter = DiagnosticReporterFactory .createReporter()
118
+
119
+ val codegenInputs = ArrayList <CodegenFactory .CodegenInput >(chunk.size)
119
120
120
121
for (module in chunk) {
121
122
ProgressIndicatorAndCompilationCanceledStatus .checkCanceled()
@@ -125,13 +126,20 @@ object KotlinToJVMBytecodeCompiler {
125
126
val moduleConfiguration = projectConfiguration.applyModuleProperties(module, buildFile)
126
127
127
128
val backendInput = codegenFactory.getModuleChunkBackendInput(wholeBackendInput, ktFiles)
128
- outputs[module] = generate(environment, moduleConfiguration, result, ktFiles, module, codegenFactory, backendInput)
129
+ codegenInputs + = runLowerings(
130
+ environment, moduleConfiguration, result, ktFiles, module, codegenFactory, backendInput, diagnosticsReporter
131
+ )
132
+ }
133
+
134
+ val outputs = ArrayList <GenerationState >(chunk.size)
135
+
136
+ for (input in codegenInputs) {
137
+ outputs + = runCodegen(input, input.state, result.bindingContext, diagnosticsReporter, environment.configuration)
129
138
}
130
139
131
140
return writeOutputs(environment.project, projectConfiguration, chunk, outputs, mainClassFqName)
132
141
}
133
142
134
-
135
143
internal fun configureSourceRoots (configuration : CompilerConfiguration , chunk : List <Module >, buildFile : File ? = null) {
136
144
for (module in chunk) {
137
145
val commonSources = getBuildFilePaths(buildFile, module.getCommonSourceFiles()).toSet()
@@ -240,7 +248,12 @@ object KotlinToJVMBytecodeCompiler {
240
248
result.throwIfError()
241
249
242
250
val (codegenFactory, backendInput) = convertToIr(environment, result)
243
- return generate(environment, environment.configuration, result, environment.getSourceFiles(), null , codegenFactory, backendInput)
251
+ val diagnosticsReporter = DiagnosticReporterFactory .createReporter()
252
+ val input = runLowerings(
253
+ environment, environment.configuration, result, environment.getSourceFiles(), null , codegenFactory, backendInput,
254
+ diagnosticsReporter
255
+ )
256
+ return runCodegen(input, input.state, result.bindingContext, diagnosticsReporter, environment.configuration)
244
257
}
245
258
246
259
private fun convertToIr (environment : KotlinCoreEnvironment , result : AnalysisResult ): Pair <CodegenFactory , CodegenFactory .BackendInput > {
@@ -325,17 +338,16 @@ object KotlinToJVMBytecodeCompiler {
325
338
override fun toString () = " All files under: $directories "
326
339
}
327
340
328
- private fun generate (
341
+ private fun runLowerings (
329
342
environment : KotlinCoreEnvironment ,
330
343
configuration : CompilerConfiguration ,
331
344
result : AnalysisResult ,
332
345
sourceFiles : List <KtFile >,
333
346
module : Module ? ,
334
347
codegenFactory : CodegenFactory ,
335
348
backendInput : CodegenFactory .BackendInput ,
336
- ): GenerationState {
337
- val diagnosticsReporter = DiagnosticReporterFactory .createReporter()
338
-
349
+ diagnosticsReporter : BaseDiagnosticsCollector ,
350
+ ): CodegenFactory .CodegenInput {
339
351
val state = GenerationState .Builder (
340
352
environment.project,
341
353
ClassBuilderFactories .BINARIES ,
@@ -352,30 +364,41 @@ object KotlinToJVMBytecodeCompiler {
352
364
353
365
ProgressIndicatorAndCompilationCanceledStatus .checkCanceled()
354
366
355
- val performanceManager = environment.configuration.get(CLIConfigurationKeys .PERF_MANAGER )
356
- performanceManager?.notifyGenerationStarted()
367
+ environment.configuration.get(CLIConfigurationKeys .PERF_MANAGER )?.notifyGenerationStarted()
357
368
358
369
state.beforeCompile()
359
370
360
371
ProgressIndicatorAndCompilationCanceledStatus .checkCanceled()
361
372
362
- codegenFactory.generateModule(state, backendInput)
373
+ return codegenFactory.invokeLowerings(state, backendInput)
374
+ }
375
+
376
+ private fun runCodegen (
377
+ codegenInput : CodegenFactory .CodegenInput ,
378
+ state : GenerationState ,
379
+ bindingContext : BindingContext ,
380
+ diagnosticsReporter : BaseDiagnosticsCollector ,
381
+ configuration : CompilerConfiguration ,
382
+ ): GenerationState {
383
+ ProgressIndicatorAndCompilationCanceledStatus .checkCanceled()
384
+ state.codegenFactory.invokeCodegen(codegenInput)
363
385
364
386
CodegenFactory .doCheckCancelled(state)
365
387
state.factory.done()
366
388
367
- performanceManager ?.notifyGenerationFinished()
389
+ configuration.get( CLIConfigurationKeys . PERF_MANAGER ) ?.notifyGenerationFinished()
368
390
369
391
ProgressIndicatorAndCompilationCanceledStatus .checkCanceled()
370
392
393
+ val messageCollector = configuration.getNotNull(CLIConfigurationKeys .MESSAGE_COLLECTOR_KEY )
371
394
AnalyzerWithCompilerReport .reportDiagnostics(
372
395
FilteredJvmDiagnostics (
373
396
state.collectedExtraJvmDiagnostics,
374
- result. bindingContext.diagnostics
397
+ bindingContext.diagnostics
375
398
),
376
- environment. messageCollector
399
+ messageCollector
377
400
)
378
- FirDiagnosticsCompilerResultsReporter .reportToMessageCollector(diagnosticsReporter, environment. messageCollector)
401
+ FirDiagnosticsCompilerResultsReporter .reportToMessageCollector(diagnosticsReporter, messageCollector)
379
402
380
403
ProgressIndicatorAndCompilationCanceledStatus .checkCanceled()
381
404
return state
0 commit comments