K2: link via signatures if -Xlink-via-signatures is set
Related to KT-53505
This commit is contained in:
+4
-2
@@ -46,7 +46,6 @@ import org.jetbrains.kotlin.fir.pipeline.convertToIr
|
||||
import org.jetbrains.kotlin.fir.pipeline.runCheckers
|
||||
import org.jetbrains.kotlin.fir.pipeline.runResolution
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.session.FirSessionFactory
|
||||
import org.jetbrains.kotlin.fir.session.FirSessionFactory.createSessionWithDependencies
|
||||
import org.jetbrains.kotlin.fir.session.IncrementalCompilationContext
|
||||
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
|
||||
@@ -186,7 +185,10 @@ object FirKotlinToJvmBytecodeCompiler {
|
||||
performanceManager?.notifyIRTranslationStarted()
|
||||
|
||||
val fir2IrExtensions = JvmFir2IrExtensions(moduleConfiguration, JvmIrDeserializerImpl(), JvmIrMangler)
|
||||
val fir2IrResult = firResult.session.convertToIr(firResult.scopeSession, firResult.fir, fir2IrExtensions, irGenerationExtensions)
|
||||
val linkViaSignatures = moduleConfiguration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES)
|
||||
val fir2IrResult = firResult.session.convertToIr(
|
||||
firResult.scopeSession, firResult.fir, fir2IrExtensions, irGenerationExtensions, linkViaSignatures
|
||||
)
|
||||
|
||||
performanceManager?.notifyIRTranslationFinished()
|
||||
|
||||
|
||||
@@ -192,10 +192,13 @@ fun convertAnalyzedFirToIr(
|
||||
|
||||
// fir2ir
|
||||
val irGenerationExtensions =
|
||||
(environment.projectEnvironment as? VfsBasedProjectEnvironment)?.project?.let { IrGenerationExtension.getInstances(it) }
|
||||
(environment.projectEnvironment as? VfsBasedProjectEnvironment)?.project?.let {
|
||||
IrGenerationExtension.getInstances(it)
|
||||
} ?: emptyList()
|
||||
val linkViaSignatures = input.configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES)
|
||||
val (irModuleFragment, components) =
|
||||
analysisResults.session.convertToIr(
|
||||
analysisResults.scopeSession, analysisResults.fir, extensions, irGenerationExtensions ?: emptyList()
|
||||
analysisResults.scopeSession, analysisResults.fir, extensions, irGenerationExtensions, linkViaSignatures
|
||||
)
|
||||
|
||||
return ModuleCompilerIrBackendInput(
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.fir.pipeline
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
|
||||
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.backend.Fir2IrConverter
|
||||
import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions
|
||||
@@ -19,6 +20,7 @@ import org.jetbrains.kotlin.fir.moduleData
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl
|
||||
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmDescriptorMangler
|
||||
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
|
||||
|
||||
@@ -26,19 +28,32 @@ fun FirSession.convertToIr(
|
||||
scopeSession: ScopeSession,
|
||||
firFiles: List<FirFile>,
|
||||
fir2IrExtensions: Fir2IrExtensions,
|
||||
irGeneratorExtensions: Collection<IrGenerationExtension>
|
||||
irGeneratorExtensions: Collection<IrGenerationExtension>,
|
||||
linkViaSignatures: Boolean
|
||||
): Fir2IrResult {
|
||||
val commonFirFiles = moduleData.dependsOnDependencies
|
||||
.map { it.session }
|
||||
.filter { it.kind == FirSession.Kind.Source }
|
||||
.flatMap { (it.firProvider as FirProviderImpl).getAllFirFiles() }
|
||||
|
||||
return Fir2IrConverter.createModuleFragmentWithoutSignatures(
|
||||
this, scopeSession, firFiles + commonFirFiles,
|
||||
languageVersionSettings, fir2IrExtensions,
|
||||
FirJvmKotlinMangler(this),
|
||||
JvmIrMangler, IrFactoryImpl, FirJvmVisibilityConverter,
|
||||
Fir2IrJvmSpecialAnnotationSymbolProvider(),
|
||||
irGeneratorExtensions
|
||||
)
|
||||
if (linkViaSignatures) {
|
||||
val signaturer = JvmIdSignatureDescriptor(mangler = JvmDescriptorMangler(mainDetector = null))
|
||||
return Fir2IrConverter.createModuleFragmentWithSignaturesIfNeeded(
|
||||
this, scopeSession, firFiles + commonFirFiles,
|
||||
languageVersionSettings, signaturer, fir2IrExtensions,
|
||||
FirJvmKotlinMangler(this),
|
||||
JvmIrMangler, IrFactoryImpl, FirJvmVisibilityConverter,
|
||||
Fir2IrJvmSpecialAnnotationSymbolProvider(),
|
||||
irGeneratorExtensions, true
|
||||
)
|
||||
} else {
|
||||
return Fir2IrConverter.createModuleFragmentWithoutSignatures(
|
||||
this, scopeSession, firFiles + commonFirFiles,
|
||||
languageVersionSettings, fir2IrExtensions,
|
||||
FirJvmKotlinMangler(this),
|
||||
JvmIrMangler, IrFactoryImpl, FirJvmVisibilityConverter,
|
||||
Fir2IrJvmSpecialAnnotationSymbolProvider(),
|
||||
irGeneratorExtensions
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+6
@@ -18073,6 +18073,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
runTest("compiler/testData/codegen/box/fir/KotlinDocumentationProvider.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("linkViaSignatures.kt")
|
||||
public void testLinkViaSignatures() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/linkViaSignatures.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("LookupTags.kt")
|
||||
public void testLookupTags() throws Exception {
|
||||
|
||||
+1
@@ -76,6 +76,7 @@ object LanguageSettingsDirectives : SimpleDirectivesContainer() {
|
||||
val USE_TYPE_TABLE by directive("Use type table in metadata serialization")
|
||||
val NO_NEW_JAVA_ANNOTATION_TARGETS by directive("Do not generate Java annotation targets TYPE_USE/TYPE_PARAMETER for Kotlin annotation classes with Kotlin targets TYPE/TYPE_PARAMETER")
|
||||
val OLD_INNER_CLASSES_LOGIC by directive("Use old logic for generation of InnerClasses attributes")
|
||||
val LINK_VIA_SIGNATURES by directive("Use linkage via signatures instead of descriptors / FIR")
|
||||
|
||||
// --------------------- Utils ---------------------
|
||||
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
// WITH_STDLIB
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// LINK_VIA_SIGNATURES
|
||||
|
||||
class Class
|
||||
interface Interface
|
||||
sealed class Sealed<T>
|
||||
enum class E { ENTRY }
|
||||
|
||||
fun function(s: String): Array<Int> {
|
||||
fun Boolean.local() {}
|
||||
return arrayOf(s.length)
|
||||
}
|
||||
typealias S = String
|
||||
var property: S? = "OK"
|
||||
|
||||
fun box(): String {
|
||||
val c = Class()
|
||||
val o = object : Interface {}
|
||||
if (property != "OK") return property!!
|
||||
if (E.ENTRY.ordinal != 0) return E.ENTRY.ordinal.toString()
|
||||
val result = function("AlphaBeta")
|
||||
if (result.size != 1) return result.size.toString()
|
||||
if (result[0] != 9) return result[0].toString()
|
||||
return "OK"
|
||||
}
|
||||
+6
@@ -18073,6 +18073,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/fir/KotlinDocumentationProvider.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("linkViaSignatures.kt")
|
||||
public void testLinkViaSignatures() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/fir/linkViaSignatures.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("LookupTags.kt")
|
||||
public void testLookupTags() throws Exception {
|
||||
|
||||
+2
@@ -48,6 +48,7 @@ import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.NO_OPTIMI
|
||||
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.NO_UNIFIED_NULL_CHECKS
|
||||
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.PARAMETERS_METADATA
|
||||
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.JDK_RELEASE
|
||||
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.LINK_VIA_SIGNATURES
|
||||
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.NO_NEW_JAVA_ANNOTATION_TARGETS
|
||||
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.OLD_INNER_CLASSES_LOGIC
|
||||
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives.USE_TYPE_TABLE
|
||||
@@ -177,6 +178,7 @@ class JvmEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfig
|
||||
register(ENABLE_DEBUG_MODE, JVMConfigurationKeys.ENABLE_DEBUG_MODE)
|
||||
register(NO_NEW_JAVA_ANNOTATION_TARGETS, JVMConfigurationKeys.NO_NEW_JAVA_ANNOTATION_TARGETS)
|
||||
register(OLD_INNER_CLASSES_LOGIC, JVMConfigurationKeys.OLD_INNER_CLASSES_LOGIC)
|
||||
register(LINK_VIA_SIGNATURES, JVMConfigurationKeys.LINK_VIA_SIGNATURES)
|
||||
}
|
||||
|
||||
override fun configureCompilerConfiguration(configuration: CompilerConfiguration, module: TestModule) {
|
||||
|
||||
Reference in New Issue
Block a user