diff --git a/build.xml b/build.xml index 0a8c4c4b5f7..e3a043da7ea 100644 --- a/build.xml +++ b/build.xml @@ -423,6 +423,14 @@ + + + + + + + + diff --git a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt index 5e28b5c9973..2154266688c 100644 --- a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt +++ b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt @@ -128,20 +128,25 @@ public class BuiltInsSerializer(private val dependOnOldBuiltIns: Boolean) { val fragments = module.getPackageFragmentProvider().getPackageFragments(fqName) val packageProto = serializer.packageProto(fragments).build() ?: error("Package fragments not serialized: $fragments") packageProto.writeTo(packageStream) - write(destDir, BuiltInsSerializationUtil.getPackageFilePath(fqName), packageStream) + write(destDir, BuiltInsSerializationUtil.getPackageFilePath(fqName), packageStream, + BuiltInsSerializationUtil.FallbackPaths.getPackageFilePath(fqName)) val nameStream = ByteArrayOutputStream() val strings = serializer.getStringTable() SerializationUtil.serializeStringTable(nameStream, strings.serializeSimpleNames(), strings.serializeQualifiedNames()) - write(destDir, BuiltInsSerializationUtil.getStringTableFilePath(fqName), nameStream) + write(destDir, BuiltInsSerializationUtil.getStringTableFilePath(fqName), nameStream, + BuiltInsSerializationUtil.FallbackPaths.getStringTableFilePath(fqName)) } - private fun write(destDir: File, fileName: String, stream: ByteArrayOutputStream) { + internal /* KT-5786 */ fun write(destDir: File, fileName: String, stream: ByteArrayOutputStream, legacyFileName: String? = null) { totalSize += stream.size() totalFiles++ - val file = File(destDir, fileName) - file.getParentFile()?.mkdirs() - file.writeBytes(stream.toByteArray()) + File(destDir, fileName).getParentFile().mkdirs() + File(destDir, fileName).writeBytes(stream.toByteArray()) + + legacyFileName?.let { fileName -> + File(destDir, fileName).writeBytes(stream.toByteArray()) + } } private fun serializeClass( diff --git a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/run.kt b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/run.kt index f5804bebc2c..30ef62bad92 100644 --- a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/run.kt +++ b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/run.kt @@ -29,7 +29,7 @@ Usage: ... ()+ Analyzes Kotlin sources found in the given source directories and serializes found top-level declarations to (files such as -.kotlin_string_table, .kotlin_package, *.kotlin_class)""" +*.kotlin_string_table, *.kotlin_package, *.kotlin_class)""" ) return } diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsSerializationUtil.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsSerializationUtil.kt index a3480c4e747..a709eb7d4c0 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsSerializationUtil.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsSerializationUtil.kt @@ -20,7 +20,6 @@ import com.google.protobuf.ExtensionRegistryLite import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.serialization.builtins.BuiltInsProtoBuf -import kotlin.platform.platformStatic public object BuiltInsSerializationUtil { public val EXTENSION_REGISTRY: ExtensionRegistryLite @@ -31,20 +30,33 @@ public object BuiltInsSerializationUtil { } private val CLASS_METADATA_FILE_EXTENSION = "kotlin_class" - private val PACKAGE_FILE_NAME = ".kotlin_package" - private val STRING_TABLE_FILE_NAME = ".kotlin_string_table" + private val PACKAGE_FILE_EXTENSION = "kotlin_package" + private val STRING_TABLE_FILE_EXTENSION = "kotlin_string_table" - platformStatic public fun getClassMetadataPath(classId: ClassId): String { + // TODO: remove this after M12 + public object FallbackPaths { + public fun getPackageFilePath(fqName: FqName): String = + packageFqNameToPath(fqName) + "/.kotlin_package" + + public fun getStringTableFilePath(fqName: FqName): String = + packageFqNameToPath(fqName) + "/.kotlin_string_table" + } + + public fun getClassMetadataPath(classId: ClassId): String { return packageFqNameToPath(classId.getPackageFqName()) + "/" + classId.getRelativeClassName().asString() + "." + CLASS_METADATA_FILE_EXTENSION } - platformStatic public fun getPackageFilePath(fqName: FqName): String = - packageFqNameToPath(fqName) + "/" + PACKAGE_FILE_NAME + public fun getPackageFilePath(fqName: FqName): String = + packageFqNameToPath(fqName) + "/" + shortName(fqName) + "." + PACKAGE_FILE_EXTENSION + + public fun getStringTableFilePath(fqName: FqName): String = + packageFqNameToPath(fqName) + "/" + shortName(fqName) + "." + STRING_TABLE_FILE_EXTENSION - platformStatic public fun getStringTableFilePath(fqName: FqName): String = - packageFqNameToPath(fqName) + "/" + STRING_TABLE_FILE_NAME private fun packageFqNameToPath(fqName: FqName): String = fqName.asString().replace('.', '/') + + private fun shortName(fqName: FqName): String = + if (fqName.isRoot()) "default-package" else fqName.shortName().asString() } diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltinsPackageFragment.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltinsPackageFragment.kt index 0eb6093b304..2f679142c34 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltinsPackageFragment.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltinsPackageFragment.kt @@ -36,7 +36,10 @@ public class BuiltinsPackageFragment( private val loadResource: (path: String) -> InputStream? ) : PackageFragmentDescriptorImpl(module, fqName) { - val nameResolver = NameResolver.read(loadResourceSure(BuiltInsSerializationUtil.getStringTableFilePath(fqName))) + val nameResolver = NameResolver.read( + loadResource(BuiltInsSerializationUtil.getStringTableFilePath(fqName)) + ?: loadResourceSure(BuiltInsSerializationUtil.FallbackPaths.getStringTableFilePath(fqName)) + ) private var components: DeserializationComponents by Delegates.notNull() @@ -46,7 +49,8 @@ public class BuiltinsPackageFragment( } private val memberScope = storageManager.createLazyValue { - val stream = loadResourceSure(BuiltInsSerializationUtil.getPackageFilePath(fqName)) + val stream = loadResource(BuiltInsSerializationUtil.getPackageFilePath(fqName)) + ?: loadResourceSure(BuiltInsSerializationUtil.FallbackPaths.getPackageFilePath(fqName)) val proto = ProtoBuf.Package.parseFrom(stream, BuiltInsSerializationUtil.EXTENSION_REGISTRY) DeserializedPackageMemberScope(this, proto, nameResolver, components, classNames = { proto.getExtension(BuiltInsProtoBuf.className)?.map { id -> nameResolver.getName(id) } ?: listOf() diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt index d29de8f57f1..d57452142f2 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt @@ -117,12 +117,13 @@ public object KotlinJavascriptSerializationUtil { val fragments = module.getPackageFragmentProvider().getPackageFragments(fqName) val packageProto = serializer.packageProto(fragments, skip).build() ?: error("Package fragments not serialized: $fragments") packageProto.writeTo(packageStream) - writeFun(BuiltInsSerializationUtil.getPackageFilePath(fqName), packageStream) + // TODO: don't use fallback paths here + writeFun(BuiltInsSerializationUtil.FallbackPaths.getPackageFilePath(fqName), packageStream) val nameStream = ByteArrayOutputStream() val strings = serializer.getStringTable() SerializationUtil.serializeStringTable(nameStream, strings.serializeSimpleNames(), strings.serializeQualifiedNames()) - writeFun(BuiltInsSerializationUtil.getStringTableFilePath(fqName), nameStream) + writeFun(BuiltInsSerializationUtil.FallbackPaths.getStringTableFilePath(fqName), nameStream) } fun getFileName(classDescriptor: ClassDescriptor): String {