add new module js.serializer
This commit is contained in:
Generated
+1
@@ -38,6 +38,7 @@
|
|||||||
<module fileurl="file://$PROJECT_DIR$/js/js.frontend/js.frontend.iml" filepath="$PROJECT_DIR$/js/js.frontend/js.frontend.iml" group="compiler/js" />
|
<module fileurl="file://$PROJECT_DIR$/js/js.frontend/js.frontend.iml" filepath="$PROJECT_DIR$/js/js.frontend/js.frontend.iml" group="compiler/js" />
|
||||||
<module fileurl="file://$PROJECT_DIR$/js/js.inliner/js.inliner.iml" filepath="$PROJECT_DIR$/js/js.inliner/js.inliner.iml" group="compiler/js" />
|
<module fileurl="file://$PROJECT_DIR$/js/js.inliner/js.inliner.iml" filepath="$PROJECT_DIR$/js/js.inliner/js.inliner.iml" group="compiler/js" />
|
||||||
<module fileurl="file://$PROJECT_DIR$/js/js.parser/js.parser.iml" filepath="$PROJECT_DIR$/js/js.parser/js.parser.iml" group="compiler/js" />
|
<module fileurl="file://$PROJECT_DIR$/js/js.parser/js.parser.iml" filepath="$PROJECT_DIR$/js/js.parser/js.parser.iml" group="compiler/js" />
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/js/js.serializer/js.serializer.iml" filepath="$PROJECT_DIR$/js/js.serializer/js.serializer.iml" group="compiler/js" />
|
||||||
<module fileurl="file://$PROJECT_DIR$/js/js.tests/js.tests.iml" filepath="$PROJECT_DIR$/js/js.tests/js.tests.iml" group="compiler/js" />
|
<module fileurl="file://$PROJECT_DIR$/js/js.tests/js.tests.iml" filepath="$PROJECT_DIR$/js/js.tests/js.tests.iml" group="compiler/js" />
|
||||||
<module fileurl="file://$PROJECT_DIR$/js/js.translator/js.translator.iml" filepath="$PROJECT_DIR$/js/js.translator/js.translator.iml" group="compiler/js" />
|
<module fileurl="file://$PROJECT_DIR$/js/js.translator/js.translator.iml" filepath="$PROJECT_DIR$/js/js.translator/js.translator.iml" group="compiler/js" />
|
||||||
<module fileurl="file://$PROJECT_DIR$/jps-plugin/kannotator-jps-plugin-test/kannotator-jps-plugin-test.iml" filepath="$PROJECT_DIR$/jps-plugin/kannotator-jps-plugin-test/kannotator-jps-plugin-test.iml" group="ide/jps" />
|
<module fileurl="file://$PROJECT_DIR$/jps-plugin/kannotator-jps-plugin-test/kannotator-jps-plugin-test.iml" filepath="$PROJECT_DIR$/jps-plugin/kannotator-jps-plugin-test/kannotator-jps-plugin-test.iml" group="ide/jps" />
|
||||||
|
|||||||
@@ -117,6 +117,7 @@
|
|||||||
<include name="js/js.frontend/src"/>
|
<include name="js/js.frontend/src"/>
|
||||||
<include name="js/js.inliner/src"/>
|
<include name="js/js.inliner/src"/>
|
||||||
<include name="js/js.parser/src"/>
|
<include name="js/js.parser/src"/>
|
||||||
|
<include name="js/js.serializer/src"/>
|
||||||
</dirset>
|
</dirset>
|
||||||
|
|
||||||
<property name="idea.out" value="${basedir}/out/production"/>
|
<property name="idea.out" value="${basedir}/out/production"/>
|
||||||
@@ -142,6 +143,7 @@
|
|||||||
<include name="js.frontend/**"/>
|
<include name="js.frontend/**"/>
|
||||||
<include name="js.inliner/**"/>
|
<include name="js.inliner/**"/>
|
||||||
<include name="js.parser/**"/>
|
<include name="js.parser/**"/>
|
||||||
|
<include name="js.serializer/**"/>
|
||||||
</patternset>
|
</patternset>
|
||||||
|
|
||||||
<path id="compilerSources.path">
|
<path id="compilerSources.path">
|
||||||
@@ -210,6 +212,7 @@
|
|||||||
<fileset dir="js/js.frontend/src"/>
|
<fileset dir="js/js.frontend/src"/>
|
||||||
<fileset dir="js/js.inliner/src"/>
|
<fileset dir="js/js.inliner/src"/>
|
||||||
<fileset dir="js/js.parser/src"/>
|
<fileset dir="js/js.parser/src"/>
|
||||||
|
<fileset dir="js/js.serializer/src"/>
|
||||||
<zipfileset file="${kotlin-home}/build.txt" prefix="META-INF"/>
|
<zipfileset file="${kotlin-home}/build.txt" prefix="META-INF"/>
|
||||||
|
|
||||||
<manifest>
|
<manifest>
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="JAVA_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/../../compiler/serializer/tests" isTestSource="true" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
<orderEntry type="module" module-name="serialization" />
|
||||||
|
<orderEntry type="module" module-name="serialization.js" />
|
||||||
|
<orderEntry type="module" module-name="util" />
|
||||||
|
<orderEntry type="library" name="intellij-core" level="project" />
|
||||||
|
<orderEntry type="module" module-name="frontend" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* 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 org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
|
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||||
|
import org.jetbrains.kotlin.serialization.DescriptorSerializer
|
||||||
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
|
|
||||||
|
public object ClassSerializationUtil {
|
||||||
|
public trait Sink {
|
||||||
|
fun writeClass(classDescriptor: ClassDescriptor, classProto: ProtoBuf.Class)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun serializeClass(classDescriptor: ClassDescriptor, serializer: DescriptorSerializer, sink: Sink, skip: (DeclarationDescriptor) -> Boolean) {
|
||||||
|
if (skip(classDescriptor)) return
|
||||||
|
|
||||||
|
val classProto = serializer.classProto(classDescriptor).build() ?: error("Class not serialized: $classDescriptor")
|
||||||
|
sink.writeClass(classDescriptor, classProto)
|
||||||
|
|
||||||
|
serializeClasses(classDescriptor.getUnsubstitutedInnerClassesScope().getDescriptors(), serializer, sink, skip)
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun serializeClasses(descriptors: Collection<DeclarationDescriptor>, serializer: DescriptorSerializer, sink: Sink, skip: (DeclarationDescriptor) -> Boolean) {
|
||||||
|
for (descriptor in descriptors) {
|
||||||
|
if (descriptor is ClassDescriptor) {
|
||||||
|
serializeClass(descriptor, serializer, sink, skip)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+85
@@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* 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 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.NameSerializationUtil
|
||||||
|
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||||
|
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) {
|
||||||
|
val contentMap = hashMapOf<String, ByteArray>()
|
||||||
|
|
||||||
|
DescriptorUtils.getPackagesFqNames(moduleDescriptor).forEach {
|
||||||
|
fqName -> serializePackage(moduleDescriptor, fqName) {
|
||||||
|
(fileName, stream) -> contentMap[fileName] = stream.toByteArray()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val content = KotlinJavascriptSerializationUtil.contentMapToByteArray(contentMap)
|
||||||
|
KotlinJavascriptMetadataUtils.writeMetadata(moduleName, content, metaFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun serializePackage(module: ModuleDescriptor, fqName: FqName, writeFun: (String, ByteArrayOutputStream) -> Unit) {
|
||||||
|
val packageView = module.getPackage(fqName) ?: error("No package resolved in $module")
|
||||||
|
|
||||||
|
// TODO: perform some kind of validation? At the moment not possible because DescriptorValidator is in compiler-tests
|
||||||
|
// DescriptorValidator.validate(packageView)
|
||||||
|
|
||||||
|
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()
|
||||||
|
NameSerializationUtil.serializeStringTable(nameStream, serializer.getStringTable())
|
||||||
|
writeFun(BuiltInsSerializationUtil.getStringTableFilePath(fqName), nameStream)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getFileName(classDescriptor: ClassDescriptor): String {
|
||||||
|
return BuiltInsSerializationUtil.getClassMetadataPath(classDescriptor.classId)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user