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:
+16
-24
@@ -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() }
|
||||
|
||||
|
||||
+2
-5
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user