From 9a4a30c9bbb37c156973c9ea3c39a9e7f2292bcd Mon Sep 17 00:00:00 2001 From: Artem Kobzar Date: Fri, 14 Oct 2022 13:08:58 +0000 Subject: [PATCH] [K/JS] Add flag for disabling signature uniqueness checks at klib generating phase --- .../cli/common/arguments/CommonCompilerArguments.kt | 6 ++++++ .../src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt | 1 + .../jetbrains/kotlin/config/CommonConfigurationKeys.kt | 4 ++++ .../src/org/jetbrains/kotlin/ir/backend/js/klib.kt | 4 +++- .../js/lower/serialization/ir/JsIrModuleSerializer.kt | 9 +++++++-- compiler/testData/cli/js/jsExtraHelp.out | 2 ++ compiler/testData/cli/jvm/extraHelp.out | 2 ++ 7 files changed, 25 insertions(+), 3 deletions(-) diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt index ef10bb60a3b..a0a29b22363 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt @@ -422,6 +422,12 @@ abstract class CommonCompilerArguments : CommonToolArguments() { ) var normalizeAbsolutePath: Boolean by FreezableVar(false) + @Argument( + value = "-Xklib-enable-signature-clash-checks", + description = "Enable the checks on uniqueness of signatures" + ) + var enableSignatureClashChecks: Boolean by FreezableVar(true) + @Argument(value = "-Xenable-incremental-compilation", description = "Enable incremental compilation") var incrementalCompilation: Boolean? by FreezableVar(null) diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt index 0dd9ca60ed8..87192b35456 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt @@ -216,6 +216,7 @@ class K2JsIrCompiler : CLICompiler() { } configuration.put(CommonConfigurationKeys.KLIB_NORMALIZE_ABSOLUTE_PATH, arguments.normalizeAbsolutePath) + configuration.put(CommonConfigurationKeys.PRODUCE_KLIB_SIGNATURES_CLASH_CHECKS, arguments.enableSignatureClashChecks) val environmentForJS = KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.JS_CONFIG_FILES) diff --git a/compiler/config/src/org/jetbrains/kotlin/config/CommonConfigurationKeys.kt b/compiler/config/src/org/jetbrains/kotlin/config/CommonConfigurationKeys.kt index 5d520d894ba..c6de3c868c3 100644 --- a/compiler/config/src/org/jetbrains/kotlin/config/CommonConfigurationKeys.kt +++ b/compiler/config/src/org/jetbrains/kotlin/config/CommonConfigurationKeys.kt @@ -71,6 +71,10 @@ object CommonConfigurationKeys { val KLIB_NORMALIZE_ABSOLUTE_PATH = CompilerConfigurationKey.create("Normalize absolute paths in klib (replace file separator with '/')") + @JvmField + val PRODUCE_KLIB_SIGNATURES_CLASH_CHECKS = + CompilerConfigurationKey.create("Turn on the checks on uniqueness of signatures") + @JvmField val INCREMENTAL_COMPILATION = CompilerConfigurationKey.create("Enable incremental compilation") diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt index 75afe46b419..8bcd8da30a3 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt @@ -734,6 +734,7 @@ fun serializeModuleIntoKlib( val compatibilityMode = CompatibilityMode(abiVersion) val sourceBaseDirs = configuration[CommonConfigurationKeys.KLIB_RELATIVE_PATH_BASES] ?: emptyList() val absolutePathNormalization = configuration[CommonConfigurationKeys.KLIB_NORMALIZE_ABSOLUTE_PATH] ?: false + val signatureClashChecks = configuration[CommonConfigurationKeys.PRODUCE_KLIB_SIGNATURES_CLASH_CHECKS] ?: false val serializedIr = JsIrModuleSerializer( @@ -743,7 +744,8 @@ fun serializeModuleIntoKlib( compatibilityMode, skipExpects = !configuration.expectActualLinker, normalizeAbsolutePaths = absolutePathNormalization, - sourceBaseDirs = sourceBaseDirs + sourceBaseDirs = sourceBaseDirs, + signatureClashChecks ).serializedIrModule(moduleFragment) val moduleDescriptor = moduleFragment.descriptor diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrModuleSerializer.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrModuleSerializer.kt index de08c957250..64b208869b4 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrModuleSerializer.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrModuleSerializer.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir import org.jetbrains.kotlin.backend.common.serialization.CompatibilityMode import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable +import org.jetbrains.kotlin.backend.common.serialization.IdSignatureClashTracker import org.jetbrains.kotlin.backend.common.serialization.IrModuleSerializer import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.ir.IrBuiltIns @@ -21,10 +22,14 @@ class JsIrModuleSerializer( compatibilityMode: CompatibilityMode, val skipExpects: Boolean, normalizeAbsolutePaths: Boolean, - sourceBaseDirs: Collection + sourceBaseDirs: Collection, + shouldCheckSignaturesOnUniqueness: Boolean = true ) : IrModuleSerializer(messageLogger, compatibilityMode, normalizeAbsolutePaths, sourceBaseDirs) { - private val globalDeclarationTable = JsGlobalDeclarationTable(irBuiltIns) + private val globalDeclarationTable = JsGlobalDeclarationTable( + irBuiltIns, + if (shouldCheckSignaturesOnUniqueness) JsUniqIdClashTracker() else IdSignatureClashTracker.DEFAULT_TRACKER + ) override fun createSerializerForFile(file: IrFile): JsIrFileSerializer = JsIrFileSerializer( diff --git a/compiler/testData/cli/js/jsExtraHelp.out b/compiler/testData/cli/js/jsExtraHelp.out index 682e400eeb3..92cc7494a7f 100644 --- a/compiler/testData/cli/js/jsExtraHelp.out +++ b/compiler/testData/cli/js/jsExtraHelp.out @@ -73,6 +73,8 @@ where advanced options include: -Xeffect-system Enable experimental language feature: effect system -Xenable-builder-inference Use the builder inference by default, for all calls with lambdas which can't be resolved without it. The corresponding calls' declarations may not be marked with @BuilderInference. + -Xklib-enable-signature-clash-checks + Enable the checks on uniqueness of signatures -Xexpect-actual-linker Enable experimental expect/actual linker -Xexplicit-api={strict|warning|disable} Force compiler to report errors on all public API declarations without explicit visibility or return type. diff --git a/compiler/testData/cli/jvm/extraHelp.out b/compiler/testData/cli/jvm/extraHelp.out index 52de3fd3384..993274d0742 100644 --- a/compiler/testData/cli/jvm/extraHelp.out +++ b/compiler/testData/cli/jvm/extraHelp.out @@ -178,6 +178,8 @@ where advanced options include: -Xeffect-system Enable experimental language feature: effect system -Xenable-builder-inference Use the builder inference by default, for all calls with lambdas which can't be resolved without it. The corresponding calls' declarations may not be marked with @BuilderInference. + -Xklib-enable-signature-clash-checks + Enable the checks on uniqueness of signatures -Xexpect-actual-linker Enable experimental expect/actual linker -Xexplicit-api={strict|warning|disable} Force compiler to report errors on all public API declarations without explicit visibility or return type.