[K2, MPP] Remove redundant expect declarations from klib metadata

^KT-57250 Fixed

Introduce flat Fir2IrActualizedResult

It contains output from Fir2Ir and IrActualizer
This commit is contained in:
Ivan Kochurkin
2023-03-15 18:41:52 +01:00
committed by Space Team
parent d91efb212d
commit ee73e4774b
42 changed files with 324 additions and 111 deletions
@@ -27,16 +27,14 @@ import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.* import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.*
import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.common.messages.MessageUtil import org.jetbrains.kotlin.cli.common.messages.MessageUtil
import org.jetbrains.kotlin.cli.js.klib.TopDownAnalyzerFacadeForJSIR import org.jetbrains.kotlin.cli.js.klib.*
import org.jetbrains.kotlin.cli.js.klib.TopDownAnalyzerFacadeForWasm
import org.jetbrains.kotlin.cli.js.klib.compileModuleToAnalyzedFir
import org.jetbrains.kotlin.cli.js.klib.generateIrForKlibSerialization
import org.jetbrains.kotlin.cli.js.klib.serializeFirKlib
import org.jetbrains.kotlin.cli.js.klib.transformFirToIr
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser
import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.Services
import org.jetbrains.kotlin.config.getModuleNameForSource
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
@@ -68,7 +66,6 @@ import org.jetbrains.kotlin.utils.PathUtil
import org.jetbrains.kotlin.utils.join import org.jetbrains.kotlin.utils.join
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import java.nio.charset.Charset
private val K2JSCompilerArguments.granularity: JsGenerationGranularity private val K2JSCompilerArguments.granularity: JsGenerationGranularity
get() = when { get() = when {
@@ -493,14 +490,14 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
) ?: return null ) ?: return null
// FIR2IR // FIR2IR
val irResult = transformFirToIr(moduleStructure, outputs, diagnosticsReporter) val fir2IrActualizedResult = transformFirToIr(moduleStructure, outputs, diagnosticsReporter)
// Serialize klib // Serialize klib
if (arguments.irProduceKlibDir || arguments.irProduceKlibFile) { if (arguments.irProduceKlibDir || arguments.irProduceKlibFile) {
serializeFirKlib( serializeFirKlib(
moduleStructure = moduleStructure, moduleStructure = moduleStructure,
firOutputs = outputs, firOutputs = outputs,
irResult = irResult, fir2IrActualizedResult = fir2IrActualizedResult,
outputKlibPath = outputKlibPath, outputKlibPath = outputKlibPath,
messageCollector = messageCollector, messageCollector = messageCollector,
diagnosticsReporter = diagnosticsReporter, diagnosticsReporter = diagnosticsReporter,
@@ -26,15 +26,12 @@ import org.jetbrains.kotlin.fir.BinaryModuleData
import org.jetbrains.kotlin.fir.DependencyListForCliModule import org.jetbrains.kotlin.fir.DependencyListForCliModule
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions
import org.jetbrains.kotlin.fir.backend.Fir2IrResult
import org.jetbrains.kotlin.fir.backend.Fir2IrVisibilityConverter import org.jetbrains.kotlin.fir.backend.Fir2IrVisibilityConverter
import org.jetbrains.kotlin.fir.backend.extractFirDeclarations
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.pipeline.FirResult import org.jetbrains.kotlin.fir.pipeline.*
import org.jetbrains.kotlin.fir.pipeline.ModuleCompilerAnalyzedOutput
import org.jetbrains.kotlin.fir.pipeline.buildResolveAndCheckFir
import org.jetbrains.kotlin.fir.pipeline.convertToIrAndActualize
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.serialization.FirElementAwareSerializableStringTable import org.jetbrains.kotlin.fir.serialization.FirElementAwareSerializableStringTable
import org.jetbrains.kotlin.fir.serialization.FirKLibSerializerExtension import org.jetbrains.kotlin.fir.serialization.FirKLibSerializerExtension
@@ -103,7 +100,7 @@ fun transformFirToIr(
moduleStructure: ModulesStructure, moduleStructure: ModulesStructure,
firOutputs: List<ModuleCompilerAnalyzedOutput>, firOutputs: List<ModuleCompilerAnalyzedOutput>,
diagnosticsReporter: PendingDiagnosticsCollectorWithSuppress, diagnosticsReporter: PendingDiagnosticsCollectorWithSuppress,
): Fir2IrResult { ): Fir2IrActualizedResult {
val fir2IrExtensions = Fir2IrExtensions.Default val fir2IrExtensions = Fir2IrExtensions.Default
var builtInsModule: KotlinBuiltIns? = null var builtInsModule: KotlinBuiltIns? = null
@@ -149,7 +146,7 @@ fun transformFirToIr(
fun serializeFirKlib( fun serializeFirKlib(
moduleStructure: ModulesStructure, moduleStructure: ModulesStructure,
firOutputs: List<ModuleCompilerAnalyzedOutput>, firOutputs: List<ModuleCompilerAnalyzedOutput>,
irResult: Fir2IrResult, fir2IrActualizedResult: Fir2IrActualizedResult,
outputKlibPath: String, outputKlibPath: String,
messageCollector: MessageCollector, messageCollector: MessageCollector,
diagnosticsReporter: BaseDiagnosticsCollector, diagnosticsReporter: BaseDiagnosticsCollector,
@@ -169,6 +166,8 @@ fun serializeFirKlib(
val metadataVersion = moduleStructure.compilerConfiguration.metadataVersion() val metadataVersion = moduleStructure.compilerConfiguration.metadataVersion()
val actualizedExpectDeclarations = fir2IrActualizedResult.irActualizationResult.extractFirDeclarations()
serializeModuleIntoKlib( serializeModuleIntoKlib(
moduleStructure.compilerConfiguration[CommonConfigurationKeys.MODULE_NAME]!!, moduleStructure.compilerConfiguration[CommonConfigurationKeys.MODULE_NAME]!!,
moduleStructure.compilerConfiguration, moduleStructure.compilerConfiguration,
@@ -176,7 +175,7 @@ fun serializeFirKlib(
sourceFiles, sourceFiles,
klibPath = outputKlibPath, klibPath = outputKlibPath,
moduleStructure.allDependencies, moduleStructure.allDependencies,
irResult.irModuleFragment, fir2IrActualizedResult.irModuleFragment,
expectDescriptorToSymbol = mutableMapOf(), expectDescriptorToSymbol = mutableMapOf(),
cleanFiles = icData, cleanFiles = icData,
nopack = true, nopack = true,
@@ -191,6 +190,7 @@ fun serializeFirKlib(
firFile, firFile,
session, session,
scopeSession, scopeSession,
actualizedExpectDeclarations,
FirKLibSerializerExtension(session, metadataVersion, FirElementAwareSerializableStringTable()), FirKLibSerializerExtension(session, metadataVersion, FirElementAwareSerializableStringTable()),
moduleStructure.compilerConfiguration.languageVersionSettings, moduleStructure.compilerConfiguration.languageVersionSettings,
) )
@@ -153,7 +153,7 @@ object FirKotlinToJvmBytecodeCompiler {
performanceManager?.notifyIRTranslationStarted() performanceManager?.notifyIRTranslationStarted()
val fir2IrExtensions = JvmFir2IrExtensions(moduleConfiguration, JvmIrDeserializerImpl(), JvmIrMangler) val fir2IrExtensions = JvmFir2IrExtensions(moduleConfiguration, JvmIrDeserializerImpl(), JvmIrMangler)
val fir2IrResult = firResult.convertToIrAndActualizeForJvm( val fir2IrAndIrActualizerResult = firResult.convertToIrAndActualizeForJvm(
fir2IrExtensions, fir2IrExtensions,
irGenerationExtensions, irGenerationExtensions,
linkViaSignatures = moduleConfiguration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES), linkViaSignatures = moduleConfiguration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES),
@@ -165,7 +165,7 @@ object FirKotlinToJvmBytecodeCompiler {
val generationState = runBackend( val generationState = runBackend(
allSources, allSources,
fir2IrResult, fir2IrAndIrActualizerResult,
fir2IrExtensions, fir2IrExtensions,
diagnosticsReporter diagnosticsReporter
) )
@@ -219,11 +219,11 @@ object FirKotlinToJvmBytecodeCompiler {
private fun CompilationContext.runBackend( private fun CompilationContext.runBackend(
ktFiles: List<KtFile>, ktFiles: List<KtFile>,
fir2IrResult: Fir2IrResult, fir2IrActualizedResult: Fir2IrActualizedResult,
extensions: JvmGeneratorExtensions, extensions: JvmGeneratorExtensions,
diagnosticsReporter: BaseDiagnosticsCollector diagnosticsReporter: BaseDiagnosticsCollector
): GenerationState { ): GenerationState {
val (moduleFragment, components) = fir2IrResult val (moduleFragment, components, pluginContext, irActualizationResult) = fir2IrActualizedResult
val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext
val codegenFactory = JvmIrCodegenFactory( val codegenFactory = JvmIrCodegenFactory(
moduleConfiguration, moduleConfiguration,
@@ -252,7 +252,7 @@ object FirKotlinToJvmBytecodeCompiler {
generationState.oldBEInitTrace(ktFiles) generationState.oldBEInitTrace(ktFiles)
codegenFactory.generateModuleInFrontendIRMode( codegenFactory.generateModuleInFrontendIRMode(
generationState, moduleFragment, components.symbolTable, components.irProviders, generationState, moduleFragment, components.symbolTable, components.irProviders,
extensions, FirJvmBackendExtension(components), fir2IrResult.pluginContext extensions, FirJvmBackendExtension(components, irActualizationResult), pluginContext
) { ) {
performanceManager?.notifyIRLoweringFinished() performanceManager?.notifyIRLoweringFinished()
performanceManager?.notifyIRGenerationStarted() performanceManager?.notifyIRGenerationStarted()
@@ -231,7 +231,7 @@ fun convertAnalyzedFirToIr(
IrGenerationExtension.getInstances(it) IrGenerationExtension.getInstances(it)
} ?: emptyList() } ?: emptyList()
val linkViaSignatures = input.configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES) val linkViaSignatures = input.configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES)
val (irModuleFragment, components, pluginContext) = val (irModuleFragment, components, pluginContext, irActualizationResult) =
analysisResults.convertToIrAndActualizeForJvm( analysisResults.convertToIrAndActualizeForJvm(
extensions, irGenerationExtensions, linkViaSignatures, extensions, irGenerationExtensions, linkViaSignatures,
environment.diagnosticsReporter, input.configuration.languageVersionSettings environment.diagnosticsReporter, input.configuration.languageVersionSettings
@@ -243,7 +243,8 @@ fun convertAnalyzedFirToIr(
extensions, extensions,
irModuleFragment, irModuleFragment,
components, components,
pluginContext pluginContext,
irActualizationResult
) )
} }
@@ -287,7 +288,7 @@ fun generateCodeFromIr(
input.components.symbolTable, input.components.symbolTable,
input.components.irProviders, input.components.irProviders,
input.extensions, input.extensions,
FirJvmBackendExtension(input.components), FirJvmBackendExtension(input.components, input.irActualizationResult),
input.pluginContext input.pluginContext
) { ) {
performanceManager?.notifyIRLoweringFinished() performanceManager?.notifyIRLoweringFinished()
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.cli.jvm.compiler.pipeline package org.jetbrains.kotlin.cli.jvm.compiler.pipeline
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizationResult
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector
@@ -43,5 +44,6 @@ data class ModuleCompilerIrBackendInput(
val extensions: JvmFir2IrExtensions, val extensions: JvmFir2IrExtensions,
val irModuleFragment: IrModuleFragment, val irModuleFragment: IrModuleFragment,
val components: Fir2IrComponents, val components: Fir2IrComponents,
val pluginContext: Fir2IrPluginContext val pluginContext: Fir2IrPluginContext,
val irActualizationResult: IrActualizationResult?
) )
@@ -163,6 +163,7 @@ internal class FirMetadataSerializer(
firFile, firFile,
session, session,
scopeSession, scopeSession,
actualizedExpectDeclarations = null,
FirKLibSerializerExtension(session, metadataVersion, FirElementAwareSerializableStringTable()), FirKLibSerializerExtension(session, metadataVersion, FirElementAwareSerializableStringTable()),
languageVersionSettings languageVersionSettings
) )
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.pipeline package org.jetbrains.kotlin.fir.pipeline
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizationResult
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
@@ -22,6 +23,7 @@ import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmDescriptorMangler import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmDescriptorMangler
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.ir.util.IdSignatureComposer import org.jetbrains.kotlin.ir.util.IdSignatureComposer
import org.jetbrains.kotlin.ir.util.KotlinMangler import org.jetbrains.kotlin.ir.util.KotlinMangler
@@ -34,13 +36,20 @@ data class ModuleCompilerAnalyzedOutput(
val fir: List<FirFile> val fir: List<FirFile>
) )
data class Fir2IrActualizedResult(
val irModuleFragment: IrModuleFragment,
val components: Fir2IrComponents,
val pluginContext: Fir2IrPluginContext,
val irActualizationResult: IrActualizationResult?,
)
fun FirResult.convertToIrAndActualizeForJvm( fun FirResult.convertToIrAndActualizeForJvm(
fir2IrExtensions: Fir2IrExtensions, fir2IrExtensions: Fir2IrExtensions,
irGeneratorExtensions: Collection<IrGenerationExtension>, irGeneratorExtensions: Collection<IrGenerationExtension>,
linkViaSignatures: Boolean, linkViaSignatures: Boolean,
diagnosticReporter: DiagnosticReporter, diagnosticReporter: DiagnosticReporter,
languageVersionSettings: LanguageVersionSettings, languageVersionSettings: LanguageVersionSettings,
): Fir2IrResult = this.convertToIrAndActualize( ): Fir2IrActualizedResult = this.convertToIrAndActualize(
fir2IrExtensions, fir2IrExtensions,
irGeneratorExtensions, irGeneratorExtensions,
linkViaSignatures = linkViaSignatures, linkViaSignatures = linkViaSignatures,
@@ -63,8 +72,9 @@ fun FirResult.convertToIrAndActualize(
diagnosticReporter: DiagnosticReporter, diagnosticReporter: DiagnosticReporter,
languageVersionSettings: LanguageVersionSettings, languageVersionSettings: LanguageVersionSettings,
fir2IrResultPostCompute: Fir2IrResult.() -> Unit = {}, fir2IrResultPostCompute: Fir2IrResult.() -> Unit = {},
): Fir2IrResult { ): Fir2IrActualizedResult {
val result: Fir2IrResult val fir2IrResult: Fir2IrResult
val actualizationResult: IrActualizationResult?
val commonMemberStorage = Fir2IrCommonMemberStorage( val commonMemberStorage = Fir2IrCommonMemberStorage(
generateSignatures = linkViaSignatures, generateSignatures = linkViaSignatures,
@@ -75,7 +85,7 @@ fun FirResult.convertToIrAndActualize(
when (outputs.size) { when (outputs.size) {
0 -> error("No modules found") 0 -> error("No modules found")
1 -> { 1 -> {
result = outputs.single().convertToIr( fir2IrResult = outputs.single().convertToIr(
fir2IrExtensions, fir2IrExtensions,
irGeneratorExtensions, irGeneratorExtensions,
linkViaSignatures = linkViaSignatures, linkViaSignatures = linkViaSignatures,
@@ -85,6 +95,7 @@ fun FirResult.convertToIrAndActualize(
visibilityConverter, visibilityConverter,
kotlinBuiltIns, kotlinBuiltIns,
) )
actualizationResult = null
} }
else -> { else -> {
val platformOutput = outputs.last() val platformOutput = outputs.last()
@@ -107,7 +118,7 @@ fun FirResult.convertToIrAndActualize(
} }
} }
} }
result = platformOutput.convertToIr( fir2IrResult = platformOutput.convertToIr(
fir2IrExtensions, fir2IrExtensions,
irGeneratorExtensions, irGeneratorExtensions,
linkViaSignatures = linkViaSignatures, linkViaSignatures = linkViaSignatures,
@@ -120,8 +131,8 @@ fun FirResult.convertToIrAndActualize(
fir2IrResultPostCompute(it) fir2IrResultPostCompute(it)
} }
IrActualizer.actualize( actualizationResult = IrActualizer.actualize(
result.irModuleFragment, fir2IrResult.irModuleFragment,
commonIrOutputs.map { it.irModuleFragment }, commonIrOutputs.map { it.irModuleFragment },
diagnosticReporter, diagnosticReporter,
languageVersionSettings languageVersionSettings
@@ -129,7 +140,8 @@ fun FirResult.convertToIrAndActualize(
} }
} }
return result val (irModuleFragment, components, pluginContext) = fir2IrResult
return Fir2IrActualizedResult(irModuleFragment, components, pluginContext, actualizationResult)
} }
private fun ModuleCompilerAnalyzedOutput.convertToIr( private fun ModuleCompilerAnalyzedOutput.convertToIr(
@@ -69,15 +69,24 @@ class FirElementSerializer private constructor(
private val contractSerializer = FirContractSerializer() private val contractSerializer = FirContractSerializer()
private val extensionDeclarationProviders = session.extensionService.declarationForMetadataProviders private val extensionDeclarationProviders = session.extensionService.declarationForMetadataProviders
fun packagePartProto(packageFqName: FqName, files: List<FirFile>): ProtoBuf.Package.Builder { fun packagePartProto(
packageFqName: FqName,
files: List<FirFile>,
actualizedExpectDeclarations: Set<FirDeclaration>?
): ProtoBuf.Package.Builder {
val builder = ProtoBuf.Package.newBuilder() val builder = ProtoBuf.Package.newBuilder()
fun addDeclaration(declaration: FirDeclaration, onUnsupportedDeclaration: (FirDeclaration) -> Unit) { fun addDeclaration(declaration: FirDeclaration, onUnsupportedDeclaration: (FirDeclaration) -> Unit) {
when (declaration) { if (declaration is FirMemberDeclaration) {
is FirProperty -> propertyProto(declaration)?.let { builder.addProperty(it) } if (!declaration.shouldBeSerialized(actualizedExpectDeclarations)) return
is FirSimpleFunction -> functionProto(declaration)?.let { builder.addFunction(it) } when (declaration) {
is FirTypeAlias -> typeAliasProto(declaration)?.let { builder.addTypeAlias(it) } is FirProperty -> propertyProto(declaration)?.let { builder.addProperty(it) }
else -> onUnsupportedDeclaration(declaration) is FirSimpleFunction -> functionProto(declaration)?.let { builder.addFunction(it) }
is FirTypeAlias -> typeAliasProto(declaration)?.let { builder.addTypeAlias(it) }
else -> onUnsupportedDeclaration(declaration)
}
} else {
onUnsupportedDeclaration(declaration)
} }
} }
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.serialization.SerializableStringTable
fun serializeSingleFirFile( fun serializeSingleFirFile(
file: FirFile, session: FirSession, scopeSession: ScopeSession, file: FirFile, session: FirSession, scopeSession: ScopeSession,
actualizedExpectDeclarations: Set<FirDeclaration>?,
serializerExtension: FirKLibSerializerExtension, serializerExtension: FirKLibSerializerExtension,
languageVersionSettings: LanguageVersionSettings, languageVersionSettings: LanguageVersionSettings,
): ProtoBuf.PackageFragment { ): ProtoBuf.PackageFragment {
@@ -31,21 +32,26 @@ fun serializeSingleFirFile(
// TODO: split package fragment (see klib serializer) // TODO: split package fragment (see klib serializer)
// TODO: handle incremental/monolothic (see klib serializer) - maybe externally // TODO: handle incremental/monolothic (see klib serializer) - maybe externally
val packageProto = packageSerializer.packagePartProto(file.packageFqName, listOf(file)).build() val packageProto = packageSerializer.packagePartProto(file.packageFqName, listOf(file), actualizedExpectDeclarations).build()
fun List<FirDeclaration>.makeClassesProtoWithNested(): List<Pair<ProtoBuf.Class, Int>> = fun List<FirDeclaration>.makeClassesProtoWithNested(): List<Pair<ProtoBuf.Class, Int>> {
// TODO: filter out expects return filterIsInstance<FirClass>().filter { it.shouldBeSerialized(actualizedExpectDeclarations) }
filterIsInstance<FirClass>().sortedBy { it.classId.asFqNameString() }.flatMap { .sortedBy { it.classId.asFqNameString() }
val classSerializer = FirElementSerializer.create(session, scopeSession, it, serializerExtension, null, .flatMap {
approximator, languageVersionSettings) val classSerializer = FirElementSerializer.create(
val index = classSerializer.stringTable.getFqNameIndex(it) session, scopeSession, it, serializerExtension, null,
listOf(classSerializer.classProto(it).build() to index) + it.declarations.makeClassesProtoWithNested() approximator, languageVersionSettings
} )
val index = classSerializer.stringTable.getFqNameIndex(it)
listOf(classSerializer.classProto(it).build() to index) + it.declarations.makeClassesProtoWithNested()
}
}
val classesProto = file.declarations.makeClassesProtoWithNested() val classesProto = file.declarations.makeClassesProtoWithNested()
val hasTopLevelDeclarations = file.declarations.any { val hasTopLevelDeclarations = file.declarations.any {
it is FirProperty || it is FirSimpleFunction || it is FirTypeAlias it is FirMemberDeclaration && it.shouldBeSerialized(actualizedExpectDeclarations) &&
(it is FirProperty || it is FirSimpleFunction || it is FirTypeAlias)
} }
return buildKlibPackageFragment( return buildKlibPackageFragment(
@@ -7,6 +7,9 @@ package org.jetbrains.kotlin.fir.serialization
import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.utils.isExpect
import org.jetbrains.kotlin.fir.diagnostics.ConeIntermediateDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeIntermediateDiagnostic
import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
@@ -43,3 +46,7 @@ fun ConeKotlinType.suspendFunctionTypeToFunctionTypeWithContinuation(session: Fi
attributes = fullyExpandedType.attributes attributes = fullyExpandedType.attributes
) )
} }
fun FirMemberDeclaration.shouldBeSerialized(actualizedExpectDeclaration: Set<FirDeclaration>?): Boolean {
return !isExpect || actualizedExpectDeclaration == null || this !in actualizedExpectDeclaration
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.backend.jvm package org.jetbrains.kotlin.fir.backend.jvm
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizationResult
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.backend.jvm.JvmBackendExtension import org.jetbrains.kotlin.backend.jvm.JvmBackendExtension
import org.jetbrains.kotlin.backend.jvm.metadata.MetadataSerializer import org.jetbrains.kotlin.backend.jvm.metadata.MetadataSerializer
@@ -15,7 +16,10 @@ import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.java.JvmAnnotationNames
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
class FirJvmBackendExtension(private val components: Fir2IrComponents) : JvmBackendExtension { class FirJvmBackendExtension(
private val components: Fir2IrComponents,
private val irActualizationResult: IrActualizationResult?
) : JvmBackendExtension {
override fun createSerializer( override fun createSerializer(
context: JvmBackendContext, context: JvmBackendContext,
klass: IrClass, klass: IrClass,
@@ -23,7 +27,15 @@ class FirJvmBackendExtension(private val components: Fir2IrComponents) : JvmBack
bindings: JvmSerializationBindings, bindings: JvmSerializationBindings,
parentSerializer: MetadataSerializer? parentSerializer: MetadataSerializer?
): MetadataSerializer { ): MetadataSerializer {
return makeFirMetadataSerializerForIrClass(components.session, context, klass, bindings, components, parentSerializer) return makeFirMetadataSerializerForIrClass(
components.session,
context,
klass,
bindings,
components,
parentSerializer,
irActualizationResult
)
} }
override fun generateMetadataExtraFlags(abiStability: JvmAbiStability?): Int = override fun generateMetadataExtraFlags(abiStability: JvmAbiStability?): Int =
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.backend.jvm package org.jetbrains.kotlin.fir.backend.jvm
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizationResult
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
import org.jetbrains.kotlin.backend.jvm.metadata.MetadataSerializer import org.jetbrains.kotlin.backend.jvm.metadata.MetadataSerializer
@@ -14,6 +15,7 @@ import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.FirMetadataSource import org.jetbrains.kotlin.fir.backend.FirMetadataSource
import org.jetbrains.kotlin.fir.backend.extractFirDeclarations
import org.jetbrains.kotlin.fir.containingClassForLocal import org.jetbrains.kotlin.fir.containingClassForLocal
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.* import org.jetbrains.kotlin.fir.declarations.builder.*
@@ -45,7 +47,8 @@ fun makeFirMetadataSerializerForIrClass(
irClass: IrClass, irClass: IrClass,
serializationBindings: JvmSerializationBindings, serializationBindings: JvmSerializationBindings,
components: Fir2IrComponents, components: Fir2IrComponents,
parent: MetadataSerializer? parent: MetadataSerializer?,
irActualizationResult: IrActualizationResult?
): FirMetadataSerializer { ): FirMetadataSerializer {
val approximator = TypeApproximatorForMetadataSerializer(session) val approximator = TypeApproximatorForMetadataSerializer(session)
val localDelegatedProperties = context.localDelegatedProperties[irClass.attributeOwnerId]?.map { val localDelegatedProperties = context.localDelegatedProperties[irClass.attributeOwnerId]?.map {
@@ -62,8 +65,9 @@ fun makeFirMetadataSerializerForIrClass(
approximator, approximator,
makeElementSerializer( makeElementSerializer(
irClass.metadata, components.session, components.scopeSession, firSerializerExtension, approximator, parent, irClass.metadata, components.session, components.scopeSession, firSerializerExtension, approximator, parent,
context.state.configuration.languageVersionSettings, context.state.configuration.languageVersionSettings
) ),
irActualizationResult
) )
} }
@@ -75,7 +79,8 @@ fun makeLocalFirMetadataSerializerForMetadataSource(
globalSerializationBindings: JvmSerializationBindings, globalSerializationBindings: JvmSerializationBindings,
parent: MetadataSerializer?, parent: MetadataSerializer?,
targetId: TargetId, targetId: TargetId,
configuration: CompilerConfiguration configuration: CompilerConfiguration,
irActualizationResult: IrActualizationResult?
): FirMetadataSerializer { ): FirMetadataSerializer {
val serializationBindings = JvmSerializationBindings() val serializationBindings = JvmSerializationBindings()
val approximator = TypeApproximatorForMetadataSerializer(session) val approximator = TypeApproximatorForMetadataSerializer(session)
@@ -106,8 +111,9 @@ fun makeLocalFirMetadataSerializerForMetadataSource(
approximator, approximator,
makeElementSerializer( makeElementSerializer(
metadata, session, scopeSession, firSerializerExtension, approximator, parent, metadata, session, scopeSession, firSerializerExtension, approximator, parent,
configuration.languageVersionSettings, configuration.languageVersionSettings
) ),
irActualizationResult
) )
} }
@@ -116,16 +122,17 @@ class FirMetadataSerializer(
private val serializationBindings: JvmSerializationBindings, private val serializationBindings: JvmSerializationBindings,
private val serializerExtension: FirJvmSerializerExtension, private val serializerExtension: FirJvmSerializerExtension,
private val approximator: AbstractTypeApproximator, private val approximator: AbstractTypeApproximator,
internal val serializer: FirElementSerializer? internal val serializer: FirElementSerializer?,
irActualizationResult: IrActualizationResult?
) : MetadataSerializer { ) : MetadataSerializer {
private val actualizedExpectDeclarations = irActualizationResult.extractFirDeclarations()
override fun serialize(metadata: MetadataSource): Pair<MessageLite, JvmStringTable>? { override fun serialize(metadata: MetadataSource): Pair<MessageLite, JvmStringTable>? {
val message = when (metadata) { val message = when (metadata) {
is FirMetadataSource.Class -> serializer!!.classProto(metadata.fir).build() is FirMetadataSource.Class -> serializer!!.classProto(metadata.fir).build()
is FirMetadataSource.File -> is FirMetadataSource.File ->
serializer!!.packagePartProto(metadata.files.first().packageFqName, metadata.files).apply { serializer!!.packagePartProto(metadata.files.first().packageFqName, metadata.files, actualizedExpectDeclarations)
serializerExtension.serializeJvmPackage(this) .apply { serializerExtension.serializeJvmPackage(this) }.build()
}.build()
is FirMetadataSource.Function -> { is FirMetadataSource.Function -> {
val withTypeParameters = metadata.fir.copyToFreeAnonymousFunction(approximator) val withTypeParameters = metadata.fir.copyToFreeAnonymousFunction(approximator)
serializationBindings.get(FirJvmSerializerExtension.METHOD_FOR_FIR_FUNCTION, metadata.fir)?.let { serializationBindings.get(FirJvmSerializerExtension.METHOD_FOR_FIR_FUNCTION, metadata.fir)?.let {
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.backend
import com.intellij.psi.PsiCompiledElement import com.intellij.psi.PsiCompiledElement
import org.jetbrains.kotlin.* import org.jetbrains.kotlin.*
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizationResult
import org.jetbrains.kotlin.builtins.StandardNames.DATA_CLASS_COMPONENT_PREFIX import org.jetbrains.kotlin.builtins.StandardNames.DATA_CLASS_COMPONENT_PREFIX
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.diagnostics.startOffsetSkippingComments import org.jetbrains.kotlin.diagnostics.startOffsetSkippingComments
@@ -748,3 +749,7 @@ fun FirCallableDeclaration.contextReceiversForFunctionOrContainingProperty(): Li
this.propertySymbol.fir.contextReceivers this.propertySymbol.fir.contextReceivers
else else
this.contextReceivers this.contextReceivers
fun IrActualizationResult?.extractFirDeclarations(): Set<FirDeclaration>? {
return this?.actualizedExpectDeclarations?.mapNotNullTo(mutableSetOf()) { ((it as IrMetadataSourceOwner).metadata as FirMetadataSource).fir }
}
@@ -33381,6 +33381,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt");
} }
@Test
@TestMetadata("removeExpectDeclarationsFromMetadata.kt")
public void testRemoveExpectDeclarationsFromMetadata() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
}
@Test @Test
@TestMetadata("valueClasses.kt") @TestMetadata("valueClasses.kt")
public void testValueClasses() throws Exception { public void testValueClasses() throws Exception {
@@ -33381,6 +33381,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt");
} }
@Test
@TestMetadata("removeExpectDeclarationsFromMetadata.kt")
public void testRemoveExpectDeclarationsFromMetadata() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
}
@Test @Test
@TestMetadata("valueClasses.kt") @TestMetadata("valueClasses.kt")
public void testValueClasses() throws Exception { public void testValueClasses() throws Exception {
@@ -275,7 +275,7 @@ class IncrementalFirJvmCompilerRunner(
val extensions = JvmFir2IrExtensions(configuration, JvmIrDeserializerImpl(), JvmIrMangler) val extensions = JvmFir2IrExtensions(configuration, JvmIrDeserializerImpl(), JvmIrMangler)
val irGenerationExtensions = val irGenerationExtensions =
(projectEnvironment as? VfsBasedProjectEnvironment)?.project?.let { IrGenerationExtension.getInstances(it) }.orEmpty() (projectEnvironment as? VfsBasedProjectEnvironment)?.project?.let { IrGenerationExtension.getInstances(it) }.orEmpty()
val platformIrOutput = cycleResult.convertToIrAndActualizeForJvm( val (irModuleFragment, components, pluginContext, irActualizationResult) = cycleResult.convertToIrAndActualizeForJvm(
extensions, extensions,
irGenerationExtensions, irGenerationExtensions,
linkViaSignatures = false, linkViaSignatures = false,
@@ -289,9 +289,10 @@ class IncrementalFirJvmCompilerRunner(
targetId, targetId,
configuration, configuration,
extensions, extensions,
platformIrOutput.irModuleFragment, irModuleFragment,
platformIrOutput.components, components,
platformIrOutput.pluginContext pluginContext,
irActualizationResult
) )
val codegenOutput = generateCodeFromIr(irInput, compilerEnvironment, performanceManager) val codegenOutput = generateCodeFromIr(irInput, compilerEnvironment, performanceManager)
@@ -52,7 +52,8 @@ internal fun collectNewDirtySources(
globalSerializationBindings, globalSerializationBindings,
data.lastOrNull(), data.lastOrNull(),
targetId, targetId,
configuration configuration,
irActualizationResult = null
) )
data.push(serializer) data.push(serializer)
body(serializer) body(serializer)
@@ -12,28 +12,40 @@ import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
data class IrActualizationResult(val actualizedExpectDeclarations: List<IrDeclaration>)
object IrActualizer { object IrActualizer {
fun actualize( fun actualize(
mainFragment: IrModuleFragment, mainFragment: IrModuleFragment,
dependentFragments: List<IrModuleFragment>, dependentFragments: List<IrModuleFragment>,
diagnosticReporter: DiagnosticReporter, diagnosticReporter: DiagnosticReporter,
languageVersionSettings: LanguageVersionSettings languageVersionSettings: LanguageVersionSettings
) { ): IrActualizationResult {
val ktDiagnosticReporter = KtDiagnosticReporterWithImplicitIrBasedContext(diagnosticReporter, languageVersionSettings) val ktDiagnosticReporter = KtDiagnosticReporterWithImplicitIrBasedContext(diagnosticReporter, languageVersionSettings)
val (expectActualMap, expectActualTypeAliasMap) = ExpectActualCollector(mainFragment, dependentFragments, ktDiagnosticReporter).collect() val (expectActualMap, expectActualTypeAliasMap) = ExpectActualCollector(mainFragment, dependentFragments, ktDiagnosticReporter).collect()
FunctionDefaultParametersActualizer(expectActualMap).actualize() FunctionDefaultParametersActualizer(expectActualMap).actualize()
removeExpectDeclarations(dependentFragments, expectActualMap) val removedExpectDeclarationMetadata = removeExpectDeclarations(dependentFragments, expectActualMap)
addMissingFakeOverrides(expectActualMap, dependentFragments, expectActualTypeAliasMap, ktDiagnosticReporter) addMissingFakeOverrides(expectActualMap, dependentFragments, expectActualTypeAliasMap, ktDiagnosticReporter)
linkExpectToActual(expectActualMap, dependentFragments) linkExpectToActual(expectActualMap, dependentFragments)
mergeIrFragments(mainFragment, dependentFragments) mergeIrFragments(mainFragment, dependentFragments)
return IrActualizationResult(removedExpectDeclarationMetadata)
} }
private fun removeExpectDeclarations(dependentFragments: List<IrModuleFragment>, expectActualMap: Map<IrSymbol, IrSymbol>) { private fun removeExpectDeclarations(dependentFragments: List<IrModuleFragment>, expectActualMap: Map<IrSymbol, IrSymbol>): List<IrDeclaration> {
val removedDeclarationMetadata = mutableListOf<IrDeclaration>()
for (fragment in dependentFragments) { for (fragment in dependentFragments) {
for (file in fragment.files) { for (file in fragment.files) {
file.declarations.removeIf { shouldRemoveExpectDeclaration(it, expectActualMap) } file.declarations.removeIf {
if (shouldRemoveExpectDeclaration(it, expectActualMap)) {
removedDeclarationMetadata.add(it)
true
} else {
false
}
}
} }
} }
return removedDeclarationMetadata
} }
private fun shouldRemoveExpectDeclaration(irDeclaration: IrDeclaration, expectActualMap: Map<IrSymbol, IrSymbol>): Boolean { private fun shouldRemoveExpectDeclaration(irDeclaration: IrDeclaration, expectActualMap: Map<IrSymbol, IrSymbol>): Boolean {
@@ -0,0 +1,37 @@
// IGNORE_BACKEND_K1: JVM, JVM_IR, JS, JS_IR, JS_IR_ES6, NATIVE, WASM
// ISSUE: KT-57250
// WITH_STDLIB
// !OPT_IN: kotlin.ExperimentalMultiplatform
// !LANGUAGE: +MultiPlatformProjects
// MODULE: common
// TARGET_PLATFORM: Common
// FILE: common.kt
expect class C()
@OptionalExpectation
expect annotation class WithActual(val x: Int)
@OptionalExpectation
expect annotation class WithoutActual(val s: String)
expect fun k(): String
// MODULE: platform()()(common)
// FILE: lib.kt
actual class C {
fun o() = "O"
}
actual annotation class WithActual(actual val x: Int)
actual fun k() = "K"
// MODULE: main(platform)
// FILE: main.kt
@WithActual(42)
@WithoutActual("OK")
fun box() = C().o() + k()
@@ -31964,6 +31964,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
public void testNoArgActualConstructor() throws Exception { public void testNoArgActualConstructor() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt");
} }
@Test
@TestMetadata("removeExpectDeclarationsFromMetadata.kt")
public void testRemoveExpectDeclarationsFromMetadata() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
}
} }
@Nested @Nested
@@ -33381,6 +33381,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt");
} }
@Test
@TestMetadata("removeExpectDeclarationsFromMetadata.kt")
public void testRemoveExpectDeclarationsFromMetadata() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
}
@Test @Test
@TestMetadata("valueClasses.kt") @TestMetadata("valueClasses.kt")
public void testValueClasses() throws Exception { public void testValueClasses() throws Exception {
@@ -33381,6 +33381,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt");
} }
@Test
@TestMetadata("removeExpectDeclarationsFromMetadata.kt")
public void testRemoveExpectDeclarationsFromMetadata() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
}
@Test @Test
@TestMetadata("valueClasses.kt") @TestMetadata("valueClasses.kt")
public void testValueClasses() throws Exception { public void testValueClasses() throws Exception {
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.test.backend.ir package org.jetbrains.kotlin.test.backend.ir
import org.jetbrains.kotlin.KtSourceFile import org.jetbrains.kotlin.KtSourceFile
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizationResult
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
@@ -39,7 +40,7 @@ sealed class IrBackendInput : ResultingArtifact.BackendInput<IrBackendInput>() {
val expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>, // TODO: abstract from descriptors val expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>, // TODO: abstract from descriptors
val diagnosticsCollector: BaseDiagnosticsCollector, val diagnosticsCollector: BaseDiagnosticsCollector,
val hasErrors: Boolean, val hasErrors: Boolean,
val serializeSingleFile: (KtSourceFile) -> ProtoBuf.PackageFragment val serializeSingleFile: (KtSourceFile, IrActualizationResult?) -> ProtoBuf.PackageFragment
) : IrBackendInput() { ) : IrBackendInput() {
override val irModuleFragment: IrModuleFragment override val irModuleFragment: IrModuleFragment
get() = mainModuleFragment get() = mainModuleFragment
@@ -112,7 +112,7 @@ class ClassicFrontend2IrConverter(
expectDescriptorToSymbol = expectDescriptorToSymbol, expectDescriptorToSymbol = expectDescriptorToSymbol,
diagnosticsCollector = DiagnosticReporterFactory.createReporter(), diagnosticsCollector = DiagnosticReporterFactory.createReporter(),
hasErrors hasErrors
) { file -> ) { file, _ ->
metadataSerializer.serializeScope(file, analysisResult.bindingContext, moduleFragment.descriptor) metadataSerializer.serializeScope(file, analysisResult.bindingContext, moduleFragment.descriptor)
} }
} }
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.FirAnalyzerFacade
import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProvider import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProvider
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
import org.jetbrains.kotlin.fir.serialization.FirElementAwareSerializableStringTable import org.jetbrains.kotlin.fir.serialization.FirElementAwareSerializableStringTable
@@ -100,6 +101,8 @@ class Fir2IrJsResultsConverter(
val metadataVersion = configuration.metadataVersion(module.languageVersionSettings.languageVersion) val metadataVersion = configuration.metadataVersion(module.languageVersionSettings.languageVersion)
var actualizedExpectDeclarations: Set<FirDeclaration>? = null
return IrBackendInput.JsIrBackendInput( return IrBackendInput.JsIrBackendInput(
mainIrPart, mainIrPart,
dependentIrParts, dependentIrParts,
@@ -109,13 +112,17 @@ class Fir2IrJsResultsConverter(
expectDescriptorToSymbol = mutableMapOf(), expectDescriptorToSymbol = mutableMapOf(),
diagnosticsCollector = DiagnosticReporterFactory.createReporter(), diagnosticsCollector = DiagnosticReporterFactory.createReporter(),
hasErrors = inputArtifact.hasErrors hasErrors = inputArtifact.hasErrors
) { file -> ) { file, irActualizationResult ->
val (firFile, components) = firFilesAndComponentsBySourceFile[file] val (firFile, components) = firFilesAndComponentsBySourceFile[file]
?: error("cannot find FIR file by source file ${file.name} (${file.path})") ?: error("cannot find FIR file by source file ${file.name} (${file.path})")
if (actualizedExpectDeclarations == null && irActualizationResult != null) {
actualizedExpectDeclarations = irActualizationResult.extractFirDeclarations()
}
serializeSingleFirFile( serializeSingleFirFile(
firFile, firFile,
components.session, components.session,
components.scopeSession, components.scopeSession,
actualizedExpectDeclarations,
FirKLibSerializerExtension(components.session, metadataVersion, FirElementAwareSerializableStringTable()), FirKLibSerializerExtension(components.session, metadataVersion, FirElementAwareSerializableStringTable()),
configuration.languageVersionSettings, configuration.languageVersionSettings,
) )
@@ -108,7 +108,7 @@ class Fir2IrResultsConverter(
phaseConfig, phaseConfig,
components.irProviders, components.irProviders,
fir2IrExtensions, fir2IrExtensions,
FirJvmBackendExtension(components), FirJvmBackendExtension(components, irActualizationResult = null),
pluginContext, pluginContext,
notifyCodegenStart = {}, notifyCodegenStart = {},
) )
@@ -160,7 +160,7 @@ object GenerationUtils {
generationState.oldBEInitTrace(files) generationState.oldBEInitTrace(files)
codegenFactory.generateModuleInFrontendIRMode( codegenFactory.generateModuleInFrontendIRMode(
generationState, moduleFragment, components.symbolTable, components.irProviders, generationState, moduleFragment, components.symbolTable, components.irProviders,
fir2IrExtensions, FirJvmBackendExtension(components), pluginContext, fir2IrExtensions, FirJvmBackendExtension(components, irActualizationResult = null), pluginContext,
) {} ) {}
generationState.factory.done() generationState.factory.done()
@@ -27159,6 +27159,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/noArgActualConstructor.kt");
} }
@TestMetadata("removeExpectDeclarationsFromMetadata.kt")
public void ignoreRemoveExpectDeclarationsFromMetadata() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
}
private void runTest(String testDataFilePath) throws Exception { private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath); KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath);
} }
@@ -14,7 +14,8 @@ import org.jetbrains.kotlin.codegen.ProjectInfo
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.ir.backend.js.* import org.jetbrains.kotlin.ir.backend.js.MainModule
import org.jetbrains.kotlin.ir.backend.js.ModulesStructure
import org.jetbrains.kotlin.test.TargetBackend import org.jetbrains.kotlin.test.TargetBackend
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.File import java.io.File
@@ -66,12 +67,12 @@ abstract class FirAbstractInvalidationTest(
) )
if (outputs != null) { if (outputs != null) {
val irResult = transformFirToIr(moduleStructure, outputs, diagnosticsReporter) val fir2IrActualizedResult = transformFirToIr(moduleStructure, outputs, diagnosticsReporter)
serializeFirKlib( serializeFirKlib(
moduleStructure = moduleStructure, moduleStructure = moduleStructure,
firOutputs = outputs, firOutputs = outputs,
irResult = irResult, fir2IrActualizedResult = fir2IrActualizedResult,
outputKlibPath = outputKlibFile.absolutePath, outputKlibPath = outputKlibFile.absolutePath,
messageCollector = messageCollector, messageCollector = messageCollector,
diagnosticsReporter = diagnosticsReporter, diagnosticsReporter = diagnosticsReporter,
@@ -65,14 +65,17 @@ class FirJsKlibBackendFacade(
val diagnosticReporter = DiagnosticReporterFactory.createReporter() val diagnosticReporter = DiagnosticReporterFactory.createReporter()
if (firstTimeCompilation) { if (firstTimeCompilation) {
if (module.frontendKind == FrontendKinds.FIR && module.languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects)) { val irActualizationResult =
IrActualizer.actualize( if (module.frontendKind == FrontendKinds.FIR && module.languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects)) {
inputArtifact.mainModuleFragment, IrActualizer.actualize(
inputArtifact.dependentModuleFragments, inputArtifact.mainModuleFragment,
diagnosticReporter, inputArtifact.dependentModuleFragments,
configuration.languageVersionSettings diagnosticReporter,
) configuration.languageVersionSettings
} )
} else {
null
}
serializeModuleIntoKlib( serializeModuleIntoKlib(
configuration[CommonConfigurationKeys.MODULE_NAME]!!, configuration[CommonConfigurationKeys.MODULE_NAME]!!,
@@ -88,9 +91,10 @@ class FirJsKlibBackendFacade(
perFile = false, perFile = false,
containsErrorCode = inputArtifact.hasErrors, containsErrorCode = inputArtifact.hasErrors,
abiVersion = KotlinAbiVersion.CURRENT, // TODO get from test file data abiVersion = KotlinAbiVersion.CURRENT, // TODO get from test file data
jsOutputName = null, jsOutputName = null
inputArtifact.serializeSingleFile ) {
) inputArtifact.serializeSingleFile(it, irActualizationResult)
}
} }
// TODO: consider avoiding repeated libraries resolution // TODO: consider avoiding repeated libraries resolution
@@ -61,9 +61,10 @@ class JsKlibBackendFacade(
perFile = false, perFile = false,
containsErrorCode = inputArtifact.hasErrors, containsErrorCode = inputArtifact.hasErrors,
abiVersion = KotlinAbiVersion.CURRENT, // TODO get from test file data abiVersion = KotlinAbiVersion.CURRENT, // TODO get from test file data
jsOutputName = null, jsOutputName = null
inputArtifact.serializeSingleFile ) {
) inputArtifact.serializeSingleFile(it, null)
}
} }
val dependencies = JsEnvironmentConfigurator.getAllRecursiveDependenciesFor(module, testServices).toList() val dependencies = JsEnvironmentConfigurator.getAllRecursiveDependenciesFor(module, testServices).toList()
@@ -23104,6 +23104,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
public void testExpectProperty() throws Exception { public void testExpectProperty() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt");
} }
@Test
@TestMetadata("removeExpectDeclarationsFromMetadata.kt")
public void testRemoveExpectDeclarationsFromMetadata() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
}
} }
@Nested @Nested
@@ -23128,6 +23128,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest {
public void testExpectProperty() throws Exception { public void testExpectProperty() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt");
} }
@Test
@TestMetadata("removeExpectDeclarationsFromMetadata.kt")
public void testRemoveExpectDeclarationsFromMetadata() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
}
} }
@Nested @Nested
@@ -23128,6 +23128,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
public void testExpectProperty() throws Exception { public void testExpectProperty() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt");
} }
@Test
@TestMetadata("removeExpectDeclarationsFromMetadata.kt")
public void testRemoveExpectDeclarationsFromMetadata() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
}
} }
@Nested @Nested
@@ -23128,6 +23128,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes
public void testExpectProperty() throws Exception { public void testExpectProperty() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt");
} }
@Test
@TestMetadata("removeExpectDeclarationsFromMetadata.kt")
public void testRemoveExpectDeclarationsFromMetadata() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
}
} }
@Nested @Nested
@@ -18,13 +18,15 @@ import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentTypeTransformer import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentTypeTransformer
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions
import org.jetbrains.kotlin.fir.backend.Fir2IrResult import org.jetbrains.kotlin.fir.backend.Fir2IrPluginContext
import org.jetbrains.kotlin.fir.backend.Fir2IrVisibilityConverter import org.jetbrains.kotlin.fir.backend.Fir2IrVisibilityConverter
import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
import org.jetbrains.kotlin.fir.pipeline.convertToIrAndActualize import org.jetbrains.kotlin.fir.pipeline.convertToIrAndActualize
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.library.metadata.KlibMetadataFactories import org.jetbrains.kotlin.library.metadata.KlibMetadataFactories
import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.LockBasedStorageManager
@@ -66,7 +68,7 @@ internal fun PhaseContext.fir2Ir(
} }
val diagnosticsReporter = DiagnosticReporterFactory.createPendingReporter() val diagnosticsReporter = DiagnosticReporterFactory.createPendingReporter()
val fir2irResult = input.firResult.convertToIrAndActualize( val (irModuleFragment, components, pluginContext, irActualizationResult) = input.firResult.convertToIrAndActualize(
fir2IrExtensions, fir2IrExtensions,
IrGenerationExtension.getInstances(config.project), IrGenerationExtension.getInstances(config.project),
linkViaSignatures = false, linkViaSignatures = false,
@@ -79,11 +81,11 @@ internal fun PhaseContext.fir2Ir(
).also { ).also {
(it.irModuleFragment.descriptor as? FirModuleDescriptor)?.let { it.allDependencyModules = librariesDescriptors } (it.irModuleFragment.descriptor as? FirModuleDescriptor)?.let { it.allDependencyModules = librariesDescriptors }
} }
assert(fir2irResult.irModuleFragment.name.isSpecial) { assert(irModuleFragment.name.isSpecial) {
"`${fir2irResult.irModuleFragment.name}` must be Name.special, since it's required by KlibMetadataModuleDescriptorFactoryImpl.createDescriptorOptionalBuiltIns()" "`${irModuleFragment.name}` must be Name.special, since it's required by KlibMetadataModuleDescriptorFactoryImpl.createDescriptorOptionalBuiltIns()"
} }
val symbols = createKonanSymbols(fir2irResult) val symbols = createKonanSymbols(irModuleFragment, components, pluginContext)
// TODO KT-55580 Invoke CopyDefaultValuesToActualPhase, same as PsiToir phase does. // TODO KT-55580 Invoke CopyDefaultValuesToActualPhase, same as PsiToir phase does.
val renderDiagnosticNames = configuration.getBoolean(CLIConfigurationKeys.RENDER_DIAGNOSTIC_INTERNAL_NAME) val renderDiagnosticNames = configuration.getBoolean(CLIConfigurationKeys.RENDER_DIAGNOSTIC_INTERNAL_NAME)
@@ -93,15 +95,17 @@ internal fun PhaseContext.fir2Ir(
throw KonanCompilationException("Compilation failed: there were some diagnostics during fir2ir") throw KonanCompilationException("Compilation failed: there were some diagnostics during fir2ir")
} }
return Fir2IrOutput(input.firResult, fir2irResult, symbols) return Fir2IrOutput(input.firResult, symbols, irModuleFragment, components, pluginContext, irActualizationResult)
} }
private fun PhaseContext.createKonanSymbols( private fun PhaseContext.createKonanSymbols(
fir2irResult: Fir2IrResult, irModuleFragment: IrModuleFragment,
components: Fir2IrComponents,
pluginContext: Fir2IrPluginContext,
): KonanSymbolsOverFir { ): KonanSymbolsOverFir {
val moduleDescriptor = fir2irResult.irModuleFragment.descriptor val moduleDescriptor = irModuleFragment.descriptor
val symbolTable = SymbolTable(KonanIdSignaturer(KonanManglerDesc), fir2irResult.pluginContext.irFactory) val symbolTable = SymbolTable(KonanIdSignaturer(KonanManglerDesc), pluginContext.irFactory)
val descriptorsLookup = DescriptorsLookup(moduleDescriptor.builtIns as KonanBuiltIns) val descriptorsLookup = DescriptorsLookup(moduleDescriptor.builtIns as KonanBuiltIns)
return KonanSymbolsOverFir(this, descriptorsLookup, fir2irResult.components.irBuiltIns, symbolTable, symbolTable.lazyWrapper) return KonanSymbolsOverFir(this, descriptorsLookup, components.irBuiltIns, symbolTable, symbolTable.lazyWrapper)
} }
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.extractFirDeclarations
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
@@ -53,12 +54,13 @@ internal fun PhaseContext.firSerializer(
?: configuration.languageVersionSettings.languageVersion.toMetadataVersion() ?: configuration.languageVersionSettings.languageVersion.toMetadataVersion()
val resolvedLibraries = config.resolvedLibraries.getFullResolvedList(TopologicalLibraryOrder) // FIXME KT-55603 val resolvedLibraries = config.resolvedLibraries.getFullResolvedList(TopologicalLibraryOrder) // FIXME KT-55603
val actualizedFirDeclarations = input.irActualizationResult.extractFirDeclarations()
return serializeNativeModule( return serializeNativeModule(
configuration = configuration, configuration = configuration,
messageLogger = configuration.get(IrMessageLogger.IR_MESSAGE_LOGGER) ?: IrMessageLogger.None, messageLogger = configuration.get(IrMessageLogger.IR_MESSAGE_LOGGER) ?: IrMessageLogger.None,
sourceFiles, sourceFiles,
resolvedLibraries.map { it.library as KonanLibrary }, resolvedLibraries.map { it.library as KonanLibrary },
input.fir2irResult.irModuleFragment, input.irModuleFragment,
expectDescriptorToSymbol = mutableMapOf() // TODO: expect -> actual mapping expectDescriptorToSymbol = mutableMapOf() // TODO: expect -> actual mapping
) { file -> ) { file ->
val (firFile, session, scopeSession) = firFilesAndSessionsBySourceFile[file] val (firFile, session, scopeSession) = firFilesAndSessionsBySourceFile[file]
@@ -67,6 +69,7 @@ internal fun PhaseContext.firSerializer(
firFile, firFile,
session, session,
scopeSession, scopeSession,
actualizedFirDeclarations,
FirNativeKLibSerializerExtension(session, metadataVersion, FirElementAwareSerializableStringTable()), FirNativeKLibSerializerExtension(session, metadataVersion, FirElementAwareSerializableStringTable()),
configuration.languageVersionSettings, configuration.languageVersionSettings,
) )
@@ -15,8 +15,8 @@ import org.jetbrains.kotlin.backend.konan.driver.utilities.getDefaultIrActions
import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
import org.jetbrains.kotlin.backend.konan.lower.ExpectToActualDefaultValueCopier import org.jetbrains.kotlin.backend.konan.lower.ExpectToActualDefaultValueCopier
import org.jetbrains.kotlin.backend.konan.lower.SpecialBackendChecksTraversal import org.jetbrains.kotlin.backend.konan.lower.SpecialBackendChecksTraversal
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
import org.jetbrains.kotlin.backend.konan.makeEntryPoint import org.jetbrains.kotlin.backend.konan.makeEntryPoint
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
@@ -47,10 +47,10 @@ internal val K2SpecialBackendChecksPhase = createSimpleNamedCompilerPhase<PhaseC
"SpecialBackendChecks", "SpecialBackendChecks",
"Special backend checks", "Special backend checks",
) { context, input -> ) { context, input ->
val moduleFragment = input.fir2irResult.irModuleFragment val moduleFragment = input.irModuleFragment
SpecialBackendChecksTraversal( SpecialBackendChecksTraversal(
context, context,
InteropBuiltIns(input.fir2irResult.pluginContext.moduleDescriptor.builtIns as KonanBuiltIns), InteropBuiltIns(input.pluginContext.moduleDescriptor.builtIns as KonanBuiltIns),
input.symbols, input.symbols,
moduleFragment.irBuiltins moduleFragment.irBuiltins
).lower(moduleFragment) ).lower(moduleFragment)
@@ -5,17 +5,23 @@
package org.jetbrains.kotlin.backend.konan.driver.phases package org.jetbrains.kotlin.backend.konan.driver.phases
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizationResult
import org.jetbrains.kotlin.backend.konan.driver.PhaseContext import org.jetbrains.kotlin.backend.konan.driver.PhaseContext
import org.jetbrains.kotlin.backend.konan.driver.PhaseEngine import org.jetbrains.kotlin.backend.konan.driver.PhaseEngine
import org.jetbrains.kotlin.backend.konan.fir2Ir import org.jetbrains.kotlin.backend.konan.fir2Ir
import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
import org.jetbrains.kotlin.fir.backend.Fir2IrResult import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.Fir2IrPluginContext
import org.jetbrains.kotlin.fir.pipeline.FirResult import org.jetbrains.kotlin.fir.pipeline.FirResult
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
internal data class Fir2IrOutput( internal data class Fir2IrOutput(
val firResult: FirResult, val firResult: FirResult,
val fir2irResult: Fir2IrResult, val symbols: KonanSymbols,
val symbols: KonanSymbols val irModuleFragment: IrModuleFragment,
val components: Fir2IrComponents,
val pluginContext: Fir2IrPluginContext,
val irActualizationResult: IrActualizationResult?
) )
internal val Fir2IrPhase = createSimpleNamedCompilerPhase( internal val Fir2IrPhase = createSimpleNamedCompilerPhase(
@@ -26554,6 +26554,12 @@ public class FirNativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTe
public void testExpectProperty() throws Exception { public void testExpectProperty() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt");
} }
@Test
@TestMetadata("removeExpectDeclarationsFromMetadata.kt")
public void testRemoveExpectDeclarationsFromMetadata() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
}
} }
@Nested @Nested
@@ -26251,6 +26251,12 @@ public class K1NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTes
public void testExpectProperty() throws Exception { public void testExpectProperty() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt");
} }
@Test
@TestMetadata("removeExpectDeclarationsFromMetadata.kt")
public void testRemoveExpectDeclarationsFromMetadata() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
}
} }
@Nested @Nested
@@ -20699,6 +20699,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
public void testExpectProperty() throws Exception { public void testExpectProperty() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt"); runTest("compiler/testData/codegen/box/multiplatform/k2/basic/expectProperty.kt");
} }
@TestMetadata("removeExpectDeclarationsFromMetadata.kt")
public void testRemoveExpectDeclarationsFromMetadata() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
}
} }
@TestMetadata("compiler/testData/codegen/box/multiplatform/k2/defaultArguments") @TestMetadata("compiler/testData/codegen/box/multiplatform/k2/defaultArguments")