diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerTest.kt b/compiler/tests/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerTest.kt index 6619dd60683..be57058f20a 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerTest.kt @@ -28,7 +28,6 @@ import org.jetbrains.kotlin.config.addKotlinSourceRoots import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS -import org.jetbrains.kotlin.js.config.EcmaVersion import org.jetbrains.kotlin.js.config.LibrarySourcesConfig import org.jetbrains.kotlin.jvm.compiler.LoadDescriptorUtil.TEST_PACKAGE_FQNAME import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil @@ -36,7 +35,6 @@ import org.jetbrains.kotlin.test.JetTestUtils import org.jetbrains.kotlin.test.TestCaseWithTmpdir import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparator import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils -import org.jetbrains.kotlin.utils.serializer.KotlinJavaScriptSerializer import java.io.File public class KotlinJavascriptSerializerTest : TestCaseWithTmpdir() { @@ -71,7 +69,7 @@ public class KotlinJavascriptSerializerTest : TestCaseWithTmpdir() { val files = environment.getSourceFiles() val config = LibrarySourcesConfig.Builder(environment.project, MODULE_NAME, LibrarySourcesConfig.JS_STDLIB).build() val analysisResult = TopDownAnalyzerFacadeForJS.analyzeFiles(files, config) - KotlinJavaScriptSerializer().serialize(MODULE_NAME, analysisResult.moduleDescriptor, metaFile) + FileUtil.writeToFile(metaFile, KotlinJavascriptSerializationUtil.metadataAsString(MODULE_NAME, analysisResult.moduleDescriptor)) } finally { Disposer.dispose(rootDisposable) diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt b/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt index 6c68cb00913..fa6ab84e7b1 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt +++ b/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt @@ -30,6 +30,7 @@ public object KotlinJavascriptMetadataUtils { private val LOG = Logger.getInstance(javaClass()) public val JS_EXT: String = ".js" + public val META_JS_SUFFIX: String = ".meta.js" private val KOTLIN_JAVASCRIPT_METHOD_NAME = "kotlin_module_metadata" private val KOTLIN_JAVASCRIPT_METHOD_NAME_PATTERN = "\\.kotlin_module_metadata\\(".toRegex() /** @@ -41,11 +42,7 @@ public object KotlinJavascriptMetadataUtils { platformStatic public fun hasMetadata(text: String): Boolean = METADATA_PATTERN.matcher(text).find() - public fun writeMetadata(moduleName: String, content: ByteArray, metaFile: File) { - FileUtil.writeToFile(metaFile, writeMetadataToString(moduleName, content)) - } - - public fun writeMetadataToString(moduleName: String, content: ByteArray): String = + public fun formatMetadataAsString(moduleName: String, content: ByteArray): String = "// Kotlin.$KOTLIN_JAVASCRIPT_METHOD_NAME($ABI_VERSION, \"$moduleName\", \"${printBase64Binary(content)}\");\n" platformStatic diff --git a/js/js.serializer/src/org/jetbrains/kotlin/utils/serializer/ClassSerializationUtil.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ClassSerializationUtil.kt similarity index 97% rename from js/js.serializer/src/org/jetbrains/kotlin/utils/serializer/ClassSerializationUtil.kt rename to js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ClassSerializationUtil.kt index 4f3c814f72b..2c3ca566442 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/utils/serializer/ClassSerializationUtil.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/ClassSerializationUtil.kt @@ -14,12 +14,12 @@ * limitations under the License. */ -package org.jetbrains.kotlin.utils.serializer +package org.jetbrains.kotlin.serialization.js import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.serialization.ProtoBuf -import org.jetbrains.kotlin.serialization.DescriptorSerializer import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.serialization.DescriptorSerializer +import org.jetbrains.kotlin.serialization.ProtoBuf public object ClassSerializationUtil { public trait Sink { 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 e8a027611fa..6ff95916aa1 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 @@ -17,12 +17,23 @@ package org.jetbrains.kotlin.serialization.js import com.google.protobuf.ByteString +import org.jetbrains.kotlin.builtins.BuiltInsSerializationUtil import org.jetbrains.kotlin.builtins.BuiltinsPackageFragment +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentProvider import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.descriptorUtil.classId +import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter +import org.jetbrains.kotlin.serialization.DescriptorSerializer +import org.jetbrains.kotlin.serialization.ProtoBuf +import org.jetbrains.kotlin.serialization.SerializationUtil +import org.jetbrains.kotlin.serialization.builtins.BuiltInsSerializerExtension import org.jetbrains.kotlin.serialization.deserialization.FlexibleTypeCapabilitiesDeserializer import org.jetbrains.kotlin.storage.LockBasedStorageManager +import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.util.zip.GZIPInputStream @@ -73,6 +84,54 @@ public object KotlinJavascriptSerializationUtil { return byteStream.toByteArray() } + public fun metadataAsString(moduleName: String, moduleDescriptor: ModuleDescriptor): String { + val contentMap = hashMapOf() + + DescriptorUtils.getPackagesFqNames(moduleDescriptor).forEach { + fqName -> + serializePackage(moduleDescriptor, fqName) { + fileName, stream -> + contentMap[fileName] = stream.toByteArray() + } + } + + val content = KotlinJavascriptSerializationUtil.contentMapToByteArray(contentMap) + return KotlinJavascriptMetadataUtils.formatMetadataAsString(moduleName, content) + } + + fun serializePackage(module: ModuleDescriptor, fqName: FqName, writeFun: (String, ByteArrayOutputStream) -> Unit) { + val packageView = module.getPackage(fqName) ?: error("No package resolved in $module") + + val skip: (DeclarationDescriptor) -> Boolean = { DescriptorUtils.getContainingModule(it) != module } + + val serializer = DescriptorSerializer.createTopLevel(BuiltInsSerializerExtension) + + val classifierDescriptors = DescriptorSerializer.sort(packageView.getMemberScope().getDescriptors(DescriptorKindFilter.CLASSIFIERS)) + + ClassSerializationUtil.serializeClasses(classifierDescriptors, serializer, object : ClassSerializationUtil.Sink { + override fun writeClass(classDescriptor: ClassDescriptor, classProto: ProtoBuf.Class) { + val stream = ByteArrayOutputStream() + classProto.writeTo(stream) + writeFun(getFileName(classDescriptor), stream) + } + }, skip) + + val packageStream = ByteArrayOutputStream() + 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) + + val nameStream = ByteArrayOutputStream() + val strings = serializer.getStringTable() + SerializationUtil.serializeStringTable(nameStream, strings.serializeSimpleNames(), strings.serializeQualifiedNames()) + writeFun(BuiltInsSerializationUtil.getStringTableFilePath(fqName), nameStream) + } + + fun getFileName(classDescriptor: ClassDescriptor): String { + return BuiltInsSerializationUtil.getClassMetadataPath(classDescriptor.classId) + } + private fun getPackages(contentMap: Map): List = contentMap.keySet().filter { it.endsWith(PACKAGE_FILE_SUFFIX) } map { it.substring(0, it.length() - PACKAGE_FILE_SUFFIX.length()).replace('/', '.') } } \ No newline at end of file diff --git a/js/js.serializer/src/org/jetbrains/kotlin/utils/serializer/KotlinJavaScriptSerializer.kt b/js/js.serializer/src/org/jetbrains/kotlin/utils/serializer/KotlinJavaScriptSerializer.kt deleted file mode 100644 index 0da4f38cd9d..00000000000 --- a/js/js.serializer/src/org/jetbrains/kotlin/utils/serializer/KotlinJavaScriptSerializer.kt +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.utils.serializer - -import com.intellij.openapi.util.io.FileUtil -import org.jetbrains.kotlin.builtins.BuiltInsSerializationUtil -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.resolve.descriptorUtil.classId -import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter -import org.jetbrains.kotlin.serialization.DescriptorSerializer -import org.jetbrains.kotlin.serialization.ProtoBuf -import org.jetbrains.kotlin.serialization.SerializationUtil -import org.jetbrains.kotlin.serialization.builtins.BuiltInsSerializerExtension -import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil -import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils -import java.io.ByteArrayOutputStream -import java.io.File - -public class KotlinJavaScriptSerializer() { - - public fun serialize(moduleName: String, moduleDescriptor: ModuleDescriptor, metaFile: File) { - FileUtil.writeToFile(metaFile, serializeToString(moduleName, moduleDescriptor)) - } - - public fun serializeToString(moduleName: String, moduleDescriptor: ModuleDescriptor): String { - val contentMap = hashMapOf() - - DescriptorUtils.getPackagesFqNames(moduleDescriptor).forEach { - fqName -> - serializePackage(moduleDescriptor, fqName) { - fileName, stream -> - contentMap[fileName] = stream.toByteArray() - } - } - - val content = KotlinJavascriptSerializationUtil.contentMapToByteArray(contentMap) - return KotlinJavascriptMetadataUtils.writeMetadataToString(moduleName, content) - } - - fun serializePackage(module: ModuleDescriptor, fqName: FqName, writeFun: (String, ByteArrayOutputStream) -> Unit) { - val packageView = module.getPackage(fqName) ?: error("No package resolved in $module") - - val skip: (DeclarationDescriptor) -> Boolean = { DescriptorUtils.getContainingModule(it) != module} - - val serializer = DescriptorSerializer.createTopLevel(BuiltInsSerializerExtension) - - val classifierDescriptors = DescriptorSerializer.sort(packageView.getMemberScope().getDescriptors(DescriptorKindFilter.CLASSIFIERS)) - - ClassSerializationUtil.serializeClasses(classifierDescriptors, serializer, object : ClassSerializationUtil.Sink { - override fun writeClass(classDescriptor: ClassDescriptor, classProto: ProtoBuf.Class) { - val stream = ByteArrayOutputStream() - classProto.writeTo(stream) - writeFun(getFileName(classDescriptor), stream) - } - }, skip) - - val packageStream = ByteArrayOutputStream() - 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) - - val nameStream = ByteArrayOutputStream() - val strings = serializer.getStringTable() - SerializationUtil.serializeStringTable(nameStream, strings.serializeSimpleNames(), strings.serializeQualifiedNames()) - writeFun(BuiltInsSerializationUtil.getStringTableFilePath(fqName), nameStream) - } - - fun getFileName(classDescriptor: ClassDescriptor): String { - return BuiltInsSerializationUtil.getClassMetadataPath(classDescriptor.classId) - } -} \ No newline at end of file diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/facade/TranslationResult.kt b/js/js.translator/src/org/jetbrains/kotlin/js/facade/TranslationResult.kt index b273c576a10..eee7f066edf 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/facade/TranslationResult.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/facade/TranslationResult.kt @@ -31,8 +31,8 @@ import org.jetbrains.kotlin.js.sourceMap.SourceMap3Builder import org.jetbrains.kotlin.js.sourceMap.SourceMapBuilder import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics +import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil import org.jetbrains.kotlin.utils.fileUtils.readTextOrEmpty -import org.jetbrains.kotlin.utils.serializer.KotlinJavaScriptSerializer import java.io.File import java.util.ArrayList @@ -73,7 +73,7 @@ public abstract class TranslationResult protected (public val diagnostics: Diagn config.getMetaInfo()?.let { val metaFile = File(it) - val metaFileContent = KotlinJavaScriptSerializer.metadataAsString(config.getModuleId(), moduleDescriptor) + val metaFileContent = KotlinJavascriptSerializationUtil.metadataAsString(config.getModuleId(), moduleDescriptor) val sourceFilesForMetaFile = ArrayList(sourceFiles) val jsMetaFile = SimpleOutputFile(sourceFilesForMetaFile, metaFile.getName(), metaFileContent) outputFiles.add(jsMetaFile)