Add internal compiler argument to change metadata version

Will be used in tests to check how we behave on binaries produced by a
"future" compiler
This commit is contained in:
Alexander Udalov
2018-07-17 19:59:09 +02:00
parent cfc0f5e453
commit 871b896a21
29 changed files with 210 additions and 133 deletions
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
import org.jetbrains.kotlin.metadata.js.JsProtoBuf
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.protobuf.CodedInputStream
@@ -70,26 +71,32 @@ object KotlinJavascriptSerializationUtil {
fun serializeMetadata(
bindingContext: BindingContext,
jsDescriptor: JsModuleDescriptor<ModuleDescriptor>,
languageVersionSettings: LanguageVersionSettings
languageVersionSettings: LanguageVersionSettings,
metadataVersion: JsMetadataVersion
): SerializedMetadata {
val serializedFragments = HashMap<FqName, ProtoBuf.PackageFragment>()
val module = jsDescriptor.data
for (fqName in getPackagesFqNames(module).sortedBy { it.asString() }) {
val fragment = serializePackageFragment(bindingContext, module, fqName, languageVersionSettings)
val fragment = serializeDescriptors(
bindingContext, module,
module.getPackage(fqName).memberScope.getContributedDescriptors(),
fqName, languageVersionSettings, metadataVersion
)
if (!fragment.isEmpty()) {
serializedFragments[fqName] = fragment
}
}
return SerializedMetadata(serializedFragments, jsDescriptor, languageVersionSettings)
return SerializedMetadata(serializedFragments, jsDescriptor, languageVersionSettings, metadataVersion)
}
class SerializedMetadata(
private val serializedFragments: Map<FqName, ProtoBuf.PackageFragment>,
private val jsDescriptor: JsModuleDescriptor<ModuleDescriptor>,
private val languageVersionSettings: LanguageVersionSettings
private val languageVersionSettings: LanguageVersionSettings,
private val metadataVersion: JsMetadataVersion
) {
class SerializedPackage(val fqName: FqName, val bytes: ByteArray)
@@ -99,7 +106,7 @@ object KotlinJavascriptSerializationUtil {
for ((fqName, part) in serializedFragments) {
val stream = ByteArrayOutputStream()
with(DataOutputStream(stream)) {
val version = JsMetadataVersion.INSTANCE.toArray()
val version = metadataVersion.toArray()
writeInt(version.size)
version.forEach(this::writeInt)
}
@@ -114,7 +121,7 @@ object KotlinJavascriptSerializationUtil {
}
fun asString(): String =
KotlinJavascriptMetadataUtils.formatMetadataAsString(jsDescriptor.name, asByteArray())
KotlinJavascriptMetadataUtils.formatMetadataAsString(jsDescriptor.name, asByteArray(), metadataVersion)
private fun asByteArray(): ByteArray =
ByteArrayOutputStream().apply {
@@ -153,28 +160,13 @@ object KotlinJavascriptSerializationUtil {
}
}
private fun serializePackageFragment(
bindingContext: BindingContext,
module: ModuleDescriptor,
fqName: FqName,
languageVersionSettings: LanguageVersionSettings
): ProtoBuf.PackageFragment {
val packageView = module.getPackage(fqName)
return serializeDescriptors(
bindingContext,
module,
packageView.memberScope.getContributedDescriptors(),
fqName,
languageVersionSettings
)
}
fun serializeDescriptors(
bindingContext: BindingContext,
module: ModuleDescriptor,
scope: Collection<DeclarationDescriptor>,
fqName: FqName,
languageVersionSettings: LanguageVersionSettings
languageVersionSettings: LanguageVersionSettings,
metadataVersion: BinaryVersion
): ProtoBuf.PackageFragment {
val builder = ProtoBuf.PackageFragment.newBuilder()
@@ -190,7 +182,7 @@ object KotlinJavascriptSerializationUtil {
}
val fileRegistry = KotlinFileRegistry()
val extension = KotlinJavascriptSerializerExtension(fileRegistry, languageVersionSettings)
val extension = KotlinJavascriptSerializerExtension(fileRegistry, languageVersionSettings, metadataVersion)
val classDescriptors = scope.filterIsInstance<ClassDescriptor>().sortedBy { it.fqNameSafe.asString() }
@@ -28,15 +28,12 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.source.PsiSourceFile
import org.jetbrains.kotlin.serialization.KotlinSerializerExtensionBase
import org.jetbrains.kotlin.types.FlexibleType
import org.jetbrains.kotlin.utils.JsMetadataVersion
class KotlinJavascriptSerializerExtension(
private val fileRegistry: KotlinFileRegistry,
private val languageVersionSettings: LanguageVersionSettings
) : KotlinSerializerExtensionBase(JsSerializerProtocol) {
private val languageVersionSettings: LanguageVersionSettings,
override val metadataVersion: BinaryVersion
get() = JsMetadataVersion.INSTANCE
) : KotlinSerializerExtensionBase(JsSerializerProtocol) {
override val stringTable = JavaScriptStringTable()
override fun serializeFlexibleType(flexibleType: FlexibleType, lowerProto: ProtoBuf.Type.Builder, upperProto: ProtoBuf.Type.Builder) {
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.js.facade;
import com.intellij.openapi.vfs.VfsUtilCore;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.config.CommonConfigurationKeys;
import org.jetbrains.kotlin.config.CommonConfigurationKeysKt;
import org.jetbrains.kotlin.config.LanguageVersionSettings;
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
@@ -42,12 +43,14 @@ import org.jetbrains.kotlin.js.translate.general.AstGenerationResult;
import org.jetbrains.kotlin.js.translate.general.Translation;
import org.jetbrains.kotlin.js.translate.utils.ExpandIsCallsKt;
import org.jetbrains.kotlin.metadata.ProtoBuf;
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion;
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus;
import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.resolve.BindingTrace;
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics;
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil;
import org.jetbrains.kotlin.serialization.js.ast.JsAstSerializer;
import org.jetbrains.kotlin.utils.JsMetadataVersion;
import java.io.ByteArrayOutputStream;
import java.io.File;
@@ -176,9 +179,12 @@ public final class K2JSTranslator {
List<DeclarationDescriptor> scope = translationResult.getFileMemberScopes().get(file);
assert scope != null : "Could not find descriptors for file: " + file;
BinaryVersion metadataVersion = config.getConfiguration().get(CommonConfigurationKeys.METADATA_VERSION);
ProtoBuf.PackageFragment packagePart = serializationUtil.serializeDescriptors(
bindingTrace.getBindingContext(), moduleDescriptor, scope, file.getPackageFqName(),
CommonConfigurationKeysKt.getLanguageVersionSettings(config.getConfiguration()));
CommonConfigurationKeysKt.getLanguageVersionSettings(config.getConfiguration()),
metadataVersion != null ? metadataVersion : JsMetadataVersion.INSTANCE
);
File ioFile = VfsUtilCore.virtualToIoFile(file.getVirtualFile());
incrementalResults.processPackagePart(ioFile, packagePart.toByteArray(), binaryAst);
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.js.facade
import com.intellij.openapi.util.text.StringUtil
import com.intellij.openapi.vfs.VfsUtilCore
import org.jetbrains.kotlin.backend.common.output.*
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.js.backend.JsToStringGenerationVisitor
@@ -39,6 +40,7 @@ import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
import org.jetbrains.kotlin.serialization.js.JsModuleDescriptor
import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil
import org.jetbrains.kotlin.utils.JsMetadataVersion
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils
import java.io.File
import java.util.*
@@ -109,16 +111,18 @@ abstract class TranslationResult protected constructor(val diagnostics: Diagnost
kind = config.moduleKind,
imported = importedModules
)
val settings = config.configuration.languageVersionSettings
val serializedMetadata = KotlinJavascriptSerializationUtil.serializeMetadata(bindingContext, moduleDescription, settings)
val serializedMetadata = KotlinJavascriptSerializationUtil.serializeMetadata(
bindingContext, moduleDescription,
config.configuration.languageVersionSettings,
config.configuration.get(CommonConfigurationKeys.METADATA_VERSION) as? JsMetadataVersion ?: JsMetadataVersion.INSTANCE
)
val metaFileContent = serializedMetadata.asString()
val sourceFilesForMetaFile = ArrayList(sourceFiles)
val jsMetaFile = SimpleOutputFile(sourceFilesForMetaFile, metaFileName, metaFileContent)
outputFiles.add(jsMetaFile)
for (serializedPackage in serializedMetadata.serializedPackages()) {
val outputBinaryFile = kjsmFileForPackage(serializedPackage.fqName, serializedPackage.bytes)
outputFiles.add(outputBinaryFile)
outputFiles.add(kjsmFileForPackage(serializedPackage.fqName, serializedPackage.bytes))
}
}