Skip to content

Commit a1a71a0

Browse files
committed
Drop JvmMetadataVersion.skipCheck, support this correctly
Pass the value of this flag via DeserializationConfiguration
1 parent e1463f9 commit a1a71a0

File tree

18 files changed

+73
-70
lines changed

18 files changed

+73
-70
lines changed

compiler/backend/src/org/jetbrains/kotlin/codegen/classFileUtils.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ private fun Iterable<PackageParts>.addCompiledParts(state: GenerationState): Lis
4040
val incrementalCache = state.incrementalCacheForThisTarget ?: return this.toList()
4141
val moduleMappingData = incrementalCache.getModuleMappingData() ?: return this.toList()
4242

43-
val mapping = ModuleMapping.create(moduleMappingData, "<incremental>")
43+
val mapping = ModuleMapping.create(moduleMappingData, "<incremental>", state.deserializationConfiguration)
4444

4545
incrementalCache.getObsoletePackageParts().forEach { internalName ->
4646
val qualifier = internalName.substringBeforeLast('/', "").replace('/', '.')

compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,10 @@ import org.jetbrains.kotlin.name.FqName
4141
import org.jetbrains.kotlin.psi.KtClassOrObject
4242
import org.jetbrains.kotlin.psi.KtFile
4343
import org.jetbrains.kotlin.psi.KtScript
44-
import org.jetbrains.kotlin.resolve.BindingContext
45-
import org.jetbrains.kotlin.resolve.BindingTrace
46-
import org.jetbrains.kotlin.resolve.BindingTraceFilter
47-
import org.jetbrains.kotlin.resolve.DelegatingBindingTrace
44+
import org.jetbrains.kotlin.resolve.*
4845
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
4946
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
47+
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
5048
import org.jetbrains.org.objectweb.asm.Opcodes
5149
import java.io.File
5250

@@ -94,6 +92,7 @@ class GenerationState @JvmOverloads constructor(
9492
val incrementalCacheForThisTarget: IncrementalCache?
9593
val packagesWithObsoleteParts: Set<FqName>
9694
val obsoleteMultifileClasses: List<FqName>
95+
val deserializationConfiguration: DeserializationConfiguration = CompilerDeserializationConfiguration(configuration)
9796

9897
init {
9998
val icComponents = configuration.get(JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS)

compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ import org.jetbrains.kotlin.compiler.plugin.PluginCliOptionProcessingException
3838
import org.jetbrains.kotlin.compiler.plugin.cliPluginUsageString
3939
import org.jetbrains.kotlin.config.*
4040
import org.jetbrains.kotlin.load.java.JvmAbi
41-
import org.jetbrains.kotlin.load.kotlin.JvmMetadataVersion
4241
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents
4342
import org.jetbrains.kotlin.script.KotlinScriptDefinitionFromAnnotatedTemplate
4443
import org.jetbrains.kotlin.script.StandardScriptDefinition
@@ -114,10 +113,6 @@ class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
114113
return ExitCode.OK
115114
}
116115

117-
if (arguments.skipMetadataVersionCheck) {
118-
JvmMetadataVersion.skipCheck = true
119-
}
120-
121116
if (arguments.includeRuntime) {
122117
configuration.put(JVMConfigurationKeys.INCLUDE_RUNTIME, true)
123118
}
@@ -317,6 +312,7 @@ class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
317312
configuration.put(JVMConfigurationKeys.DISABLE_OPTIMIZATION, arguments.noOptimize)
318313
configuration.put(JVMConfigurationKeys.INHERIT_MULTIFILE_PARTS, arguments.inheritMultifileParts)
319314
configuration.put(JVMConfigurationKeys.SKIP_RUNTIME_VERSION_CHECK, arguments.skipRuntimeVersionCheck)
315+
configuration.put(CommonConfigurationKeys.SKIP_METADATA_VERSION_CHECK, arguments.skipMetadataVersionCheck)
320316
configuration.put(CLIConfigurationKeys.ALLOW_KOTLIN_PACKAGE, arguments.allowKotlinPackage)
321317
configuration.put(CLIConfigurationKeys.REPORT_PERF, arguments.reportPerf)
322318
configuration.put(JVMConfigurationKeys.USE_SINGLE_MODULE, arguments.singleModule)

compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/JvmPackagePartProvider.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.config.JVMConfigurationKeys
2424
import org.jetbrains.kotlin.descriptors.PackagePartProvider
2525
import org.jetbrains.kotlin.load.kotlin.ModuleMapping
2626
import org.jetbrains.kotlin.load.kotlin.PackageParts
27+
import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration
2728
import java.io.EOFException
2829

2930
class JvmPackagePartProvider(
@@ -32,6 +33,8 @@ class JvmPackagePartProvider(
3233
) : PackagePartProvider {
3334
private data class ModuleMappingInfo(val root: VirtualFile, val mapping: ModuleMapping)
3435

36+
private val deserializationConfiguration = CompilerDeserializationConfiguration(env.configuration)
37+
3538
private val notLoadedRoots by lazy(LazyThreadSafetyMode.NONE) {
3639
env.configuration.getList(JVMConfigurationKeys.CONTENT_ROOTS)
3740
.filterIsInstance<JvmClasspathRoot>()
@@ -96,7 +99,7 @@ class JvmPackagePartProvider(
9699
val moduleFiles = metaInf.children.filter { it.name.endsWith(ModuleMapping.MAPPING_FILE_EXT) }
97100
for (moduleFile in moduleFiles) {
98101
val mapping = try {
99-
ModuleMapping.create(moduleFile.contentsToByteArray(), moduleFile.toString())
102+
ModuleMapping.create(moduleFile.contentsToByteArray(), moduleFile.toString(), deserializationConfiguration)
100103
}
101104
catch (e: EOFException) {
102105
throw RuntimeException("Error on reading package parts for '$packageFqName' package in '$moduleFile', " +

compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackagePartProvider.kt

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,19 @@ package org.jetbrains.kotlin.load.kotlin.incremental
1919
import org.jetbrains.kotlin.descriptors.PackagePartProvider
2020
import org.jetbrains.kotlin.load.kotlin.ModuleMapping
2121
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache
22-
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents
23-
import org.jetbrains.kotlin.modules.TargetId
22+
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
2423
import org.jetbrains.kotlin.storage.StorageManager
2524

26-
internal class IncrementalPackagePartProvider private constructor(
25+
internal class IncrementalPackagePartProvider(
2726
private val parent: PackagePartProvider,
2827
incrementalCaches: List<IncrementalCache>,
2928
storageManager: StorageManager
3029
) : PackagePartProvider {
30+
lateinit var deserializationConfiguration: DeserializationConfiguration
31+
3132
private val moduleMappings = storageManager.createLazyValue {
3233
incrementalCaches.map { cache ->
33-
ModuleMapping.create(cache.getModuleMappingData(), "<incremental>")
34+
ModuleMapping.create(cache.getModuleMappingData(), "<incremental>", deserializationConfiguration)
3435
}
3536
}
3637

@@ -41,19 +42,4 @@ internal class IncrementalPackagePartProvider private constructor(
4142

4243
// TODO
4344
override fun findMetadataPackageParts(packageFqName: String): List<String> = TODO()
44-
45-
companion object {
46-
@JvmStatic
47-
fun create(
48-
parent: PackagePartProvider,
49-
targets: List<TargetId>?,
50-
incrementalCompilationComponents: IncrementalCompilationComponents?,
51-
storageManager: StorageManager
52-
): PackagePartProvider {
53-
if (targets == null || incrementalCompilationComponents == null) return parent
54-
55-
val incrementalCaches = targets.map { incrementalCompilationComponents.getIncrementalCache(it) }
56-
return IncrementalPackagePartProvider(parent, incrementalCaches, storageManager)
57-
}
58-
}
5945
}

compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ import org.jetbrains.kotlin.resolve.jvm.extensions.PackageFragmentProviderExtens
6363
import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer
6464
import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory
6565
import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory
66+
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
6667
import org.jetbrains.kotlin.storage.StorageManager
6768
import java.util.*
6869

@@ -173,18 +174,22 @@ object TopDownAnalyzerFacadeForJVM {
173174
}
174175
else null
175176

177+
val partProvider = packagePartProvider(sourceScope).let { fragment ->
178+
if (targetIds == null || incrementalComponents == null) fragment
179+
else IncrementalPackagePartProvider(fragment, targetIds.map(incrementalComponents::getIncrementalCache), storageManager)
180+
}
181+
176182
// Note that it's necessary to create container for sources _after_ creation of container for dependencies because
177183
// CliLightClassGenerationSupport#initialize is invoked when container is created, so only the last module descriptor is going
178184
// to be stored in CliLightClassGenerationSupport, and it better be the source one (otherwise light classes would not be found)
179185
// TODO: get rid of duplicate invocation of CodeAnalyzerInitializer#initialize, or refactor CliLightClassGenerationSupport
180186
val container = createContainerForTopDownAnalyzerForJvm(
181187
moduleContext, trace, declarationProviderFactory(storageManager, files), sourceScope, lookupTracker,
182-
IncrementalPackagePartProvider.create(
183-
packagePartProvider(sourceScope), targetIds, incrementalComponents, storageManager
184-
),
185-
languageVersionSettings, moduleClassResolver, configuration
188+
partProvider, languageVersionSettings, moduleClassResolver, configuration
186189
).apply {
187190
initJvmBuiltInsForTopDownAnalysis(module, languageVersionSettings)
191+
(partProvider as? IncrementalPackagePartProvider)?.deserializationConfiguration = get<DeserializationConfiguration>()
192+
188193
StorageComponentContainerContributor.getInstances(project).forEach { it.onContainerComposed(this, null) }
189194
}
190195

compiler/frontend/src/org/jetbrains/kotlin/config/CommonConfigurationKeys.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ private CommonConfigurationKeys() {
2323
public static final CompilerConfigurationKey<LanguageVersionSettings> LANGUAGE_VERSION_SETTINGS =
2424
CompilerConfigurationKey.create("language version settings");
2525

26+
public static final CompilerConfigurationKey<Boolean> SKIP_METADATA_VERSION_CHECK =
27+
CompilerConfigurationKey.create("skip metadata version check");
28+
2629
public static final CompilerConfigurationKey<Boolean> DISABLE_INLINE =
2730
CompilerConfigurationKey.create("disable inline");
2831

compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.jetbrains.kotlin.frontend.di
1818

19+
import org.jetbrains.kotlin.config.CommonConfigurationKeys
1920
import org.jetbrains.kotlin.config.CompilerConfiguration
2021
import org.jetbrains.kotlin.config.LanguageVersionSettings
2122
import org.jetbrains.kotlin.container.StorageComponentContainer
@@ -144,7 +145,9 @@ fun createContainerForLazyResolve(
144145
useInstance(LookupTracker.DO_NOTHING)
145146
useInstance(languageVersionSettings)
146147
//TODO: need to propagate full CompilerConfiguration to frontend
147-
useInstance(CompilerConfiguration.EMPTY)
148+
useInstance(CompilerConfiguration().apply {
149+
put(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS, languageVersionSettings)
150+
})
148151

149152
useImpl<FileScopeProviderImpl>()
150153
useImpl<CompilerDeserializationConfiguration>()

compiler/frontend/src/org/jetbrains/kotlin/resolve/CompilerDeserializationConfiguration.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,17 @@
1616

1717
package org.jetbrains.kotlin.resolve
1818

19+
import org.jetbrains.kotlin.config.CommonConfigurationKeys
20+
import org.jetbrains.kotlin.config.CompilerConfiguration
1921
import org.jetbrains.kotlin.config.LanguageFeature
20-
import org.jetbrains.kotlin.config.LanguageVersionSettings
22+
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
2123
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
2224

23-
class CompilerDeserializationConfiguration(private val languageVersionSettings: LanguageVersionSettings) : DeserializationConfiguration {
24-
override val typeAliasesAllowed: Boolean
25-
get() = languageVersionSettings.supportsFeature(LanguageFeature.TypeAliases)
25+
class CompilerDeserializationConfiguration(configuration: CompilerConfiguration) : DeserializationConfiguration {
26+
private val languageVersionSettings =
27+
configuration.get(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS, LanguageVersionSettingsImpl.DEFAULT)
28+
29+
override val typeAliasesAllowed = languageVersionSettings.supportsFeature(LanguageFeature.TypeAliases)
30+
31+
override val skipMetadataVersionCheck = configuration.getBoolean(CommonConfigurationKeys.SKIP_METADATA_VERSION_CHECK)
2632
}

compiler/tests/org/jetbrains/kotlin/codegen/JvmPackageTableTest.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.cli.AbstractCliTest
2020
import org.jetbrains.kotlin.cli.common.ExitCode
2121
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
2222
import org.jetbrains.kotlin.load.kotlin.ModuleMapping
23+
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
2324
import org.jetbrains.kotlin.test.KotlinTestUtils
2425
import org.jetbrains.kotlin.test.testFramework.KtUsefulTestCase
2526
import java.io.File
@@ -38,7 +39,10 @@ class JvmPackageTableTest : KtUsefulTestCase() {
3839
System.err.println(output) // normally output is empty
3940
assertEquals("Compilation should complete successfully", ExitCode.OK, exitCode)
4041

41-
val mapping = ModuleMapping.create(File(tmpdir, "META-INF/$moduleName.${ModuleMapping.MAPPING_FILE_EXT}").readBytes(), "test")
42+
val mapping = ModuleMapping.create(
43+
File(tmpdir, "META-INF/$moduleName.${ModuleMapping.MAPPING_FILE_EXT}").readBytes(), "test",
44+
DeserializationConfiguration.Default
45+
)
4246
val result = buildString {
4347
for ((fqName, packageParts) in mapping.packageFqName2Parts) {
4448
appendln(fqName)

compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -417,14 +417,9 @@ public void testReleaseCompilerAgainstPreReleaseLibrary() throws Exception {
417417
doTestPreReleaseKotlinLibrary("library");
418418
}
419419

420-
/*
421-
// This test should pass but is commented out because the compiler flag is implemented via mutation of the public field,
422-
// which may cause subsequent tests to behave unexpectedly
423-
// TODO: refactor and uncomment
424420
public void testReleaseCompilerAgainstPreReleaseLibrarySkipVersionCheck() throws Exception {
425421
doTestPreReleaseKotlinLibrary("library", "-Xskip-metadata-version-check");
426422
}
427-
*/
428423

429424
public void testWrongMetadataVersion() throws Exception {
430425
doTestKotlinLibraryWithWrongMetadataVersion("library", null);
@@ -466,12 +461,9 @@ public Object invoke(String name, Object value) {
466461
);
467462
}
468463

469-
/*
470-
// TODO: refactor and uncomment
471464
public void testWrongMetadataVersionSkipVersionCheck() throws Exception {
472465
doTestKotlinLibraryWithWrongMetadataVersion("library", null, "-Xskip-metadata-version-check");
473466
}
474-
*/
475467

476468
/*test source mapping generation when source info is absent*/
477469
public void testInlineFunWithoutDebugInfo() throws Exception {

core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.kt

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.serialization.deserialization.DeserializationCompone
2727
import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData
2828
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
2929
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
30-
import org.jetbrains.kotlin.utils.addToStdlib.check
3130
import javax.inject.Inject
3231

3332
class DeserializedDescriptorResolver {
@@ -39,6 +38,9 @@ class DeserializedDescriptorResolver {
3938
this.components = components.components
4039
}
4140

41+
private val skipMetadataVersionCheck: Boolean
42+
get() = components.configuration.skipMetadataVersionCheck
43+
4244
fun resolveClass(kotlinClass: KotlinJvmBinaryClass): ClassDescriptor? {
4345
val classData = readClassData(kotlinClass) ?: return null
4446
return components.classDeserializer.deserializeClass(kotlinClass.classId, classData)
@@ -69,18 +71,18 @@ class DeserializedDescriptorResolver {
6971

7072
private val KotlinJvmBinaryClass.incompatibility: IncompatibleVersionErrorData<JvmMetadataVersion>?
7173
get() {
72-
if (classHeader.metadataVersion.isCompatible()) return null
74+
if (skipMetadataVersionCheck || classHeader.metadataVersion.isCompatible()) return null
7375
return IncompatibleVersionErrorData(classHeader.metadataVersion, JvmMetadataVersion.INSTANCE, location, classId)
7476
}
7577

7678
private val KotlinJvmBinaryClass.isPreReleaseInvisible: Boolean
77-
get() = !JvmMetadataVersion.skipCheck &&
79+
get() = !skipMetadataVersionCheck &&
7880
!KotlinCompilerVersion.isPreRelease() &&
7981
(classHeader.isPreRelease || classHeader.metadataVersion == KOTLIN_1_1_EAP_METADATA_VERSION)
8082

8183
internal fun readData(kotlinClass: KotlinJvmBinaryClass, expectedKinds: Set<KotlinClassHeader.Kind>): Array<String>? {
8284
val header = kotlinClass.classHeader
83-
return (header.data ?: header.incompatibleData)?.check { header.kind in expectedKinds }
85+
return (header.data ?: header.incompatibleData)?.takeIf { header.kind in expectedKinds }
8486
}
8587

8688
private inline fun <T : Any> parseProto(klass: KotlinJvmBinaryClass, block: () -> T): T? {
@@ -93,11 +95,12 @@ class DeserializedDescriptorResolver {
9395
}
9496
}
9597
catch (e: Throwable) {
96-
if (!klass.classHeader.metadataVersion.isCompatible()) {
97-
// TODO: log.warn
98-
return null
98+
if (skipMetadataVersionCheck || klass.classHeader.metadataVersion.isCompatible()) {
99+
throw e
99100
}
100-
throw e
101+
102+
// TODO: log.warn
103+
return null
101104
}
102105
}
103106

core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/JvmMetadataVersion.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,9 @@ import org.jetbrains.kotlin.serialization.deserialization.BinaryVersion
2525
class JvmMetadataVersion(vararg numbers: Int) : BinaryVersion(*numbers) {
2626
// NOTE: 1.1 is incompatible with 1.0 and hence with any other version except 1.1.*
2727
override fun isCompatible() =
28-
skipCheck || (this.major == 1 && this.minor == 1)
28+
this.major == 1 && this.minor == 1
2929

3030
companion object {
31-
// TODO: this is a temporary hack which can be removed once we migrate the IDEA code from 1.0 to 1.1
32-
var skipCheck: Boolean = false
33-
3431
@JvmField
3532
val INSTANCE = JvmMetadataVersion(1, 1, 5)
3633

core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/ModuleMapping.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616

1717
package org.jetbrains.kotlin.load.kotlin
1818

19+
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
1920
import org.jetbrains.kotlin.serialization.jvm.JvmPackageTable
2021
import java.io.ByteArrayInputStream
2122
import java.io.DataInputStream
22-
import kotlin.comparisons.nullsLast
2323

2424
class ModuleMapping private constructor(val packageFqName2Parts: Map<String, PackageParts>, private val debugName: String) {
2525
fun findPackageParts(packageFqName: String): PackageParts? {
@@ -35,15 +35,19 @@ class ModuleMapping private constructor(val packageFqName2Parts: Map<String, Pac
3535
@JvmField
3636
val EMPTY: ModuleMapping = ModuleMapping(emptyMap(), "EMPTY")
3737

38-
fun create(bytes: ByteArray?, debugName: String?): ModuleMapping {
38+
fun create(
39+
bytes: ByteArray?,
40+
debugName: String,
41+
configuration: DeserializationConfiguration
42+
): ModuleMapping {
3943
if (bytes == null) {
4044
return EMPTY
4145
}
4246

4347
val stream = DataInputStream(ByteArrayInputStream(bytes))
4448
val version = JvmMetadataVersion(*IntArray(stream.readInt()) { stream.readInt() })
4549

46-
if (version.isCompatible()) {
50+
if (configuration.skipMetadataVersionCheck || version.isCompatible()) {
4751
val table = JvmPackageTable.PackageTable.parseFrom(stream) ?: return EMPTY
4852
val result = linkedMapOf<String, PackageParts>()
4953

@@ -60,7 +64,7 @@ class ModuleMapping private constructor(val packageFqName2Parts: Map<String, Pac
6064
proto.classNameList.forEach(packageParts::addMetadataPart)
6165
}
6266

63-
return ModuleMapping(result, debugName ?: "<unknown>")
67+
return ModuleMapping(result, debugName)
6468
}
6569
else {
6670
// TODO: consider reporting "incompatible ABI version" error for package parts

0 commit comments

Comments
 (0)