Extract interface out of StringTable

Rework SerializerExtension interface: don't pass StringTable to each method
every time, create it in each extension's constructor instead and expose to
DescriptorSerializer with an interface method
This commit is contained in:
Alexander Udalov
2015-09-16 22:32:32 +03:00
parent e749bc262d
commit da68c4d9ee
10 changed files with 268 additions and 275 deletions
@@ -24,7 +24,7 @@ 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.StringTable
import org.jetbrains.kotlin.serialization.StringTableImpl
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadata
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils
@@ -49,9 +49,9 @@ public object KotlinJavascriptSerializationUtil {
}
private val STRING_TABLE_DEFAULT_BYTES = run {
val serializer = DescriptorSerializer.createTopLevel(KotlinJavascriptSerializerExtension)
val serializer = DescriptorSerializer.createTopLevel(KotlinJavascriptSerializerExtension())
val stream = ByteArrayOutputStream()
serializer.serializeStringTable(stream)
serializer.stringTable.serializeTo(stream)
stream.toByteArray()
}
@@ -103,7 +103,8 @@ public object KotlinJavascriptSerializationUtil {
val skip: (DeclarationDescriptor) -> Boolean = { DescriptorUtils.getContainingModule(it) != module }
val serializer = DescriptorSerializer.createTopLevel(KotlinJavascriptSerializerExtension)
val serializerExtension = KotlinJavascriptSerializerExtension()
val serializer = DescriptorSerializer.createTopLevel(serializerExtension)
val classifierDescriptors = DescriptorSerializer.sort(packageView.memberScope.getDescriptors(DescriptorKindFilter.CLASSIFIERS))
@@ -123,11 +124,11 @@ public object KotlinJavascriptSerializationUtil {
writeFun(KotlinJavascriptSerializedResourcePaths.getPackageFilePath(fqName), packageStream.toByteArray())
}
val strings = serializer.stringTable
val strings = serializerExtension.stringTable
serializeClassNamesInPackage(fqName, fragments, strings, skip, writeFun)
val nameStream = ByteArrayOutputStream()
serializer.serializeStringTable(nameStream)
strings.serializeTo(nameStream)
val stringBytes = nameStream.toByteArray()
if (!stringBytes.isEmpty()) {
@@ -138,7 +139,7 @@ public object KotlinJavascriptSerializationUtil {
private fun serializeClassNamesInPackage(
fqName: FqName,
packageFragments: Collection<PackageFragmentDescriptor>,
stringTable: StringTable,
stringTable: StringTableImpl,
skip: (DeclarationDescriptor) -> Boolean,
writeFun: (String, ByteArray) -> Unit
) {
@@ -24,48 +24,41 @@ import org.jetbrains.kotlin.resolve.constants.NullValue
import org.jetbrains.kotlin.serialization.AnnotationSerializer
import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.SerializerExtension
import org.jetbrains.kotlin.serialization.StringTable
import org.jetbrains.kotlin.serialization.StringTableImpl
import org.jetbrains.kotlin.types.JetType
public object KotlinJavascriptSerializerExtension : SerializerExtension() {
public class KotlinJavascriptSerializerExtension : SerializerExtension() {
private val stringTable = StringTableImpl(this)
private val annotationSerializer = AnnotationSerializer(stringTable)
private val annotationSerializer = AnnotationSerializer()
override fun getStringTable() = stringTable
override fun serializeClass(descriptor: ClassDescriptor, proto: ProtoBuf.Class.Builder, stringTable: StringTable) {
for (annotation in descriptor.getAnnotations()) {
proto.addExtension(JsProtoBuf.classAnnotation, annotationSerializer.serializeAnnotation(annotation, stringTable))
override fun serializeClass(descriptor: ClassDescriptor, proto: ProtoBuf.Class.Builder) {
for (annotation in descriptor.annotations) {
proto.addExtension(JsProtoBuf.classAnnotation, annotationSerializer.serializeAnnotation(annotation))
}
}
override fun serializeCallable(
callable: CallableMemberDescriptor,
proto: ProtoBuf.Callable.Builder,
stringTable: StringTable
) {
for (annotation in callable.getAnnotations()) {
proto.addExtension(JsProtoBuf.callableAnnotation, annotationSerializer.serializeAnnotation(annotation, stringTable))
override fun serializeCallable(callable: CallableMemberDescriptor, proto: ProtoBuf.Callable.Builder) {
for (annotation in callable.annotations) {
proto.addExtension(JsProtoBuf.callableAnnotation, annotationSerializer.serializeAnnotation(annotation))
}
val propertyDescriptor = callable as? PropertyDescriptor ?: return
val constantInitializer = propertyDescriptor.getCompileTimeInitializer()
val constantInitializer = propertyDescriptor.compileTimeInitializer
if (constantInitializer != null && constantInitializer !is NullValue) {
val type = constantInitializer.type
proto.setExtension(JsProtoBuf.compileTimeValue, annotationSerializer.valueProto(constantInitializer, type, stringTable).build())
proto.setExtension(JsProtoBuf.compileTimeValue, annotationSerializer.valueProto(constantInitializer).build())
}
}
override fun serializeValueParameter(
descriptor: ValueParameterDescriptor,
proto: ProtoBuf.Callable.ValueParameter.Builder,
stringTable: StringTable
) {
for (annotation in descriptor.getAnnotations()) {
proto.addExtension(JsProtoBuf.parameterAnnotation, annotationSerializer.serializeAnnotation(annotation, stringTable))
override fun serializeValueParameter(descriptor: ValueParameterDescriptor, proto: ProtoBuf.Callable.ValueParameter.Builder) {
for (annotation in descriptor.annotations) {
proto.addExtension(JsProtoBuf.parameterAnnotation, annotationSerializer.serializeAnnotation(annotation))
}
}
override fun serializeType(type: JetType, proto: ProtoBuf.Type.Builder, stringTable: StringTable) {
for (annotation in type.getAnnotations()) {
proto.addExtension(JsProtoBuf.typeAnnotation, annotationSerializer.serializeAnnotation(annotation, stringTable))
override fun serializeType(type: JetType, proto: ProtoBuf.Type.Builder) {
for (annotation in type.annotations) {
proto.addExtension(JsProtoBuf.typeAnnotation, annotationSerializer.serializeAnnotation(annotation))
}
}
}