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
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
import org.jetbrains.kotlin.config.KotlinCompilerVersion import org.jetbrains.kotlin.config.KotlinCompilerVersion
import org.jetbrains.kotlin.config.LanguageVersion import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.config.isPreRelease import org.jetbrains.kotlin.config.isPreRelease
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
import kotlin.reflect.KClass import kotlin.reflect.KClass
interface BuildMetaInfo { interface BuildMetaInfo {
@@ -40,7 +41,8 @@ abstract class BuildMetaInfoFactory<T : BuildMetaInfo>(private val metaInfoClass
multiplatformEnable: Boolean, multiplatformEnable: Boolean,
ownVersion: Int, ownVersion: Int,
coroutinesVersion: Int, coroutinesVersion: Int,
multiplatformVersion: Int multiplatformVersion: Int,
metadataVersionArray: IntArray?
): T ): T
fun create(args: CommonCompilerArguments): T { fun create(args: CommonCompilerArguments): T {
@@ -57,7 +59,8 @@ abstract class BuildMetaInfoFactory<T : BuildMetaInfo>(private val metaInfoClass
multiplatformEnable = args.multiPlatform, multiplatformEnable = args.multiPlatform,
ownVersion = OWN_VERSION, ownVersion = OWN_VERSION,
coroutinesVersion = COROUTINES_VERSION, coroutinesVersion = COROUTINES_VERSION,
multiplatformVersion = MULTIPLATFORM_VERSION multiplatformVersion = MULTIPLATFORM_VERSION,
metadataVersionArray = args.metadataVersion?.let((BinaryVersion)::parseVersionArray)
) )
} }
@@ -72,4 +75,4 @@ abstract class BuildMetaInfoFactory<T : BuildMetaInfo>(private val metaInfoClass
const val COROUTINES_VERSION: Int = 0 const val COROUTINES_VERSION: Int = 0
const val MULTIPLATFORM_VERSION: Int = 0 const val MULTIPLATFORM_VERSION: Int = 0
} }
} }
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.build package org.jetbrains.kotlin.build
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
import org.jetbrains.kotlin.utils.JsMetadataVersion
/** /**
* If you want to add a new field, check its type is supported by [serializeToPlainText], [deserializeFromPlainText] * If you want to add a new field, check its type is supported by [serializeToPlainText], [deserializeFromPlainText]
@@ -39,22 +38,26 @@ data class CommonBuildMetaInfo(
multiplatformEnable: Boolean, multiplatformEnable: Boolean,
ownVersion: Int, ownVersion: Int,
coroutinesVersion: Int, coroutinesVersion: Int,
multiplatformVersion: Int multiplatformVersion: Int,
) = CommonBuildMetaInfo( metadataVersionArray: IntArray?
isEAP = isEAP, ): CommonBuildMetaInfo {
compilerBuildVersion = compilerBuildVersion, val metadataVersion = metadataVersionArray?.let(::JvmMetadataVersion) ?: JvmMetadataVersion.INSTANCE
languageVersionString = languageVersionString, return CommonBuildMetaInfo(
apiVersionString = apiVersionString, isEAP = isEAP,
coroutinesEnable = coroutinesEnable, compilerBuildVersion = compilerBuildVersion,
coroutinesWarn = coroutinesWarn, languageVersionString = languageVersionString,
coroutinesError = coroutinesError, apiVersionString = apiVersionString,
multiplatformEnable = multiplatformEnable, coroutinesEnable = coroutinesEnable,
metadataVersionMajor = JvmMetadataVersion.INSTANCE.major, coroutinesWarn = coroutinesWarn,
metadataVersionMinor = JvmMetadataVersion.INSTANCE.minor, coroutinesError = coroutinesError,
metadataVersionPatch = JvmMetadataVersion.INSTANCE.patch, multiplatformEnable = multiplatformEnable,
ownVersion = ownVersion, metadataVersionMajor = metadataVersion.major,
coroutinesVersion = coroutinesVersion, metadataVersionMinor = metadataVersion.minor,
multiplatformVersion = multiplatformVersion metadataVersionPatch = metadataVersion.patch,
) ownVersion = ownVersion,
coroutinesVersion = coroutinesVersion,
multiplatformVersion = multiplatformVersion
)
}
} }
} }
@@ -38,22 +38,26 @@ data class JsBuildMetaInfo(
multiplatformEnable: Boolean, multiplatformEnable: Boolean,
ownVersion: Int, ownVersion: Int,
coroutinesVersion: Int, coroutinesVersion: Int,
multiplatformVersion: Int multiplatformVersion: Int,
) = JsBuildMetaInfo( metadataVersionArray: IntArray?
isEAP = isEAP, ): JsBuildMetaInfo {
compilerBuildVersion = compilerBuildVersion, val metadataVersion = metadataVersionArray?.let(::JsMetadataVersion) ?: JsMetadataVersion.INSTANCE
languageVersionString = languageVersionString, return JsBuildMetaInfo(
apiVersionString = apiVersionString, isEAP = isEAP,
coroutinesEnable = coroutinesEnable, compilerBuildVersion = compilerBuildVersion,
coroutinesWarn = coroutinesWarn, languageVersionString = languageVersionString,
coroutinesError = coroutinesError, apiVersionString = apiVersionString,
multiplatformEnable = multiplatformEnable, coroutinesEnable = coroutinesEnable,
metadataVersionMajor = JsMetadataVersion.INSTANCE.major, coroutinesWarn = coroutinesWarn,
metadataVersionMinor = JsMetadataVersion.INSTANCE.minor, coroutinesError = coroutinesError,
metadataVersionPatch = JsMetadataVersion.INSTANCE.patch, multiplatformEnable = multiplatformEnable,
ownVersion = ownVersion, metadataVersionMajor = metadataVersion.major,
coroutinesVersion = coroutinesVersion, metadataVersionMinor = metadataVersion.minor,
multiplatformVersion = multiplatformVersion metadataVersionPatch = metadataVersion.patch,
) ownVersion = ownVersion,
coroutinesVersion = coroutinesVersion,
multiplatformVersion = multiplatformVersion
)
}
} }
} }
@@ -53,25 +53,29 @@ data class JvmBuildMetaInfo(
multiplatformEnable: Boolean, multiplatformEnable: Boolean,
ownVersion: Int, ownVersion: Int,
coroutinesVersion: Int, coroutinesVersion: Int,
multiplatformVersion: Int multiplatformVersion: Int,
) = JvmBuildMetaInfo( metadataVersionArray: IntArray?
isEAP = isEAP, ): JvmBuildMetaInfo {
compilerBuildVersion = compilerBuildVersion, val metadataVersion = metadataVersionArray?.let(::JvmMetadataVersion) ?: JvmMetadataVersion.INSTANCE
languageVersionString = languageVersionString, return JvmBuildMetaInfo(
apiVersionString = apiVersionString, isEAP = isEAP,
coroutinesEnable = coroutinesEnable, compilerBuildVersion = compilerBuildVersion,
coroutinesWarn = coroutinesWarn, languageVersionString = languageVersionString,
coroutinesError = coroutinesError, apiVersionString = apiVersionString,
multiplatformEnable = multiplatformEnable, coroutinesEnable = coroutinesEnable,
metadataVersionMajor = JvmMetadataVersion.INSTANCE.major, coroutinesWarn = coroutinesWarn,
metadataVersionMinor = JvmMetadataVersion.INSTANCE.minor, coroutinesError = coroutinesError,
metadataVersionPatch = JvmMetadataVersion.INSTANCE.patch, multiplatformEnable = multiplatformEnable,
bytecodeVersionMajor = JvmBytecodeBinaryVersion.INSTANCE.major, metadataVersionMajor = metadataVersion.major,
bytecodeVersionMinor = JvmBytecodeBinaryVersion.INSTANCE.minor, metadataVersionMinor = metadataVersion.minor,
bytecodeVersionPatch = JvmBytecodeBinaryVersion.INSTANCE.patch, metadataVersionPatch = metadataVersion.patch,
ownVersion = ownVersion, bytecodeVersionMajor = JvmBytecodeBinaryVersion.INSTANCE.major,
coroutinesVersion = coroutinesVersion, bytecodeVersionMinor = JvmBytecodeBinaryVersion.INSTANCE.minor,
multiplatformVersion = multiplatformVersion bytecodeVersionPatch = JvmBytecodeBinaryVersion.INSTANCE.patch,
) ownVersion = ownVersion,
coroutinesVersion = coroutinesVersion,
multiplatformVersion = multiplatformVersion
)
}
} }
} }
@@ -33,10 +33,8 @@ import org.jetbrains.kotlin.descriptors.DescriptorUtilKt;
import org.jetbrains.kotlin.descriptors.ModuleDescriptor; import org.jetbrains.kotlin.descriptors.ModuleDescriptor;
import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.incremental.components.NoLookupLocation;
import org.jetbrains.kotlin.load.kotlin.ModuleMappingUtilKt; import org.jetbrains.kotlin.load.kotlin.ModuleMappingUtilKt;
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils;
import org.jetbrains.kotlin.metadata.ProtoBuf; import org.jetbrains.kotlin.metadata.ProtoBuf;
import org.jetbrains.kotlin.metadata.jvm.JvmModuleProtoBuf; import org.jetbrains.kotlin.metadata.jvm.JvmModuleProtoBuf;
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion;
import org.jetbrains.kotlin.metadata.jvm.deserialization.ModuleMapping; import org.jetbrains.kotlin.metadata.jvm.deserialization.ModuleMapping;
import org.jetbrains.kotlin.metadata.jvm.deserialization.ModuleMappingKt; import org.jetbrains.kotlin.metadata.jvm.deserialization.ModuleMappingKt;
import org.jetbrains.kotlin.metadata.jvm.deserialization.PackageParts; import org.jetbrains.kotlin.metadata.jvm.deserialization.PackageParts;
@@ -125,7 +123,7 @@ public class ClassFileFactory implements OutputFileCollection {
generators.put(outputFilePath, new OutAndSourceFileList(CollectionsKt.toList(sourceFiles)) { generators.put(outputFilePath, new OutAndSourceFileList(CollectionsKt.toList(sourceFiles)) {
@Override @Override
public byte[] asBytes(ClassBuilderFactory factory) { public byte[] asBytes(ClassBuilderFactory factory) {
return ModuleMappingKt.serializeToByteArray(moduleProto, JvmMetadataVersion.INSTANCE.toArray()); return ModuleMappingKt.serializeToByteArray(moduleProto, state.getMetadataVersion().toArray());
} }
@Override @Override
@@ -16,11 +16,9 @@ import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.load.java.lazy.types.RawTypeImpl import org.jetbrains.kotlin.load.java.lazy.types.RawTypeImpl
import org.jetbrains.kotlin.load.kotlin.NON_EXISTENT_CLASS_NAME import org.jetbrains.kotlin.load.kotlin.NON_EXISTENT_CLASS_NAME
import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf
import org.jetbrains.kotlin.metadata.jvm.deserialization.ClassMapperLite import org.jetbrains.kotlin.metadata.jvm.deserialization.ClassMapperLite
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmFlags import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmFlags
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
@@ -46,9 +44,7 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta
private val moduleName = state.moduleName private val moduleName = state.moduleName
private val classBuilderMode = state.classBuilderMode private val classBuilderMode = state.classBuilderMode
private val isReleaseCoroutines = state.languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines) private val isReleaseCoroutines = state.languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines)
override val metadataVersion = state.metadataVersion
override val metadataVersion: BinaryVersion
get() = JvmMetadataVersion.INSTANCE
override fun shouldUseTypeTable(): Boolean = useTypeTable override fun shouldUseTypeTable(): Boolean = useTypeTable
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.descriptors.ScriptDescriptor
import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.diagnostics.DiagnosticSink
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
import org.jetbrains.kotlin.modules.TargetId import org.jetbrains.kotlin.modules.TargetId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
@@ -237,6 +238,8 @@ class GenerationState private constructor(
val disableOptimization = configuration.get(JVMConfigurationKeys.DISABLE_OPTIMIZATION, false) val disableOptimization = configuration.get(JVMConfigurationKeys.DISABLE_OPTIMIZATION, false)
val metadataVersion = configuration.get(CommonConfigurationKeys.METADATA_VERSION) ?: JvmMetadataVersion.INSTANCE
init { init {
this.interceptedBuilderFactory = builderFactory this.interceptedBuilderFactory = builderFactory
.wrapWith( .wrapWith(
@@ -17,22 +17,20 @@
package org.jetbrains.kotlin.codegen package org.jetbrains.kotlin.codegen
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.isPreRelease
import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.java.JvmAnnotationNames
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmBytecodeBinaryVersion import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmBytecodeBinaryVersion
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
import org.jetbrains.org.objectweb.asm.AnnotationVisitor import org.jetbrains.org.objectweb.asm.AnnotationVisitor
fun writeKotlinMetadata( fun writeKotlinMetadata(
cb: ClassBuilder, cb: ClassBuilder,
state: GenerationState, state: GenerationState,
kind: KotlinClassHeader.Kind, kind: KotlinClassHeader.Kind,
extraFlags: Int, extraFlags: Int,
action: (AnnotationVisitor) -> Unit action: (AnnotationVisitor) -> Unit
) { ) {
val av = cb.newAnnotation(JvmAnnotationNames.METADATA_DESC, true) val av = cb.newAnnotation(JvmAnnotationNames.METADATA_DESC, true)
av.visit(JvmAnnotationNames.METADATA_VERSION_FIELD_NAME, JvmMetadataVersion.INSTANCE.toArray()) av.visit(JvmAnnotationNames.METADATA_VERSION_FIELD_NAME, state.metadataVersion.toArray())
av.visit(JvmAnnotationNames.BYTECODE_VERSION_FIELD_NAME, JvmBytecodeBinaryVersion.INSTANCE.toArray()) av.visit(JvmAnnotationNames.BYTECODE_VERSION_FIELD_NAME, JvmBytecodeBinaryVersion.INSTANCE.toArray())
av.visit(JvmAnnotationNames.KIND_FIELD_NAME, kind.id) av.visit(JvmAnnotationNames.KIND_FIELD_NAME, kind.id)
var flags = extraFlags var flags = extraFlags
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.config.addKotlinSourceRoots
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.impl.EmptyPackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.impl.EmptyPackageFragmentDescriptor
import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
@@ -41,7 +42,7 @@ import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerial
import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.LockBasedStorageManager
import java.io.File import java.io.File
class BuiltInsSerializer(dependOnOldBuiltIns: Boolean) : MetadataSerializer(dependOnOldBuiltIns) { class BuiltInsSerializer(dependOnOldBuiltIns: Boolean) : MetadataSerializer(BuiltInsBinaryVersion.INSTANCE, dependOnOldBuiltIns) {
fun serialize( fun serialize(
destDir: File, destDir: File,
srcDirs: List<File>, srcDirs: List<File>,
@@ -174,6 +174,12 @@ abstract class CommonCompilerArguments : CommonToolArguments() {
) )
var progressiveMode by FreezableVar(false) var progressiveMode by FreezableVar(false)
@Argument(
value = "-Xmetadata-version",
description = "Change metadata version of the generated binary files"
)
var metadataVersion: String? by FreezableVar(null)
open fun configureAnalysisFlags(collector: MessageCollector): MutableMap<AnalysisFlag<*>, Any> { open fun configureAnalysisFlags(collector: MessageCollector): MutableMap<AnalysisFlag<*>, Any> {
return HashMap<AnalysisFlag<*>, Any>().apply { return HashMap<AnalysisFlag<*>, Any>().apply {
put(AnalysisFlag.skipMetadataVersionCheck, skipMetadataVersionCheck) put(AnalysisFlag.skipMetadataVersionCheck, skipMetadataVersionCheck)
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.config.CommonConfigurationKeys;
import org.jetbrains.kotlin.config.CommonConfigurationKeysKt; import org.jetbrains.kotlin.config.CommonConfigurationKeysKt;
import org.jetbrains.kotlin.config.CompilerConfiguration; import org.jetbrains.kotlin.config.CompilerConfiguration;
import org.jetbrains.kotlin.config.Services; import org.jetbrains.kotlin.config.Services;
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion;
import org.jetbrains.kotlin.progress.CompilationCanceledException; import org.jetbrains.kotlin.progress.CompilationCanceledException;
import org.jetbrains.kotlin.progress.CompilationCanceledStatus; import org.jetbrains.kotlin.progress.CompilationCanceledStatus;
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus; import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus;
@@ -42,6 +43,7 @@ import org.jetbrains.kotlin.utils.PathUtil;
import java.io.File; import java.io.File;
import java.io.PrintStream; import java.io.PrintStream;
import static org.jetbrains.kotlin.cli.common.CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY;
import static org.jetbrains.kotlin.cli.common.ExitCode.COMPILATION_ERROR; import static org.jetbrains.kotlin.cli.common.ExitCode.COMPILATION_ERROR;
import static org.jetbrains.kotlin.cli.common.ExitCode.INTERNAL_ERROR; import static org.jetbrains.kotlin.cli.common.ExitCode.INTERNAL_ERROR;
import static org.jetbrains.kotlin.cli.common.environment.UtilKt.setIdeaIoUseFallback; import static org.jetbrains.kotlin.cli.common.environment.UtilKt.setIdeaIoUseFallback;
@@ -75,7 +77,7 @@ public abstract class CLICompiler<A extends CommonCompilerArguments> extends CLI
GroupingMessageCollector groupingCollector = new GroupingMessageCollector(messageCollector, arguments.getAllWarningsAsErrors()); GroupingMessageCollector groupingCollector = new GroupingMessageCollector(messageCollector, arguments.getAllWarningsAsErrors());
CompilerConfiguration configuration = new CompilerConfiguration(); CompilerConfiguration configuration = new CompilerConfiguration();
configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, groupingCollector); configuration.put(MESSAGE_COLLECTOR_KEY, groupingCollector);
configuration.put(CLIConfigurationKeys.PERF_MANAGER, performanceManager); configuration.put(CLIConfigurationKeys.PERF_MANAGER, performanceManager);
try { try {
setupCommonArgumentsAndServices(configuration, arguments, services); setupCommonArgumentsAndServices(configuration, arguments, services);
@@ -96,7 +98,7 @@ public abstract class CLICompiler<A extends CommonCompilerArguments> extends CLI
performanceManager.notifyCompilationFinished(); performanceManager.notifyCompilationFinished();
if (arguments.getReportPerf()) { if (arguments.getReportPerf()) {
performanceManager.getMeasurementResults().forEach( performanceManager.getMeasurementResults().forEach(
it -> configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY).report(INFO, "PERF: " + it.render(), null) it -> configuration.get(MESSAGE_COLLECTOR_KEY).report(INFO, "PERF: " + it.render(), null)
); );
} }
@@ -148,6 +150,18 @@ public abstract class CLICompiler<A extends CommonCompilerArguments> extends CLI
if (arguments.getReportOutputFiles()) { if (arguments.getReportOutputFiles()) {
configuration.put(CommonConfigurationKeys.REPORT_OUTPUT_FILES, true); configuration.put(CommonConfigurationKeys.REPORT_OUTPUT_FILES, true);
} }
String metadataVersionString = arguments.getMetadataVersion();
if (metadataVersionString != null) {
int[] versionArray = BinaryVersion.parseVersionArray(metadataVersionString);
if (versionArray == null) {
configuration.getNotNull(MESSAGE_COLLECTOR_KEY).report(ERROR, "Invalid metadata version: " + metadataVersionString, null);
}
else {
configuration.put(CommonConfigurationKeys.METADATA_VERSION, createMetadataVersion(versionArray));
}
}
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
CompilerJarLocator locator = services.get(CompilerJarLocator.class); CompilerJarLocator locator = services.get(CompilerJarLocator.class);
if (locator != null) { if (locator != null) {
@@ -157,11 +171,14 @@ public abstract class CLICompiler<A extends CommonCompilerArguments> extends CLI
setupLanguageVersionSettings(configuration, arguments); setupLanguageVersionSettings(configuration, arguments);
} }
@NotNull
protected abstract BinaryVersion createMetadataVersion(@NotNull int[] versionArray);
private void setupLanguageVersionSettings(@NotNull CompilerConfiguration configuration, @NotNull A arguments) { private void setupLanguageVersionSettings(@NotNull CompilerConfiguration configuration, @NotNull A arguments) {
CommonConfigurationKeysKt.setLanguageVersionSettings(
MessageCollector collector = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY); configuration,
arguments.configureLanguageVersionSettings(configuration.getNotNull(MESSAGE_COLLECTOR_KEY))
CommonConfigurationKeysKt.setLanguageVersionSettings(configuration, arguments.configureLanguageVersionSettings(collector)); );
} }
@Nullable @Nullable
@@ -63,6 +63,7 @@ import org.jetbrains.kotlin.js.facade.TranslationResult;
import org.jetbrains.kotlin.js.facade.TranslationUnit; import org.jetbrains.kotlin.js.facade.TranslationUnit;
import org.jetbrains.kotlin.js.facade.exceptions.TranslationException; import org.jetbrains.kotlin.js.facade.exceptions.TranslationException;
import org.jetbrains.kotlin.js.sourceMap.SourceFilePathResolver; import org.jetbrains.kotlin.js.sourceMap.SourceFilePathResolver;
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion;
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus; import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus;
import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.serialization.js.ModuleKind; import org.jetbrains.kotlin.serialization.js.ModuleKind;
@@ -537,11 +538,15 @@ public class K2JSCompiler extends CLICompiler<K2JSCompilerArguments> {
return "kotlinc-js"; return "kotlinc-js";
} }
@NotNull
@Override
protected BinaryVersion createMetadataVersion(@NotNull int[] versionArray) {
return new JsMetadataVersion(versionArray);
}
private static final class K2JSCompilerPerformanceManager extends CommonCompilerPerformanceManager { private static final class K2JSCompilerPerformanceManager extends CommonCompilerPerformanceManager {
public K2JSCompilerPerformanceManager() { public K2JSCompilerPerformanceManager() {
super("Kotlin to JS Compiler"); super("Kotlin to JS Compiler");
} }
} }
} }
@@ -21,8 +21,11 @@ import com.intellij.openapi.Disposable
import org.jetbrains.kotlin.cli.common.* import org.jetbrains.kotlin.cli.common.*
import org.jetbrains.kotlin.cli.common.ExitCode.* import org.jetbrains.kotlin.cli.common.ExitCode.*
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.cli.common.messages.*
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.* import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.*
import org.jetbrains.kotlin.cli.common.messages.FilteringMessageCollector
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.common.messages.MessageUtil
import org.jetbrains.kotlin.cli.common.messages.OutputMessageUtil
import org.jetbrains.kotlin.cli.jvm.compiler.CompileEnvironmentUtil import org.jetbrains.kotlin.cli.jvm.compiler.CompileEnvironmentUtil
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
@@ -41,6 +44,8 @@ import org.jetbrains.kotlin.javac.JavacWrapper
import org.jetbrains.kotlin.load.java.JavaClassesTracker import org.jetbrains.kotlin.load.java.JavaClassesTracker
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
import org.jetbrains.kotlin.script.ScriptDefinitionProvider import org.jetbrains.kotlin.script.ScriptDefinitionProvider
import org.jetbrains.kotlin.script.StandardScriptDefinition import org.jetbrains.kotlin.script.StandardScriptDefinition
import org.jetbrains.kotlin.utils.KotlinPaths import org.jetbrains.kotlin.utils.KotlinPaths
@@ -333,6 +338,8 @@ class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
override fun executableScriptFileName(): String = "kotlinc-jvm" override fun executableScriptFileName(): String = "kotlinc-jvm"
override fun createMetadataVersion(versionArray: IntArray): BinaryVersion = JvmMetadataVersion(*versionArray)
private class K2JVMCompilerPerformanceManager : CommonCompilerPerformanceManager("Kotlin to JVM Compiler") private class K2JVMCompilerPerformanceManager : CommonCompilerPerformanceManager("Kotlin to JVM Compiler")
companion object { companion object {
@@ -35,6 +35,8 @@ import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.config.Services
import org.jetbrains.kotlin.config.addKotlinSourceRoot import org.jetbrains.kotlin.config.addKotlinSourceRoot
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
import org.jetbrains.kotlin.utils.KotlinPaths import org.jetbrains.kotlin.utils.KotlinPaths
import java.io.File import java.io.File
@@ -89,7 +91,9 @@ class K2MetadataCompiler : CLICompiler<K2MetadataCompilerArguments>() {
} }
try { try {
MetadataSerializer(true).serialize(environment) val metadataVersion =
configuration.get(CommonConfigurationKeys.METADATA_VERSION) as? BuiltInsBinaryVersion ?: BuiltInsBinaryVersion.INSTANCE
MetadataSerializer(metadataVersion, true).serialize(environment)
} }
catch (e: CompilationException) { catch (e: CompilationException) {
collector.report(EXCEPTION, OutputMessageUtil.renderException(e), MessageUtil.psiElementToMessageLocation(e.element)) collector.report(EXCEPTION, OutputMessageUtil.renderException(e), MessageUtil.psiElementToMessageLocation(e.element))
@@ -102,6 +106,8 @@ class K2MetadataCompiler : CLICompiler<K2MetadataCompilerArguments>() {
// TODO: update this once a launcher script for K2MetadataCompiler is available // TODO: update this once a launcher script for K2MetadataCompiler is available
override fun executableScriptFileName(): String = "kotlinc" override fun executableScriptFileName(): String = "kotlinc"
override fun createMetadataVersion(versionArray: IntArray): BinaryVersion = BuiltInsBinaryVersion(*versionArray)
override fun getPerformanceManager(): CommonCompilerPerformanceManager = performanceManager override fun getPerformanceManager(): CommonCompilerPerformanceManager = performanceManager
companion object { companion object {
@@ -112,4 +118,4 @@ class K2MetadataCompiler : CLICompiler<K2MetadataCompilerArguments>() {
} }
private class K2MetadataCompilerPerformanceManager : CommonCompilerPerformanceManager("Kotlin to Metadata compiler") private class K2MetadataCompilerPerformanceManager : CommonCompilerPerformanceManager("Kotlin to Metadata compiler")
} }
@@ -48,7 +48,10 @@ import java.io.ByteArrayOutputStream
import java.io.DataOutputStream import java.io.DataOutputStream
import java.io.File import java.io.File
open class MetadataSerializer(private val dependOnOldBuiltIns: Boolean) { open class MetadataSerializer(
private val metadataVersion: BuiltInsBinaryVersion,
private val dependOnOldBuiltIns: Boolean
) {
protected var totalSize = 0 protected var totalSize = 0
protected var totalFiles = 0 protected var totalFiles = 0
@@ -127,12 +130,13 @@ open class MetadataSerializer(private val dependOnOldBuiltIns: Boolean) {
table.addTo(this) table.addTo(this)
} }
}.build().serializeToByteArray(JvmMetadataVersion.INSTANCE.toArray()) // TODO: use another version here, not JVM }.build().serializeToByteArray(JvmMetadataVersion.INSTANCE.toArray()) // TODO: use another version here, not JVM
// TODO: also, use CommonConfigurationKeys.METADATA_VERSION if needed
kotlinModuleFile.parentFile.mkdirs() kotlinModuleFile.parentFile.mkdirs()
kotlinModuleFile.writeBytes(packageTableBytes) kotlinModuleFile.writeBytes(packageTableBytes)
} }
protected open fun createSerializerExtension(): KotlinSerializerExtensionBase = MetadataSerializerExtension() protected open fun createSerializerExtension(): KotlinSerializerExtensionBase = MetadataSerializerExtension(metadataVersion)
private fun getPackageFilePath(packageFqName: FqName, fileName: String): String = private fun getPackageFilePath(packageFqName: FqName, fileName: String): String =
packageFqName.asString().replace('.', '/') + "/" + packageFqName.asString().replace('.', '/') + "/" +
@@ -185,7 +189,7 @@ open class MetadataSerializer(private val dependOnOldBuiltIns: Boolean) {
private fun serializeBuiltInsFile() { private fun serializeBuiltInsFile() {
val stream = ByteArrayOutputStream() val stream = ByteArrayOutputStream()
with(DataOutputStream(stream)) { with(DataOutputStream(stream)) {
val version = BuiltInsBinaryVersion.INSTANCE.toArray() val version = extension.metadataVersion.toArray()
writeInt(version.size) writeInt(version.size)
version.forEach { writeInt(it) } version.forEach { writeInt(it) }
} }
@@ -17,13 +17,11 @@
package org.jetbrains.kotlin.cli.metadata package org.jetbrains.kotlin.cli.metadata
import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
import org.jetbrains.kotlin.serialization.KotlinSerializerExtensionBase import org.jetbrains.kotlin.serialization.KotlinSerializerExtensionBase
import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
class MetadataSerializerExtension : KotlinSerializerExtensionBase(BuiltInSerializerProtocol) { class MetadataSerializerExtension(
override val metadataVersion: BinaryVersion override val metadataVersion: BuiltInsBinaryVersion
get() = BuiltInsBinaryVersion.INSTANCE ) : KotlinSerializerExtensionBase(BuiltInSerializerProtocol) {
override fun shouldUseTypeTable(): Boolean = true override fun shouldUseTypeTable(): Boolean = true
} }
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.config
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
object CommonConfigurationKeys { object CommonConfigurationKeys {
@JvmField @JvmField
@@ -37,6 +38,9 @@ object CommonConfigurationKeys {
@JvmField @JvmField
val EXPECT_ACTUAL_TRACKER = CompilerConfigurationKey.create<ExpectActualTracker>("expect actual tracker") val EXPECT_ACTUAL_TRACKER = CompilerConfigurationKey.create<ExpectActualTracker>("expect actual tracker")
@JvmField
val METADATA_VERSION = CompilerConfigurationKey.create<BinaryVersion>("metadata version")
} }
var CompilerConfiguration.languageVersionSettings: LanguageVersionSettings var CompilerConfiguration.languageVersionSettings: LanguageVersionSettings
+1
View File
@@ -11,6 +11,7 @@ where advanced options include:
-Xexperimental=<fq.name> Enable and propagate usages of experimental API for marker annotation with the given fully qualified name -Xexperimental=<fq.name> Enable and propagate usages of experimental API for marker annotation with the given fully qualified name
-Xintellij-plugin-root=<path> Path to the kotlin-compiler.jar or directory where IntelliJ configuration files can be found -Xintellij-plugin-root=<path> Path to the kotlin-compiler.jar or directory where IntelliJ configuration files can be found
-Xlegacy-smart-cast-after-try Allow var smart casts despite assignment in try block -Xlegacy-smart-cast-after-try Allow var smart casts despite assignment in try block
-Xmetadata-version Change metadata version of the generated binary files
-Xmulti-platform Enable experimental language support for multi-platform projects -Xmulti-platform Enable experimental language support for multi-platform projects
-Xnew-inference Enable new experimental generic type inference algorithm -Xnew-inference Enable new experimental generic type inference algorithm
-Xno-check-actual Do not check presence of 'actual' modifier in multi-platform projects -Xno-check-actual Do not check presence of 'actual' modifier in multi-platform projects
+1
View File
@@ -66,6 +66,7 @@ where advanced options include:
-Xexperimental=<fq.name> Enable and propagate usages of experimental API for marker annotation with the given fully qualified name -Xexperimental=<fq.name> Enable and propagate usages of experimental API for marker annotation with the given fully qualified name
-Xintellij-plugin-root=<path> Path to the kotlin-compiler.jar or directory where IntelliJ configuration files can be found -Xintellij-plugin-root=<path> Path to the kotlin-compiler.jar or directory where IntelliJ configuration files can be found
-Xlegacy-smart-cast-after-try Allow var smart casts despite assignment in try block -Xlegacy-smart-cast-after-try Allow var smart casts despite assignment in try block
-Xmetadata-version Change metadata version of the generated binary files
-Xmulti-platform Enable experimental language support for multi-platform projects -Xmulti-platform Enable experimental language support for multi-platform projects
-Xnew-inference Enable new experimental generic type inference algorithm -Xnew-inference Enable new experimental generic type inference algorithm
-Xno-check-actual Do not check presence of 'actual' modifier in multi-platform projects -Xno-check-actual Do not check presence of 'actual' modifier in multi-platform projects
+4
View File
@@ -0,0 +1,4 @@
$TESTDATA_DIR$/simple.kt
-d
$TEMP_DIR$
-Xmetadata-version=1..2.3
+2
View File
@@ -0,0 +1,2 @@
error: invalid metadata version: 1..2.3
COMPILATION_ERROR
@@ -276,6 +276,11 @@ public class CliTestGenerated extends AbstractCliTest {
runTest("compiler/testData/cli/jvm/internalArgumentOverrideExtraArgument.args"); runTest("compiler/testData/cli/jvm/internalArgumentOverrideExtraArgument.args");
} }
@TestMetadata("invalidMetadataVersion.args")
public void testInvalidMetadataVersion() throws Exception {
runTest("compiler/testData/cli/jvm/invalidMetadataVersion.args");
}
@TestMetadata("javaSrcWrongPackage.args") @TestMetadata("javaSrcWrongPackage.args")
public void testJavaSrcWrongPackage() throws Exception { public void testJavaSrcWrongPackage() throws Exception {
runTest("compiler/testData/cli/jvm/javaSrcWrongPackage.args"); runTest("compiler/testData/cli/jvm/javaSrcWrongPackage.args");
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.addKotlinSourceRoots import org.jetbrains.kotlin.config.addKotlinSourceRoots
import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings
@@ -82,7 +83,8 @@ class KotlinJavascriptSerializerTest : TestCaseWithTmpdir() {
data = analysisResult.moduleDescriptor data = analysisResult.moduleDescriptor
) )
val serializedMetadata = KotlinJavascriptSerializationUtil.serializeMetadata( val serializedMetadata = KotlinJavascriptSerializationUtil.serializeMetadata(
analysisResult.bindingContext, description, configuration.languageVersionSettings analysisResult.bindingContext, description, configuration.languageVersionSettings,
configuration.get(CommonConfigurationKeys.METADATA_VERSION) as? JsMetadataVersion ?: JsMetadataVersion.INSTANCE
) )
FileUtil.writeToFile(metaFile, serializedMetadata.asString()) FileUtil.writeToFile(metaFile, serializedMetadata.asString())
} }
@@ -71,8 +71,8 @@ object KotlinJavascriptMetadataUtils {
fun hasMetadata(text: String): Boolean = fun hasMetadata(text: String): Boolean =
KOTLIN_JAVASCRIPT_METHOD_NAME_PATTERN.matcher(text).find() && METADATA_PATTERN.matcher(text).find() KOTLIN_JAVASCRIPT_METHOD_NAME_PATTERN.matcher(text).find() && METADATA_PATTERN.matcher(text).find()
fun formatMetadataAsString(moduleName: String, content: ByteArray): String = fun formatMetadataAsString(moduleName: String, content: ByteArray, metadataVersion: JsMetadataVersion): String =
"// Kotlin.$KOTLIN_JAVASCRIPT_METHOD_NAME(${JsMetadataVersion.INSTANCE.toInteger()}, \"$moduleName\", " + "// Kotlin.$KOTLIN_JAVASCRIPT_METHOD_NAME(${metadataVersion.toInteger()}, \"$moduleName\", " +
"\"${Base64.getEncoder().encodeToString(content)}\");\n" "\"${Base64.getEncoder().encodeToString(content)}\");\n"
@JvmStatic @JvmStatic
@@ -65,5 +65,11 @@ abstract class BinaryVersion(private vararg val numbers: Int) {
companion object { companion object {
private const val UNKNOWN = -1 private const val UNKNOWN = -1
@JvmStatic
fun parseVersionArray(string: String): IntArray? =
string.split(".")
.map { part -> part.toIntOrNull() ?: return null }
.toTypedArray().toIntArray()
} }
} }
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
import org.jetbrains.kotlin.metadata.js.JsProtoBuf import org.jetbrains.kotlin.metadata.js.JsProtoBuf
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.protobuf.CodedInputStream import org.jetbrains.kotlin.protobuf.CodedInputStream
@@ -70,26 +71,32 @@ object KotlinJavascriptSerializationUtil {
fun serializeMetadata( fun serializeMetadata(
bindingContext: BindingContext, bindingContext: BindingContext,
jsDescriptor: JsModuleDescriptor<ModuleDescriptor>, jsDescriptor: JsModuleDescriptor<ModuleDescriptor>,
languageVersionSettings: LanguageVersionSettings languageVersionSettings: LanguageVersionSettings,
metadataVersion: JsMetadataVersion
): SerializedMetadata { ): SerializedMetadata {
val serializedFragments = HashMap<FqName, ProtoBuf.PackageFragment>() val serializedFragments = HashMap<FqName, ProtoBuf.PackageFragment>()
val module = jsDescriptor.data val module = jsDescriptor.data
for (fqName in getPackagesFqNames(module).sortedBy { it.asString() }) { 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()) { if (!fragment.isEmpty()) {
serializedFragments[fqName] = fragment serializedFragments[fqName] = fragment
} }
} }
return SerializedMetadata(serializedFragments, jsDescriptor, languageVersionSettings) return SerializedMetadata(serializedFragments, jsDescriptor, languageVersionSettings, metadataVersion)
} }
class SerializedMetadata( class SerializedMetadata(
private val serializedFragments: Map<FqName, ProtoBuf.PackageFragment>, private val serializedFragments: Map<FqName, ProtoBuf.PackageFragment>,
private val jsDescriptor: JsModuleDescriptor<ModuleDescriptor>, 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) class SerializedPackage(val fqName: FqName, val bytes: ByteArray)
@@ -99,7 +106,7 @@ object KotlinJavascriptSerializationUtil {
for ((fqName, part) in serializedFragments) { for ((fqName, part) in serializedFragments) {
val stream = ByteArrayOutputStream() val stream = ByteArrayOutputStream()
with(DataOutputStream(stream)) { with(DataOutputStream(stream)) {
val version = JsMetadataVersion.INSTANCE.toArray() val version = metadataVersion.toArray()
writeInt(version.size) writeInt(version.size)
version.forEach(this::writeInt) version.forEach(this::writeInt)
} }
@@ -114,7 +121,7 @@ object KotlinJavascriptSerializationUtil {
} }
fun asString(): String = fun asString(): String =
KotlinJavascriptMetadataUtils.formatMetadataAsString(jsDescriptor.name, asByteArray()) KotlinJavascriptMetadataUtils.formatMetadataAsString(jsDescriptor.name, asByteArray(), metadataVersion)
private fun asByteArray(): ByteArray = private fun asByteArray(): ByteArray =
ByteArrayOutputStream().apply { 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( fun serializeDescriptors(
bindingContext: BindingContext, bindingContext: BindingContext,
module: ModuleDescriptor, module: ModuleDescriptor,
scope: Collection<DeclarationDescriptor>, scope: Collection<DeclarationDescriptor>,
fqName: FqName, fqName: FqName,
languageVersionSettings: LanguageVersionSettings languageVersionSettings: LanguageVersionSettings,
metadataVersion: BinaryVersion
): ProtoBuf.PackageFragment { ): ProtoBuf.PackageFragment {
val builder = ProtoBuf.PackageFragment.newBuilder() val builder = ProtoBuf.PackageFragment.newBuilder()
@@ -190,7 +182,7 @@ object KotlinJavascriptSerializationUtil {
} }
val fileRegistry = KotlinFileRegistry() val fileRegistry = KotlinFileRegistry()
val extension = KotlinJavascriptSerializerExtension(fileRegistry, languageVersionSettings) val extension = KotlinJavascriptSerializerExtension(fileRegistry, languageVersionSettings, metadataVersion)
val classDescriptors = scope.filterIsInstance<ClassDescriptor>().sortedBy { it.fqNameSafe.asString() } 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.resolve.source.PsiSourceFile
import org.jetbrains.kotlin.serialization.KotlinSerializerExtensionBase import org.jetbrains.kotlin.serialization.KotlinSerializerExtensionBase
import org.jetbrains.kotlin.types.FlexibleType import org.jetbrains.kotlin.types.FlexibleType
import org.jetbrains.kotlin.utils.JsMetadataVersion
class KotlinJavascriptSerializerExtension( class KotlinJavascriptSerializerExtension(
private val fileRegistry: KotlinFileRegistry, private val fileRegistry: KotlinFileRegistry,
private val languageVersionSettings: LanguageVersionSettings private val languageVersionSettings: LanguageVersionSettings,
) : KotlinSerializerExtensionBase(JsSerializerProtocol) {
override val metadataVersion: BinaryVersion override val metadataVersion: BinaryVersion
get() = JsMetadataVersion.INSTANCE ) : KotlinSerializerExtensionBase(JsSerializerProtocol) {
override val stringTable = JavaScriptStringTable() override val stringTable = JavaScriptStringTable()
override fun serializeFlexibleType(flexibleType: FlexibleType, lowerProto: ProtoBuf.Type.Builder, upperProto: ProtoBuf.Type.Builder) { 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 com.intellij.openapi.vfs.VfsUtilCore;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.config.CommonConfigurationKeys;
import org.jetbrains.kotlin.config.CommonConfigurationKeysKt; import org.jetbrains.kotlin.config.CommonConfigurationKeysKt;
import org.jetbrains.kotlin.config.LanguageVersionSettings; import org.jetbrains.kotlin.config.LanguageVersionSettings;
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; 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.general.Translation;
import org.jetbrains.kotlin.js.translate.utils.ExpandIsCallsKt; import org.jetbrains.kotlin.js.translate.utils.ExpandIsCallsKt;
import org.jetbrains.kotlin.metadata.ProtoBuf; import org.jetbrains.kotlin.metadata.ProtoBuf;
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion;
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus; import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus;
import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.resolve.BindingTrace; import org.jetbrains.kotlin.resolve.BindingTrace;
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics; import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics;
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil; import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil;
import org.jetbrains.kotlin.serialization.js.ast.JsAstSerializer; import org.jetbrains.kotlin.serialization.js.ast.JsAstSerializer;
import org.jetbrains.kotlin.utils.JsMetadataVersion;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
@@ -176,9 +179,12 @@ public final class K2JSTranslator {
List<DeclarationDescriptor> scope = translationResult.getFileMemberScopes().get(file); List<DeclarationDescriptor> scope = translationResult.getFileMemberScopes().get(file);
assert scope != null : "Could not find descriptors for file: " + file; assert scope != null : "Could not find descriptors for file: " + file;
BinaryVersion metadataVersion = config.getConfiguration().get(CommonConfigurationKeys.METADATA_VERSION);
ProtoBuf.PackageFragment packagePart = serializationUtil.serializeDescriptors( ProtoBuf.PackageFragment packagePart = serializationUtil.serializeDescriptors(
bindingTrace.getBindingContext(), moduleDescriptor, scope, file.getPackageFqName(), 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()); File ioFile = VfsUtilCore.virtualToIoFile(file.getVirtualFile());
incrementalResults.processPackagePart(ioFile, packagePart.toByteArray(), binaryAst); 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.util.text.StringUtil
import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VfsUtilCore
import org.jetbrains.kotlin.backend.common.output.* import org.jetbrains.kotlin.backend.common.output.*
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.js.backend.JsToStringGenerationVisitor 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.JsModuleDescriptor
import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil
import org.jetbrains.kotlin.utils.JsMetadataVersion
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils
import java.io.File import java.io.File
import java.util.* import java.util.*
@@ -109,16 +111,18 @@ abstract class TranslationResult protected constructor(val diagnostics: Diagnost
kind = config.moduleKind, kind = config.moduleKind,
imported = importedModules imported = importedModules
) )
val settings = config.configuration.languageVersionSettings val serializedMetadata = KotlinJavascriptSerializationUtil.serializeMetadata(
val serializedMetadata = KotlinJavascriptSerializationUtil.serializeMetadata(bindingContext, moduleDescription, settings) bindingContext, moduleDescription,
config.configuration.languageVersionSettings,
config.configuration.get(CommonConfigurationKeys.METADATA_VERSION) as? JsMetadataVersion ?: JsMetadataVersion.INSTANCE
)
val metaFileContent = serializedMetadata.asString() val metaFileContent = serializedMetadata.asString()
val sourceFilesForMetaFile = ArrayList(sourceFiles) val sourceFilesForMetaFile = ArrayList(sourceFiles)
val jsMetaFile = SimpleOutputFile(sourceFilesForMetaFile, metaFileName, metaFileContent) val jsMetaFile = SimpleOutputFile(sourceFilesForMetaFile, metaFileName, metaFileContent)
outputFiles.add(jsMetaFile) outputFiles.add(jsMetaFile)
for (serializedPackage in serializedMetadata.serializedPackages()) { for (serializedPackage in serializedMetadata.serializedPackages()) {
val outputBinaryFile = kjsmFileForPackage(serializedPackage.fqName, serializedPackage.bytes) outputFiles.add(kjsmFileForPackage(serializedPackage.fqName, serializedPackage.bytes))
outputFiles.add(outputBinaryFile)
} }
} }