From 95648f1a9e6130b695060977d4dcde1bb97a18ab Mon Sep 17 00:00:00 2001 From: Andrey Uskov Date: Thu, 25 Nov 2021 23:52:31 +0300 Subject: [PATCH] Fix incremental compilation in some compiler plugins If compiler plugin removes source files between rounds of incremental compilation, it may result into incorrect state of stubs. But rebuilding stubs may require services available in UI mode only and cause compiler failure. This commit contains work-around allowing to avoid incorrect state of stubs. #KT-49340 Fixed --- .../common/CommonCompilerPerformanceManager.kt | 16 +++------------- .../jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt | 2 +- .../kotlin/cli/metadata/K2MetadataCompiler.kt | 4 +++- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CommonCompilerPerformanceManager.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CommonCompilerPerformanceManager.kt index e768ee7c957..eccf2cb2111 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CommonCompilerPerformanceManager.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CommonCompilerPerformanceManager.kt @@ -5,8 +5,6 @@ package org.jetbrains.kotlin.cli.common -import com.intellij.openapi.util.text.StringUtil -import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.util.PerformanceCounter import java.io.File import java.lang.management.GarbageCollectorMXBean @@ -28,7 +26,6 @@ abstract class CommonCompilerPerformanceManager(private val presentableName: Str private var irGenerationStart: Long = 0 private var targetDescription: String? = null - private var sourceFiles: List? = null protected var files: Int? = null protected var lines: Int? = null @@ -45,19 +42,12 @@ abstract class CommonCompilerPerformanceManager(private val presentableName: Str private fun deltaTime(start: Long): Long = PerformanceCounter.currentTime() - start - private fun countLinesOfCode(sourceFiles: List): Int = - sourceFiles.sumBy { sourceFile -> - val text = sourceFile.text - StringUtil.getLineBreakCount(text) + (if (StringUtil.endsWithLineBreak(text)) 0 else 1) - } - - open fun notifyCompilerInitialized(sourceFiles: List, targetDescription: String) { + open fun notifyCompilerInitialized(files: Int, lines: Int, targetDescription: String) { if (!isEnabled) return recordInitializationTime() - this.sourceFiles = sourceFiles - this.files = sourceFiles.size - this.lines = countLinesOfCode(sourceFiles) + this.files = files + this.lines = lines this.targetDescription = targetDescription } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt index f5cf22c69c0..057d7d7607f 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt @@ -230,7 +230,7 @@ class K2JVMCompiler : CLICompiler() { val sourceFiles = environment.getSourceFiles() configuration[CLIConfigurationKeys.PERF_MANAGER]?.notifyCompilerInitialized( - sourceFiles, targetDescription + sourceFiles.size, environment.countLinesOfCode(sourceFiles), targetDescription ) return if (messageCollector.hasErrors()) null else environment diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataCompiler.kt index b3cd8e1aa07..82ee7af65ca 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataCompiler.kt @@ -96,7 +96,9 @@ class K2MetadataCompiler : CLICompiler() { KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.METADATA_CONFIG_FILES) val mode = if(arguments.expectActualLinker) "KLib" else "metadata" - performanceManager.notifyCompilerInitialized(environment.getSourceFiles(), "$mode mode for $moduleName module") + + val sourceFiles = environment.getSourceFiles() + performanceManager.notifyCompilerInitialized(sourceFiles.size, environment.countLinesOfCode(sourceFiles), "$mode mode for $moduleName module") if (environment.getSourceFiles().isEmpty()) { if (arguments.version) {