JS: merge KotlinJavascriptSerializer into KotlinJavascriptSerializationUtil
This commit is contained in:
+1
-3
@@ -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)
|
||||
|
||||
@@ -30,6 +30,7 @@ public object KotlinJavascriptMetadataUtils {
|
||||
private val LOG = Logger.getInstance(javaClass<KotlinJavascriptMetadataUtils>())
|
||||
|
||||
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
|
||||
|
||||
+3
-3
@@ -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 {
|
||||
+59
@@ -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<String, ByteArray>()
|
||||
|
||||
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<String, ByteArray>): List<String> =
|
||||
contentMap.keySet().filter { it.endsWith(PACKAGE_FILE_SUFFIX) } map { it.substring(0, it.length() - PACKAGE_FILE_SUFFIX.length()).replace('/', '.') }
|
||||
}
|
||||
-90
@@ -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<String, ByteArray>()
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
||||
@@ -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<File>(sourceFiles)
|
||||
val jsMetaFile = SimpleOutputFile(sourceFilesForMetaFile, metaFile.getName(), metaFileContent)
|
||||
outputFiles.add(jsMetaFile)
|
||||
|
||||
Reference in New Issue
Block a user