From 20cd360b077b558f7b1af0a2063e7ea908b64efd Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 22 Apr 2015 17:32:34 +0300 Subject: [PATCH] Rename built-in metadata files starting with dot Files starting with dot are considered as hidden on Unix systems, and sometimes are ignored by the tools. For example, Android build tools do not package such files to the resulting application, which causes Kotlin reflection to fail there #KT-7088 Fixed --- build.xml | 8 ++++++ .../builtins/BuiltInsSerializer.kt | 17 +++++++---- .../kotlin/serialization/builtins/run.kt | 2 +- .../builtins/BuiltInsSerializationUtil.kt | 28 +++++++++++++------ .../builtins/BuiltinsPackageFragment.kt | 8 ++++-- .../js/KotlinJavascriptSerializationUtil.kt | 5 ++-- 6 files changed, 49 insertions(+), 19 deletions(-) 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 {