diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 28ddc21527a..1c2148177d2 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -62,6 +62,8 @@ import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature; import org.jetbrains.kotlin.serialization.ClassData; import org.jetbrains.kotlin.serialization.DescriptorSerializer; import org.jetbrains.kotlin.serialization.ProtoBuf; +import org.jetbrains.kotlin.serialization.StringTable; +import org.jetbrains.kotlin.serialization.deserialization.NameResolver; import org.jetbrains.kotlin.serialization.jvm.BitEncoding; import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.checker.JetTypeChecker; @@ -81,7 +83,6 @@ import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilPackage. import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.*; import static org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage.*; import static org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin.NO_ORIGIN; -import static org.jetbrains.kotlin.serialization.NameSerializationUtil.createNameResolver; import static org.jetbrains.kotlin.types.Variance.INVARIANT; import static org.jetbrains.org.objectweb.asm.Opcodes.*; @@ -240,7 +241,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ProtoBuf.Class classProto = serializer.classProto(descriptor).build(); - ClassData data = new ClassData(createNameResolver(serializer.getStringTable()), classProto); + StringTable strings = serializer.getStringTable(); + NameResolver nameResolver = new NameResolver(strings.serializeSimpleNames(), strings.serializeQualifiedNames()); + ClassData data = new ClassData(nameResolver, classProto); AnnotationVisitor av = v.getVisitor().visitAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_CLASS), true); av.visit(JvmAnnotationNames.ABI_VERSION_FIELD_NAME, JvmAbi.VERSION); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegen.java index eac2cd880fb..c77078bb3dd 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegen.java @@ -52,6 +52,8 @@ import org.jetbrains.kotlin.resolve.scopes.JetScope; import org.jetbrains.kotlin.serialization.DescriptorSerializer; import org.jetbrains.kotlin.serialization.PackageData; import org.jetbrains.kotlin.serialization.ProtoBuf; +import org.jetbrains.kotlin.serialization.StringTable; +import org.jetbrains.kotlin.serialization.deserialization.NameResolver; import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor; import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor; import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedSimpleFunctionDescriptor; @@ -71,7 +73,6 @@ import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.K_PACKAGE_TYPE; import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.getType; import static org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage.*; import static org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin.NO_ORIGIN; -import static org.jetbrains.kotlin.serialization.NameSerializationUtil.createNameResolver; import static org.jetbrains.org.objectweb.asm.Opcodes.*; public class PackageCodegen { @@ -278,7 +279,9 @@ public class PackageCodegen { if (packageProto.getMemberCount() == 0) return; - PackageData data = new PackageData(createNameResolver(serializer.getStringTable()), packageProto); + StringTable strings = serializer.getStringTable(); + NameResolver nameResolver = new NameResolver(strings.serializeSimpleNames(), strings.serializeQualifiedNames()); + PackageData data = new PackageData(nameResolver, packageProto); AnnotationVisitor av = v.newAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_PACKAGE), true); av.visit(JvmAnnotationNames.ABI_VERSION_FIELD_NAME, JvmAbi.VERSION); diff --git a/compiler/builtins-serializer/src/BuiltInsSerializer.kt b/compiler/builtins-serializer/src/BuiltInsSerializer.kt index b1925d84d3c..6181ec25f36 100644 --- a/compiler/builtins-serializer/src/BuiltInsSerializer.kt +++ b/compiler/builtins-serializer/src/BuiltInsSerializer.kt @@ -16,34 +16,35 @@ package org.jetbrains.kotlin.serialization.builtins -import java.io.File -import com.intellij.openapi.util.Disposer -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.serialization.* -import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.name.Name -import java.io.ByteArrayOutputStream -import org.jetbrains.kotlin.builtins.BuiltInsSerializationUtil import com.intellij.openapi.Disposable -import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys -import org.jetbrains.kotlin.config.CommonConfigurationKeys -import org.jetbrains.kotlin.cli.common.messages.MessageCollector -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.utils.recursePostOrder +import com.intellij.openapi.util.Disposer import com.intellij.psi.search.GlobalSearchScope -import org.jetbrains.kotlin.resolve.jvm.JvmAnalyzerFacade -import org.jetbrains.kotlin.context.GlobalContext -import org.jetbrains.kotlin.analyzer.ModuleInfo -import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters import org.jetbrains.kotlin.analyzer.ModuleContent -import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter -import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles +import org.jetbrains.kotlin.analyzer.ModuleInfo +import org.jetbrains.kotlin.builtins.BuiltInsSerializationUtil +import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys +import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.jvm.JVMConfigurationKeys -import org.jetbrains.kotlin.resolve.constants.NullValue -import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.config.CommonConfigurationKeys +import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.context.GlobalContext +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.name.Name import org.jetbrains.kotlin.resolve.descriptorUtil.classId +import org.jetbrains.kotlin.resolve.jvm.JvmAnalyzerFacade +import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters +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.utils.recursePostOrder +import java.io.ByteArrayOutputStream +import java.io.File public class BuiltInsSerializer(private val dependOnOldBuiltIns: Boolean) { private var totalSize = 0 @@ -121,7 +122,7 @@ public class BuiltInsSerializer(private val dependOnOldBuiltIns: Boolean) { val classifierDescriptors = DescriptorSerializer.sort(packageView.getMemberScope().getDescriptors(DescriptorKindFilter.CLASSIFIERS)) serializeClasses(classifierDescriptors, serializer) { - (classDescriptor, classProto) -> + classDescriptor, classProto -> val stream = ByteArrayOutputStream() classProto.writeTo(stream) write(destDir, getFileName(classDescriptor), stream) @@ -134,7 +135,8 @@ public class BuiltInsSerializer(private val dependOnOldBuiltIns: Boolean) { write(destDir, BuiltInsSerializationUtil.getPackageFilePath(fqName), packageStream) val nameStream = ByteArrayOutputStream() - NameSerializationUtil.serializeStringTable(nameStream, serializer.getStringTable()) + val strings = serializer.getStringTable() + NameSerializationUtil.serializeStringTable(nameStream, strings.serializeSimpleNames(), strings.serializeQualifiedNames()) write(destDir, BuiltInsSerializationUtil.getStringTableFilePath(fqName), nameStream) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltinsPackageFragment.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltinsPackageFragment.kt index 9f67707baf3..40fee3e09b1 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltinsPackageFragment.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltinsPackageFragment.kt @@ -25,13 +25,9 @@ import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.serialization.ClassData -import org.jetbrains.kotlin.serialization.NameSerializationUtil import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.builtins.BuiltInsProtoBuf -import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder -import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents -import org.jetbrains.kotlin.serialization.deserialization.FlexibleTypeCapabilitiesDeserializer -import org.jetbrains.kotlin.serialization.deserialization.LocalClassResolverImpl +import org.jetbrains.kotlin.serialization.deserialization.* import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope import org.jetbrains.kotlin.storage.StorageManager import java.io.InputStream @@ -46,13 +42,13 @@ public class BuiltinsPackageFragment( private val extensionRegistry: ExtensionRegistryLite - ;{ + init { extensionRegistry = ExtensionRegistryLite.newInstance() BuiltInsProtoBuf.registerAllExtensions(extensionRegistry) extensionRegistry } - private val nameResolver = NameSerializationUtil.deserializeNameResolver( + private val nameResolver = NameResolver.read( getStream(BuiltInsSerializationUtil.getStringTableFilePath(fqName)) ) diff --git a/core/serialization/src/org/jetbrains/kotlin/serialization/ClassData.java b/core/serialization/src/org/jetbrains/kotlin/serialization/ClassData.java index e5175ebed0b..2f75faefd43 100644 --- a/core/serialization/src/org/jetbrains/kotlin/serialization/ClassData.java +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/ClassData.java @@ -30,7 +30,7 @@ public final class ClassData { public static ClassData read(@NotNull byte[] bytes, @NotNull ExtensionRegistryLite registry) { try { ByteArrayInputStream in = new ByteArrayInputStream(bytes); - NameResolver nameResolver = NameSerializationUtil.deserializeNameResolver(in); + NameResolver nameResolver = NameResolver.read(in); ProtoBuf.Class classProto = ProtoBuf.Class.parseFrom(in, registry); return new ClassData(nameResolver, classProto); } @@ -40,7 +40,6 @@ public final class ClassData { } private final NameResolver nameResolver; - private final ProtoBuf.Class classProto; public ClassData(@NotNull NameResolver nameResolver, @NotNull ProtoBuf.Class classProto) { diff --git a/core/serialization/src/org/jetbrains/kotlin/serialization/NameSerializationUtil.java b/core/serialization/src/org/jetbrains/kotlin/serialization/NameSerializationUtil.java index 77a17aa5931..ce8a02799ef 100644 --- a/core/serialization/src/org/jetbrains/kotlin/serialization/NameSerializationUtil.java +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/NameSerializationUtil.java @@ -21,34 +21,17 @@ import org.jetbrains.kotlin.serialization.deserialization.NameResolver; import org.jetbrains.kotlin.utils.UtilsPackage; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; public class NameSerializationUtil { private NameSerializationUtil() { } - @NotNull - public static NameResolver deserializeNameResolver(@NotNull InputStream in) { - try { - ProtoBuf.StringTable simpleNames = ProtoBuf.StringTable.parseDelimitedFrom(in); - ProtoBuf.QualifiedNameTable qualifiedNames = ProtoBuf.QualifiedNameTable.parseDelimitedFrom(in); - return new NameResolver(simpleNames, qualifiedNames); - } - catch (IOException e) { - throw UtilsPackage.rethrow(e); - } - } - public static void serializeNameResolver(@NotNull OutputStream out, @NotNull NameResolver nameResolver) { serializeStringTable(out, nameResolver.getStringTable(), nameResolver.getQualifiedNameTable()); } - public static void serializeStringTable(@NotNull OutputStream out, @NotNull StringTable stringTable) { - serializeStringTable(out, toStringTable(stringTable), toQualifiedNameTable(stringTable)); - } - - private static void serializeStringTable( + public static void serializeStringTable( @NotNull OutputStream out, @NotNull ProtoBuf.StringTable stringTable, @NotNull ProtoBuf.QualifiedNameTable qualifiedNameTable @@ -61,27 +44,4 @@ public class NameSerializationUtil { throw UtilsPackage.rethrow(e); } } - - @NotNull - public static ProtoBuf.StringTable toStringTable(@NotNull StringTable stringTable) { - ProtoBuf.StringTable.Builder simpleNames = ProtoBuf.StringTable.newBuilder(); - for (String simpleName : stringTable.getStrings()) { - simpleNames.addString(simpleName); - } - return simpleNames.build(); - } - - @NotNull - public static ProtoBuf.QualifiedNameTable toQualifiedNameTable(@NotNull StringTable stringTable) { - ProtoBuf.QualifiedNameTable.Builder qualifiedNames = ProtoBuf.QualifiedNameTable.newBuilder(); - for (ProtoBuf.QualifiedNameTable.QualifiedName.Builder qName : stringTable.getFqNames()) { - qualifiedNames.addQualifiedName(qName); - } - return qualifiedNames.build(); - } - - @NotNull - public static NameResolver createNameResolver(@NotNull StringTable table) { - return new NameResolver(toStringTable(table), toQualifiedNameTable(table)); - } } diff --git a/core/serialization/src/org/jetbrains/kotlin/serialization/PackageData.java b/core/serialization/src/org/jetbrains/kotlin/serialization/PackageData.java index 3d56ab96b2a..fbceee39d3c 100644 --- a/core/serialization/src/org/jetbrains/kotlin/serialization/PackageData.java +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/PackageData.java @@ -30,7 +30,7 @@ public final class PackageData { public static PackageData read(@NotNull byte[] bytes, @NotNull ExtensionRegistryLite registry) { try { ByteArrayInputStream in = new ByteArrayInputStream(bytes); - NameResolver nameResolver = NameSerializationUtil.deserializeNameResolver(in); + NameResolver nameResolver = NameResolver.read(in); ProtoBuf.Package packageProto = ProtoBuf.Package.parseFrom(in, registry); return new PackageData(nameResolver, packageProto); } @@ -40,7 +40,6 @@ public final class PackageData { } private final NameResolver nameResolver; - private final ProtoBuf.Package packageProto; public PackageData(@NotNull NameResolver nameResolver, @NotNull ProtoBuf.Package packageProto) { diff --git a/core/serialization/src/org/jetbrains/kotlin/serialization/StringTable.java b/core/serialization/src/org/jetbrains/kotlin/serialization/StringTable.java index 6da0a05db48..0022a940cd7 100644 --- a/core/serialization/src/org/jetbrains/kotlin/serialization/StringTable.java +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/StringTable.java @@ -16,8 +16,6 @@ package org.jetbrains.kotlin.serialization; -import kotlin.Function1; -import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.ClassOrPackageFragmentDescriptor; @@ -26,8 +24,6 @@ import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; -import java.util.List; - import static org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.QualifiedName; public class StringTable { @@ -66,21 +62,6 @@ public class StringTable { this.extension = extension; } - @NotNull - public List getStrings() { - return strings.getAllInternedObjects(); - } - - @NotNull - public List getFqNames() { - return KotlinPackage.map(qualifiedNames.getAllInternedObjects(), new Function1() { - @Override - public QualifiedName.Builder invoke(FqNameProto proto) { - return proto.fqName; - } - }); - } - public int getSimpleNameIndex(@NotNull Name name) { return getStringIndex(name.asString()); } @@ -136,4 +117,22 @@ public class StringTable { } return result; } + + @NotNull + public ProtoBuf.StringTable serializeSimpleNames() { + ProtoBuf.StringTable.Builder builder = ProtoBuf.StringTable.newBuilder(); + for (String simpleName : strings.getAllInternedObjects()) { + builder.addString(simpleName); + } + return builder.build(); + } + + @NotNull + public ProtoBuf.QualifiedNameTable serializeQualifiedNames() { + ProtoBuf.QualifiedNameTable.Builder builder = ProtoBuf.QualifiedNameTable.newBuilder(); + for (FqNameProto fqName : qualifiedNames.getAllInternedObjects()) { + builder.addQualifiedName(fqName.fqName); + } + return builder.build(); + } } diff --git a/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/NameResolver.java b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/NameResolver.java index 2bd5aea0ce2..e81d1fd5a26 100644 --- a/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/NameResolver.java +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/NameResolver.java @@ -21,12 +21,27 @@ import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.serialization.ProtoBuf; +import org.jetbrains.kotlin.utils.UtilsPackage; +import java.io.IOException; +import java.io.InputStream; import java.util.LinkedList; import static org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.QualifiedName; public class NameResolver { + @NotNull + public static NameResolver read(@NotNull InputStream in) { + try { + ProtoBuf.StringTable simpleNames = ProtoBuf.StringTable.parseDelimitedFrom(in); + ProtoBuf.QualifiedNameTable qualifiedNames = ProtoBuf.QualifiedNameTable.parseDelimitedFrom(in); + return new NameResolver(simpleNames, qualifiedNames); + } + catch (IOException e) { + throw UtilsPackage.rethrow(e); + } + } + private final ProtoBuf.StringTable strings; private final ProtoBuf.QualifiedNameTable qualifiedNames; 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 index a696487876b..a0559d633e7 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/utils/serializer/KotlinJavaScriptSerializer.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/utils/serializer/KotlinJavaScriptSerializer.kt @@ -39,8 +39,10 @@ public class KotlinJavaScriptSerializer() { val contentMap = hashMapOf() DescriptorUtils.getPackagesFqNames(moduleDescriptor).forEach { - fqName -> serializePackage(moduleDescriptor, fqName) { - (fileName, stream) -> contentMap[fileName] = stream.toByteArray() + fqName -> + serializePackage(moduleDescriptor, fqName) { + fileName, stream -> + contentMap[fileName] = stream.toByteArray() } } @@ -51,9 +53,6 @@ public class KotlinJavaScriptSerializer() { 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) @@ -75,7 +74,8 @@ public class KotlinJavaScriptSerializer() { writeFun(BuiltInsSerializationUtil.getPackageFilePath(fqName), packageStream) val nameStream = ByteArrayOutputStream() - NameSerializationUtil.serializeStringTable(nameStream, serializer.getStringTable()) + val strings = serializer.getStringTable() + NameSerializationUtil.serializeStringTable(nameStream, strings.serializeSimpleNames(), strings.serializeQualifiedNames()) writeFun(BuiltInsSerializationUtil.getStringTableFilePath(fqName), nameStream) }