diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompilerFacility.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompilerFacility.kt index 69779a2a3f0..bf77fee8127 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompilerFacility.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompilerFacility.kt @@ -144,7 +144,8 @@ internal class KtFirCompilerFacility( linkViaSignatures = false, effectiveConfiguration[CommonConfigurationKeys.EVALUATED_CONST_TRACKER] ?: EvaluatedConstTracker.create(), effectiveConfiguration[CommonConfigurationKeys.INLINE_CONST_TRACKER], - allowNonCachedDeclarations = true + allowNonCachedDeclarations = true, + useIrFakeOverrideBuilder = effectiveConfiguration.getBoolean(CommonConfigurationKeys.USE_IR_FAKE_OVERRIDE_BUILDER), ) val fir2IrResult = Fir2IrConverter.createIrModuleFragment( diff --git a/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArgumentsCopyGenerated.kt b/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArgumentsCopyGenerated.kt index b054e02d0cb..2fbc1f857d8 100644 --- a/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArgumentsCopyGenerated.kt +++ b/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArgumentsCopyGenerated.kt @@ -82,6 +82,7 @@ fun copyCommonCompilerArguments(from: CommonCompilerArguments, to: CommonCompile to.useFirExtendedCheckers = from.useFirExtendedCheckers to.useFirIC = from.useFirIC to.useFirLT = from.useFirLT + to.useIrFakeOverrideBuilder = from.useIrFakeOverrideBuilder to.useK2 = from.useK2 to.useMixedNamedArguments = from.useMixedNamedArguments to.verbosePhases = from.verbosePhases?.copyOf() diff --git a/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/K2NativeCompilerArgumentsCopyGenerated.kt b/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/K2NativeCompilerArgumentsCopyGenerated.kt index e5aa6d4d64d..0a402a96c4c 100644 --- a/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/K2NativeCompilerArgumentsCopyGenerated.kt +++ b/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/K2NativeCompilerArgumentsCopyGenerated.kt @@ -105,4 +105,4 @@ fun copyK2NativeCompilerArguments(from: K2NativeCompilerArguments, to: K2NativeC to.workerExceptionHandling = from.workerExceptionHandling return to -} \ No newline at end of file +} 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 22a73fe2407..77723b3a865 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 @@ -542,6 +542,16 @@ abstract class CommonCompilerArguments : CommonToolArguments() { field = value } + @Argument( + value = "-Xuse-ir-fake-override-builder", + description = "Generate fake overrides via IR. See KT-61514" + ) + var useIrFakeOverrideBuilder = false + set(value) { + checkFrozen() + field = value + } + @Argument( value = "-Xdisable-ultra-light-classes", description = "Do not use the ultra light classes implementation" 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 a0ad40dc368..c5d4740e7cf 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 @@ -241,6 +241,8 @@ fun transformFirToIr( .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), inlineConstTracker = null, allowNonCachedDeclarations = false, + useIrFakeOverrideBuilder = + moduleStructure.compilerConfiguration.getBoolean(CommonConfigurationKeys.USE_IR_FAKE_OVERRIDE_BUILDER), ), IrGenerationExtension.getInstances(moduleStructure.project), signatureComposer = DescriptorSignatureComposerStub(JsManglerDesc), diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/arguments.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/arguments.kt index abbcd3de348..6761142ad92 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/arguments.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/arguments.kt @@ -34,6 +34,7 @@ fun CompilerConfiguration.setupCommonArguments( put(CommonConfigurationKeys.INCREMENTAL_COMPILATION, incrementalCompilationIsEnabled(arguments)) put(CommonConfigurationKeys.ALLOW_ANY_SCRIPTS_IN_SOURCE_ROOTS, arguments.allowAnyScriptsInSourceRoots) put(CommonConfigurationKeys.IGNORE_CONST_OPTIMIZATION_ERRORS, arguments.ignoreConstOptimizationErrors) + put(CommonConfigurationKeys.USE_IR_FAKE_OVERRIDE_BUILDER, arguments.useIrFakeOverrideBuilder) val metadataVersionString = arguments.metadataVersion if (metadataVersionString != null) { 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 7ad360701a2..08a4495ebe0 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 @@ -21,20 +21,27 @@ import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.generateCodeFromIr import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar -import org.jetbrains.kotlin.config.* +import org.jetbrains.kotlin.config.CommonConfigurationKeys +import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.JVMConfigurationKeys +import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.constant.EvaluatedConstTracker import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.diagnostics.impl.PendingDiagnosticsCollectorWithSuppress -import org.jetbrains.kotlin.fir.* -import org.jetbrains.kotlin.fir.backend.* -import org.jetbrains.kotlin.fir.backend.jvm.* +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration +import org.jetbrains.kotlin.fir.backend.jvm.JvmFir2IrExtensions import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.extensions.FirAnalysisHandlerExtension import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar -import org.jetbrains.kotlin.fir.pipeline.* +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.convertToIrAndActualizeForJvm import org.jetbrains.kotlin.fir.types.arrayElementType import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.isArrayType @@ -237,6 +244,7 @@ object FirKotlinToJvmBytecodeCompiler { .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), inlineConstTracker = configuration[CommonConfigurationKeys.INLINE_CONST_TRACKER], allowNonCachedDeclarations = false, + useIrFakeOverrideBuilder = configuration.getBoolean(CommonConfigurationKeys.USE_IR_FAKE_OVERRIDE_BUILDER), ) return firResult.convertToIrAndActualizeForJvm( fir2IrExtensions, 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 80d6927dbb3..0e5136c34cb 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 @@ -185,6 +185,7 @@ fun convertAnalyzedFirToIr( .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), inlineConstTracker = input.configuration[CommonConfigurationKeys.INLINE_CONST_TRACKER], allowNonCachedDeclarations = false, + useIrFakeOverrideBuilder = input.configuration.getBoolean(CommonConfigurationKeys.USE_IR_FAKE_OVERRIDE_BUILDER), ) val (moduleFragment, components, pluginContext, irActualizedResult) = analysisResults.convertToIrAndActualizeForJvm( diff --git a/compiler/config/src/org/jetbrains/kotlin/config/CommonConfigurationKeys.kt b/compiler/config/src/org/jetbrains/kotlin/config/CommonConfigurationKeys.kt index f9b4346d3db..1f733996752 100644 --- a/compiler/config/src/org/jetbrains/kotlin/config/CommonConfigurationKeys.kt +++ b/compiler/config/src/org/jetbrains/kotlin/config/CommonConfigurationKeys.kt @@ -96,6 +96,10 @@ object CommonConfigurationKeys { @JvmField val EVALUATED_CONST_TRACKER = CompilerConfigurationKey.create("Keeps track of all evaluated by IrInterpreter constants") + + @JvmField + val USE_IR_FAKE_OVERRIDE_BUILDER = + CompilerConfigurationKey.create("Generate fake overrides via IR. See KT-61514") } var CompilerConfiguration.languageVersionSettings: LanguageVersionSettings diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConfiguration.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConfiguration.kt index bd1d405ebd2..5fd65a3eae8 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConfiguration.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConfiguration.kt @@ -37,5 +37,5 @@ data class Fir2IrConfiguration( val evaluatedConstTracker: EvaluatedConstTracker, val inlineConstTracker: InlineConstTracker?, val allowNonCachedDeclarations: Boolean, - val useIrFakeOverrideBuilder: Boolean = false + val useIrFakeOverrideBuilder: Boolean, ) diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunner.kt index 4ccd6654d74..b473c8e77a5 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunner.kt @@ -279,6 +279,7 @@ open class IncrementalFirJvmCompilerRunner( .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), inlineConstTracker = configuration[CommonConfigurationKeys.INLINE_CONST_TRACKER], allowNonCachedDeclarations = false, + useIrFakeOverrideBuilder = configuration.getBoolean(CommonConfigurationKeys.USE_IR_FAKE_OVERRIDE_BUILDER), ) val irGenerationExtensions = (projectEnvironment as? VfsBasedProjectEnvironment)?.project?.let { IrGenerationExtension.getInstances(it) }.orEmpty() diff --git a/compiler/testData/cli/js/jsExtraHelp.out b/compiler/testData/cli/js/jsExtraHelp.out index c54358c7a96..c92cfefef80 100644 --- a/compiler/testData/cli/js/jsExtraHelp.out +++ b/compiler/testData/cli/js/jsExtraHelp.out @@ -141,6 +141,7 @@ where advanced options include: -Xuse-fir-extended-checkers Use extended analysis mode based on Front-end IR. Warning: this feature is far from being production-ready -Xuse-fir-ic Compile using Front-end IR internal incremental compilation cycle. Warning: this feature is far from being production-ready -Xuse-fir-lt Compile using LightTree parser with Front-end IR + -Xuse-ir-fake-override-builder Generate fake overrides via IR. See KT-61514 -Xuse-k2 Compile using experimental K2. K2 is a new compiler pipeline, no compatibility guarantees are yet provided -Xuse-mixed-named-arguments Enable Support named arguments in their own position even if the result appears as mixed -Xverbose-phases Be verbose while performing these backend phases diff --git a/compiler/testData/cli/jvm/extraHelp.out b/compiler/testData/cli/jvm/extraHelp.out index ca958024b61..cc9a9fea9cc 100644 --- a/compiler/testData/cli/jvm/extraHelp.out +++ b/compiler/testData/cli/jvm/extraHelp.out @@ -232,6 +232,7 @@ where advanced options include: -Xuse-fir-extended-checkers Use extended analysis mode based on Front-end IR. Warning: this feature is far from being production-ready -Xuse-fir-ic Compile using Front-end IR internal incremental compilation cycle. Warning: this feature is far from being production-ready -Xuse-fir-lt Compile using LightTree parser with Front-end IR + -Xuse-ir-fake-override-builder Generate fake overrides via IR. See KT-61514 -Xuse-k2 Compile using experimental K2. K2 is a new compiler pipeline, no compatibility guarantees are yet provided -Xuse-mixed-named-arguments Enable Support named arguments in their own position even if the result appears as mixed -Xverbose-phases Be verbose while performing these backend phases diff --git a/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/codegen/GenerationUtils.kt b/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/codegen/GenerationUtils.kt index 4d63c65b8a4..fafdd3b66d4 100644 --- a/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/codegen/GenerationUtils.kt +++ b/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/codegen/GenerationUtils.kt @@ -137,7 +137,8 @@ object GenerationUtils { evaluatedConstTracker = configuration .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), inlineConstTracker = configuration[CommonConfigurationKeys.INLINE_CONST_TRACKER], - allowNonCachedDeclarations = false + allowNonCachedDeclarations = false, + useIrFakeOverrideBuilder = configuration.getBoolean(CommonConfigurationKeys.USE_IR_FAKE_OVERRIDE_BUILDER), ) val commonMemberStorage = Fir2IrCommonMemberStorage(signatureComposerForJvmFir2Ir(linkViaSignatures), FirJvmKotlinMangler()) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt index 9a91834fe5b..9cd6fac6c02 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt @@ -81,6 +81,7 @@ internal fun PhaseContext.fir2Ir( .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), inlineConstTracker = null, allowNonCachedDeclarations = false, + useIrFakeOverrideBuilder = configuration.getBoolean(CommonConfigurationKeys.USE_IR_FAKE_OVERRIDE_BUILDER), ) val (irModuleFragment, components, pluginContext, irActualizedResult) = input.firResult.convertToIrAndActualize( fir2IrExtensions,