Write "hasEnumEntries" flag into metadata when feature enabled
^KT-53929 Fixed
This commit is contained in:
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.incremental
|
|||||||
|
|
||||||
import com.intellij.psi.PsiJavaFile
|
import com.intellij.psi.PsiJavaFile
|
||||||
import com.intellij.util.io.DataExternalizer
|
import com.intellij.util.io.DataExternalizer
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
|
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
|
||||||
import org.jetbrains.kotlin.load.java.JavaClassesTracker
|
import org.jetbrains.kotlin.load.java.JavaClassesTracker
|
||||||
@@ -34,7 +35,8 @@ val CONVERTING_JAVA_CLASSES_TO_PROTO = PerformanceCounter.create("Converting Jav
|
|||||||
|
|
||||||
class JavaClassesTrackerImpl(
|
class JavaClassesTrackerImpl(
|
||||||
private val cache: IncrementalJvmCache,
|
private val cache: IncrementalJvmCache,
|
||||||
private val untrackedJavaClasses: Set<ClassId>
|
private val untrackedJavaClasses: Set<ClassId>,
|
||||||
|
private val languageVersionSettings: LanguageVersionSettings,
|
||||||
) : JavaClassesTracker {
|
) : JavaClassesTracker {
|
||||||
private val classToSourceSerialized: MutableMap<ClassId, SerializedJavaClassWithSource> = hashMapOf()
|
private val classToSourceSerialized: MutableMap<ClassId, SerializedJavaClassWithSource> = hashMapOf()
|
||||||
|
|
||||||
@@ -65,7 +67,7 @@ class JavaClassesTrackerImpl(
|
|||||||
"Duplicated JavaClassDescriptor $classId reported to IC"
|
"Duplicated JavaClassDescriptor $classId reported to IC"
|
||||||
}
|
}
|
||||||
classToSourceSerialized[classId] = CONVERTING_JAVA_CLASSES_TO_PROTO.time {
|
classToSourceSerialized[classId] = CONVERTING_JAVA_CLASSES_TO_PROTO.time {
|
||||||
classDescriptor.convertToProto()
|
classDescriptor.convertToProto(languageVersionSettings)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -85,12 +87,14 @@ private val JavaClassDescriptor.javaSourceFile: File?
|
|||||||
?.psi?.containingFile?.takeIf { it is PsiJavaFile }
|
?.psi?.containingFile?.takeIf { it is PsiJavaFile }
|
||||||
?.virtualFile?.path?.let(::File)
|
?.virtualFile?.path?.let(::File)
|
||||||
|
|
||||||
fun JavaClassDescriptor.convertToProto(): SerializedJavaClassWithSource {
|
fun JavaClassDescriptor.convertToProto(languageVersionSettings: LanguageVersionSettings): SerializedJavaClassWithSource {
|
||||||
val file = javaSourceFile.sure { "convertToProto should only be called for source based classes" }
|
val file = javaSourceFile.sure { "convertToProto should only be called for source based classes" }
|
||||||
|
|
||||||
val extension = JavaClassesSerializerExtension()
|
val extension = JavaClassesSerializerExtension()
|
||||||
val classProto = try {
|
val classProto = try {
|
||||||
DescriptorSerializer.create(this, extension, null).classProto(this).build()
|
DescriptorSerializer.create(
|
||||||
|
this, extension, null, languageVersionSettings
|
||||||
|
).classProto(this).build()
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
throw IllegalStateException(
|
throw IllegalStateException(
|
||||||
"Error during writing proto for descriptor: ${DescriptorRenderer.DEBUG_TEXT.render(this)}\n" +
|
"Error during writing proto for descriptor: ${DescriptorRenderer.DEBUG_TEXT.render(this)}\n" +
|
||||||
|
|||||||
@@ -284,7 +284,10 @@ public class ClosureCodegen extends MemberCodegen<KtElement> {
|
|||||||
v.getSerializationBindings().put(METHOD_FOR_FUNCTION, freeLambdaDescriptor, method);
|
v.getSerializationBindings().put(METHOD_FOR_FUNCTION, freeLambdaDescriptor, method);
|
||||||
|
|
||||||
DescriptorSerializer serializer =
|
DescriptorSerializer serializer =
|
||||||
DescriptorSerializer.createForLambda(new JvmSerializerExtension(v.getSerializationBindings(), state));
|
DescriptorSerializer.createForLambda(
|
||||||
|
new JvmSerializerExtension(v.getSerializationBindings(), state),
|
||||||
|
state.getLanguageVersionSettings()
|
||||||
|
);
|
||||||
|
|
||||||
ProtoBuf.Function.Builder builder = serializer.functionProto(freeLambdaDescriptor);
|
ProtoBuf.Function.Builder builder = serializer.functionProto(freeLambdaDescriptor);
|
||||||
if (builder == null) return;
|
if (builder == null) return;
|
||||||
|
|||||||
@@ -129,7 +129,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
descriptor, extension,
|
descriptor, extension,
|
||||||
parentCodegen instanceof ImplementationBodyCodegen
|
parentCodegen instanceof ImplementationBodyCodegen
|
||||||
? ((ImplementationBodyCodegen) parentCodegen).serializer
|
? ((ImplementationBodyCodegen) parentCodegen).serializer
|
||||||
: DescriptorSerializer.createTopLevel(extension, null),
|
: DescriptorSerializer.createTopLevel(extension, state.getLanguageVersionSettings(), null),
|
||||||
|
state.getLanguageVersionSettings(),
|
||||||
state.getProject()
|
state.getProject()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -127,7 +127,8 @@ public class PackagePartCodegen extends MemberCodegen<KtFile> {
|
|||||||
List<MemberDescriptor> members = CodegenUtil.getMemberDescriptorsToGenerate(codegen.element, codegen.bindingContext);
|
List<MemberDescriptor> members = CodegenUtil.getMemberDescriptorsToGenerate(codegen.element, codegen.bindingContext);
|
||||||
|
|
||||||
JvmSerializerExtension extension = new JvmSerializerExtension(codegen.v.getSerializationBindings(), codegen.state);
|
JvmSerializerExtension extension = new JvmSerializerExtension(codegen.v.getSerializationBindings(), codegen.state);
|
||||||
DescriptorSerializer serializer = DescriptorSerializer.createTopLevel(extension, null);
|
DescriptorSerializer serializer = DescriptorSerializer.createTopLevel(
|
||||||
|
extension, codegen.state.getLanguageVersionSettings(), null);
|
||||||
ProtoBuf.Package.Builder builder = serializer.packagePartProto(codegen.element.getPackageFqName(), members);
|
ProtoBuf.Package.Builder builder = serializer.packagePartProto(codegen.element.getPackageFqName(), members);
|
||||||
extension.serializeJvmPackage(builder, packagePartType);
|
extension.serializeJvmPackage(builder, packagePartType);
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.codegen.context.ScriptContext
|
|||||||
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.METHOD_FOR_FUNCTION
|
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.METHOD_FOR_FUNCTION
|
||||||
import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension
|
import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
|
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
||||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
||||||
@@ -68,7 +69,10 @@ class ScriptCodegen private constructor(
|
|||||||
override fun generateSyntheticPartsAfterBody() {}
|
override fun generateSyntheticPartsAfterBody() {}
|
||||||
|
|
||||||
override fun generateKotlinMetadataAnnotation() {
|
override fun generateKotlinMetadataAnnotation() {
|
||||||
val serializer = DescriptorSerializer.create(scriptDescriptor, JvmSerializerExtension(v.serializationBindings, state), null)
|
val serializer = DescriptorSerializer.create(
|
||||||
|
scriptDescriptor, JvmSerializerExtension(v.serializationBindings, state), null,
|
||||||
|
state.configuration.languageVersionSettings,
|
||||||
|
)
|
||||||
val classProto = serializer.classProto(scriptDescriptor).build()
|
val classProto = serializer.classProto(scriptDescriptor).build()
|
||||||
writeKotlinMetadata(v, state, KotlinClassHeader.Kind.CLASS, false, JvmAnnotationNames.METADATA_SCRIPT_FLAG) { av ->
|
writeKotlinMetadata(v, state, KotlinClassHeader.Kind.CLASS, false, JvmAnnotationNames.METADATA_SCRIPT_FLAG) { av ->
|
||||||
DescriptorAsmUtil.writeAnnotationData(av, serializer, classProto)
|
DescriptorAsmUtil.writeAnnotationData(av, serializer, classProto)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.codegen
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.output.OutputFile
|
import org.jetbrains.kotlin.backend.common.output.OutputFile
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
|
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
|
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
|
||||||
import org.jetbrains.kotlin.load.kotlin.loadModuleMapping
|
import org.jetbrains.kotlin.load.kotlin.loadModuleMapping
|
||||||
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
|
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
|
||||||
@@ -49,7 +50,9 @@ fun JvmModuleProtoBuf.Module.Builder.addDataFromCompiledModule(
|
|||||||
}
|
}
|
||||||
}.orEmpty()
|
}.orEmpty()
|
||||||
|
|
||||||
val serializer = DescriptorSerializer.createTopLevel(JvmOptionalAnnotationSerializerExtension(stringTable))
|
val serializer = DescriptorSerializer.createTopLevel(
|
||||||
|
JvmOptionalAnnotationSerializerExtension(stringTable), state.configuration.languageVersionSettings,
|
||||||
|
)
|
||||||
for (descriptor in optionalAnnotationClassDescriptors) {
|
for (descriptor in optionalAnnotationClassDescriptors) {
|
||||||
addOptionalAnnotationClass(serializer.classProto(descriptor))
|
addOptionalAnnotationClass(serializer.classProto(descriptor))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -702,7 +702,9 @@ class CoroutineCodegenForNamedFunction private constructor(
|
|||||||
override fun generateKotlinMetadataAnnotation() {
|
override fun generateKotlinMetadataAnnotation() {
|
||||||
val publicAbi = InlineUtil.isInPublicInlineScope(classDescriptor)
|
val publicAbi = InlineUtil.isInPublicInlineScope(classDescriptor)
|
||||||
writeKotlinMetadata(v, state, KotlinClassHeader.Kind.SYNTHETIC_CLASS, publicAbi, 0) { av ->
|
writeKotlinMetadata(v, state, KotlinClassHeader.Kind.SYNTHETIC_CLASS, publicAbi, 0) { av ->
|
||||||
val serializer = DescriptorSerializer.createForLambda(JvmSerializerExtension(v.serializationBindings, state))
|
val serializer = DescriptorSerializer.createForLambda(
|
||||||
|
JvmSerializerExtension(v.serializationBindings, state), state.languageVersionSettings,
|
||||||
|
)
|
||||||
val functionProto =
|
val functionProto =
|
||||||
serializer.functionProto(
|
serializer.functionProto(
|
||||||
createFreeFakeLambdaDescriptor(suspendFunctionJvmView, state.typeApproximator)
|
createFreeFakeLambdaDescriptor(suspendFunctionJvmView, state.typeApproximator)
|
||||||
|
|||||||
+1
-1
@@ -143,7 +143,7 @@ class JvmSerializerExtension @JvmOverloads constructor(
|
|||||||
|
|
||||||
for (localVariable in localVariables) {
|
for (localVariable in localVariables) {
|
||||||
val propertyDescriptor = createFreeFakeLocalPropertyDescriptor(localVariable, approximator)
|
val propertyDescriptor = createFreeFakeLocalPropertyDescriptor(localVariable, approximator)
|
||||||
val serializer = DescriptorSerializer.createForLambda(this)
|
val serializer = DescriptorSerializer.createForLambda(this, languageVersionSettings)
|
||||||
proto.addExtension(extension, serializer.propertyProto(propertyDescriptor)?.build() ?: continue)
|
proto.addExtension(extension, serializer.propertyProto(propertyDescriptor)?.build() ?: continue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-2
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
|
|||||||
import org.jetbrains.kotlin.cli.metadata.MetadataSerializer
|
import org.jetbrains.kotlin.cli.metadata.MetadataSerializer
|
||||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
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
|
||||||
@@ -87,7 +88,8 @@ class BuiltInsSerializer(dependOnOldBuiltIns: Boolean) : MetadataSerializer(Buil
|
|||||||
bindingContext: BindingContext,
|
bindingContext: BindingContext,
|
||||||
module: ModuleDescriptor,
|
module: ModuleDescriptor,
|
||||||
destDir: File,
|
destDir: File,
|
||||||
project: Project?
|
project: Project?,
|
||||||
|
languageVersionSettings: LanguageVersionSettings,
|
||||||
) {
|
) {
|
||||||
destDir.deleteRecursively()
|
destDir.deleteRecursively()
|
||||||
if (!destDir.mkdirs()) {
|
if (!destDir.mkdirs()) {
|
||||||
@@ -101,7 +103,8 @@ class BuiltInsSerializer(dependOnOldBuiltIns: Boolean) : MetadataSerializer(Buil
|
|||||||
packageView.memberScope.getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS) + createCloneable(module),
|
packageView.memberScope.getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS) + createCloneable(module),
|
||||||
packageView.fragments.flatMap { fragment -> DescriptorUtils.getAllDescriptors(fragment.getMemberScope()) },
|
packageView.fragments.flatMap { fragment -> DescriptorUtils.getAllDescriptors(fragment.getMemberScope()) },
|
||||||
packageView.fqName,
|
packageView.fqName,
|
||||||
File(destDir, BuiltInSerializerProtocol.getBuiltInsFilePath(packageView.fqName))
|
File(destDir, BuiltInSerializerProtocol.getBuiltInsFilePath(packageView.fqName)),
|
||||||
|
languageVersionSettings,
|
||||||
).run()
|
).run()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -637,7 +637,8 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
|
|||||||
firFile,
|
firFile,
|
||||||
session,
|
session,
|
||||||
scopeSession,
|
scopeSession,
|
||||||
FirKLibSerializerExtension(session, metadataVersion, FirElementAwareSerializableStringTable())
|
FirKLibSerializerExtension(session, metadataVersion, FirElementAwareSerializableStringTable()),
|
||||||
|
configuration.languageVersionSettings,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ import com.intellij.openapi.project.Project
|
|||||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
||||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
||||||
import org.jetbrains.kotlin.codegen.JvmCodegenUtil
|
import org.jetbrains.kotlin.codegen.JvmCodegenUtil
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
|
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
@@ -50,12 +52,16 @@ open class MetadataSerializer(
|
|||||||
|
|
||||||
performanceManager.notifyGenerationStarted()
|
performanceManager.notifyGenerationStarted()
|
||||||
val destDir = checkNotNull(environment.destDir)
|
val destDir = checkNotNull(environment.destDir)
|
||||||
performSerialization(environment.getSourceFiles(), bindingContext, moduleDescriptor, destDir, environment.project)
|
performSerialization(
|
||||||
|
environment.getSourceFiles(), bindingContext, moduleDescriptor, destDir, environment.project,
|
||||||
|
environment.configuration.languageVersionSettings
|
||||||
|
)
|
||||||
performanceManager.notifyGenerationFinished()
|
performanceManager.notifyGenerationFinished()
|
||||||
}
|
}
|
||||||
|
|
||||||
protected open fun performSerialization(
|
protected open fun performSerialization(
|
||||||
files: Collection<KtFile>, bindingContext: BindingContext, module: ModuleDescriptor, destDir: File, project: Project?
|
files: Collection<KtFile>, bindingContext: BindingContext, module: ModuleDescriptor, destDir: File, project: Project?,
|
||||||
|
languageVersionSettings: LanguageVersionSettings,
|
||||||
) {
|
) {
|
||||||
val packageTable = hashMapOf<FqName, PackageParts>()
|
val packageTable = hashMapOf<FqName, PackageParts>()
|
||||||
|
|
||||||
@@ -89,14 +95,17 @@ open class MetadataSerializer(
|
|||||||
val classDescriptor = bindingContext.get(BindingContext.CLASS, classOrObject)
|
val classDescriptor = bindingContext.get(BindingContext.CLASS, classOrObject)
|
||||||
?: error("No descriptor found for class ${classOrObject.fqName}")
|
?: error("No descriptor found for class ${classOrObject.fqName}")
|
||||||
val destFile = File(destDir, getClassFilePath(ClassId(packageFqName, classDescriptor.name)))
|
val destFile = File(destDir, getClassFilePath(ClassId(packageFqName, classDescriptor.name)))
|
||||||
PackageSerializer(listOf(classDescriptor), emptyList(), packageFqName, destFile, project).run()
|
PackageSerializer(
|
||||||
|
listOf(classDescriptor), emptyList(), packageFqName, destFile,
|
||||||
|
languageVersionSettings, project,
|
||||||
|
).run()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (members.isNotEmpty()) {
|
if (members.isNotEmpty()) {
|
||||||
val destFile = File(destDir, getPackageFilePath(packageFqName, file.name))
|
val destFile = File(destDir, getPackageFilePath(packageFqName, file.name))
|
||||||
PackageSerializer(emptyList(), members, packageFqName, destFile, project).run()
|
PackageSerializer(emptyList(), members, packageFqName, destFile, languageVersionSettings, project).run()
|
||||||
|
|
||||||
packageTable.getOrPut(packageFqName) {
|
packageTable.getOrPut(packageFqName) {
|
||||||
PackageParts(packageFqName.asString())
|
PackageParts(packageFqName.asString())
|
||||||
@@ -130,13 +139,14 @@ open class MetadataSerializer(
|
|||||||
private val members: Collection<DeclarationDescriptor>,
|
private val members: Collection<DeclarationDescriptor>,
|
||||||
private val packageFqName: FqName,
|
private val packageFqName: FqName,
|
||||||
private val destFile: File,
|
private val destFile: File,
|
||||||
|
private val languageVersionSettings: LanguageVersionSettings,
|
||||||
private val project: Project? = null
|
private val project: Project? = null
|
||||||
) {
|
) {
|
||||||
private val proto = ProtoBuf.PackageFragment.newBuilder()
|
private val proto = ProtoBuf.PackageFragment.newBuilder()
|
||||||
private val extension = createSerializerExtension()
|
private val extension = createSerializerExtension()
|
||||||
|
|
||||||
fun run() {
|
fun run() {
|
||||||
val serializer = DescriptorSerializer.createTopLevel(extension, project)
|
val serializer = DescriptorSerializer.createTopLevel(extension, languageVersionSettings, project)
|
||||||
serializeClasses(classes, serializer, project)
|
serializeClasses(classes, serializer, project)
|
||||||
serializeMembers(members, serializer)
|
serializeMembers(members, serializer)
|
||||||
serializeStringTable()
|
serializeStringTable()
|
||||||
@@ -147,7 +157,7 @@ open class MetadataSerializer(
|
|||||||
for (descriptor in DescriptorSerializer.sort(classes)) {
|
for (descriptor in DescriptorSerializer.sort(classes)) {
|
||||||
if (descriptor !is ClassDescriptor || descriptor.kind == ClassKind.ENUM_ENTRY) continue
|
if (descriptor !is ClassDescriptor || descriptor.kind == ClassKind.ENUM_ENTRY) continue
|
||||||
|
|
||||||
val serializer = DescriptorSerializer.create(descriptor, extension, parentSerializer, project)
|
val serializer = DescriptorSerializer.create(descriptor, extension, parentSerializer, languageVersionSettings, project)
|
||||||
serializeClasses(
|
serializeClasses(
|
||||||
descriptor.unsubstitutedInnerClassesScope.getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS),
|
descriptor.unsubstitutedInnerClassesScope.getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS),
|
||||||
serializer,
|
serializer,
|
||||||
|
|||||||
+21
-7
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.serialization
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames
|
import org.jetbrains.kotlin.builtins.StandardNames
|
||||||
import org.jetbrains.kotlin.config.LanguageFeature
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
@@ -64,6 +65,7 @@ class FirElementSerializer private constructor(
|
|||||||
private val versionRequirementTable: MutableVersionRequirementTable?,
|
private val versionRequirementTable: MutableVersionRequirementTable?,
|
||||||
private val serializeTypeTableToFunction: Boolean,
|
private val serializeTypeTableToFunction: Boolean,
|
||||||
private val typeApproximator: AbstractTypeApproximator,
|
private val typeApproximator: AbstractTypeApproximator,
|
||||||
|
private val languageVersionSettings: LanguageVersionSettings,
|
||||||
) {
|
) {
|
||||||
private val contractSerializer = FirContractSerializer()
|
private val contractSerializer = FirContractSerializer()
|
||||||
|
|
||||||
@@ -94,6 +96,8 @@ class FirElementSerializer private constructor(
|
|||||||
|
|
||||||
val regularClass = klass as? FirRegularClass
|
val regularClass = klass as? FirRegularClass
|
||||||
val modality = regularClass?.modality ?: Modality.FINAL
|
val modality = regularClass?.modality ?: Modality.FINAL
|
||||||
|
|
||||||
|
val hasEnumEntries = klass.classKind == ClassKind.ENUM_CLASS && languageVersionSettings.supportsFeature(LanguageFeature.EnumEntries)
|
||||||
val flags = Flags.getClassFlags(
|
val flags = Flags.getClassFlags(
|
||||||
klass.nonSourceAnnotations(session).isNotEmpty(),
|
klass.nonSourceAnnotations(session).isNotEmpty(),
|
||||||
ProtoEnumFlags.visibility(regularClass?.let { normalizeVisibility(it) } ?: Visibilities.Local),
|
ProtoEnumFlags.visibility(regularClass?.let { normalizeVisibility(it) } ?: Visibilities.Local),
|
||||||
@@ -104,7 +108,8 @@ class FirElementSerializer private constructor(
|
|||||||
regularClass?.isExternal == true,
|
regularClass?.isExternal == true,
|
||||||
regularClass?.isExpect == true,
|
regularClass?.isExpect == true,
|
||||||
regularClass?.isInline == true,
|
regularClass?.isInline == true,
|
||||||
regularClass?.isFun == true
|
regularClass?.isFun == true,
|
||||||
|
hasEnumEntries,
|
||||||
)
|
)
|
||||||
if (flags != builder.flags) {
|
if (flags != builder.flags) {
|
||||||
builder.flags = flags
|
builder.flags = flags
|
||||||
@@ -880,7 +885,7 @@ class FirElementSerializer private constructor(
|
|||||||
FirElementSerializer(
|
FirElementSerializer(
|
||||||
session, scopeSession, declaration, Interner(typeParameters), extension,
|
session, scopeSession, declaration, Interner(typeParameters), extension,
|
||||||
typeTable, versionRequirementTable, serializeTypeTableToFunction = false,
|
typeTable, versionRequirementTable, serializeTypeTableToFunction = false,
|
||||||
typeApproximator
|
typeApproximator, languageVersionSettings
|
||||||
)
|
)
|
||||||
|
|
||||||
val stringTable: FirElementAwareStringTable
|
val stringTable: FirElementAwareStringTable
|
||||||
@@ -1010,12 +1015,14 @@ class FirElementSerializer private constructor(
|
|||||||
scopeSession: ScopeSession,
|
scopeSession: ScopeSession,
|
||||||
extension: FirSerializerExtension,
|
extension: FirSerializerExtension,
|
||||||
typeApproximator: AbstractTypeApproximator,
|
typeApproximator: AbstractTypeApproximator,
|
||||||
|
languageVersionSettings: LanguageVersionSettings,
|
||||||
): FirElementSerializer =
|
): FirElementSerializer =
|
||||||
FirElementSerializer(
|
FirElementSerializer(
|
||||||
session, scopeSession, null,
|
session, scopeSession, null,
|
||||||
Interner(), extension, MutableTypeTable(), MutableVersionRequirementTable(),
|
Interner(), extension, MutableTypeTable(), MutableVersionRequirementTable(),
|
||||||
serializeTypeTableToFunction = false,
|
serializeTypeTableToFunction = false,
|
||||||
typeApproximator
|
typeApproximator,
|
||||||
|
languageVersionSettings,
|
||||||
)
|
)
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@@ -1024,12 +1031,14 @@ class FirElementSerializer private constructor(
|
|||||||
scopeSession: ScopeSession,
|
scopeSession: ScopeSession,
|
||||||
extension: FirSerializerExtension,
|
extension: FirSerializerExtension,
|
||||||
typeApproximator: AbstractTypeApproximator,
|
typeApproximator: AbstractTypeApproximator,
|
||||||
|
languageVersionSettings: LanguageVersionSettings,
|
||||||
): FirElementSerializer =
|
): FirElementSerializer =
|
||||||
FirElementSerializer(
|
FirElementSerializer(
|
||||||
session, scopeSession, null,
|
session, scopeSession, null,
|
||||||
Interner(), extension, MutableTypeTable(),
|
Interner(), extension, MutableTypeTable(),
|
||||||
versionRequirementTable = null, serializeTypeTableToFunction = true,
|
versionRequirementTable = null, serializeTypeTableToFunction = true,
|
||||||
typeApproximator
|
typeApproximator,
|
||||||
|
languageVersionSettings,
|
||||||
)
|
)
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@@ -1040,13 +1049,17 @@ class FirElementSerializer private constructor(
|
|||||||
extension: FirSerializerExtension,
|
extension: FirSerializerExtension,
|
||||||
parentSerializer: FirElementSerializer?,
|
parentSerializer: FirElementSerializer?,
|
||||||
typeApproximator: AbstractTypeApproximator,
|
typeApproximator: AbstractTypeApproximator,
|
||||||
|
languageVersionSettings: LanguageVersionSettings,
|
||||||
): FirElementSerializer {
|
): FirElementSerializer {
|
||||||
val parentClassId = klass.symbol.classId.outerClassId
|
val parentClassId = klass.symbol.classId.outerClassId
|
||||||
val parent = if (parentClassId != null && !parentClassId.isLocal) {
|
val parent = if (parentClassId != null && !parentClassId.isLocal) {
|
||||||
val parentClass = session.symbolProvider.getClassLikeSymbolByClassId(parentClassId)!!.fir as FirRegularClass
|
val parentClass = session.symbolProvider.getClassLikeSymbolByClassId(parentClassId)!!.fir as FirRegularClass
|
||||||
parentSerializer ?: create(session, scopeSession, parentClass, extension, null, typeApproximator)
|
parentSerializer ?: create(
|
||||||
|
session, scopeSession, parentClass, extension, null, typeApproximator,
|
||||||
|
languageVersionSettings,
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
createTopLevel(session, scopeSession, extension, typeApproximator)
|
createTopLevel(session, scopeSession, extension, typeApproximator, languageVersionSettings)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate type parameter ids for the outer class beforehand, as it would've had happened if we were always
|
// Calculate type parameter ids for the outer class beforehand, as it would've had happened if we were always
|
||||||
@@ -1065,7 +1078,8 @@ class FirElementSerializer private constructor(
|
|||||||
MutableVersionRequirementTable()
|
MutableVersionRequirementTable()
|
||||||
},
|
},
|
||||||
serializeTypeTableToFunction = false,
|
serializeTypeTableToFunction = false,
|
||||||
typeApproximator
|
typeApproximator,
|
||||||
|
languageVersionSettings,
|
||||||
)
|
)
|
||||||
for (typeParameter in klass.typeParameters) {
|
for (typeParameter in klass.typeParameters) {
|
||||||
if (typeParameter !is FirTypeParameter) continue
|
if (typeParameter !is FirTypeParameter) continue
|
||||||
|
|||||||
+10
-3
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.serialization
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.metadata.buildKlibPackageFragment
|
import org.jetbrains.kotlin.backend.common.serialization.metadata.buildKlibPackageFragment
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames
|
import org.jetbrains.kotlin.builtins.StandardNames
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.classId
|
import org.jetbrains.kotlin.fir.declarations.utils.classId
|
||||||
@@ -17,9 +18,14 @@ import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
|
|||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.serialization.SerializableStringTable
|
import org.jetbrains.kotlin.serialization.SerializableStringTable
|
||||||
|
|
||||||
fun serializeSingleFirFile(file: FirFile, session: FirSession, scopeSession: ScopeSession, serializerExtension: FirKLibSerializerExtension): ProtoBuf.PackageFragment {
|
fun serializeSingleFirFile(
|
||||||
|
file: FirFile, session: FirSession, scopeSession: ScopeSession,
|
||||||
|
serializerExtension: FirKLibSerializerExtension,
|
||||||
|
languageVersionSettings: LanguageVersionSettings,
|
||||||
|
): ProtoBuf.PackageFragment {
|
||||||
val approximator = TypeApproximatorForMetadataSerializer(session)
|
val approximator = TypeApproximatorForMetadataSerializer(session)
|
||||||
val packageSerializer = FirElementSerializer.createTopLevel(session, scopeSession, serializerExtension, approximator)
|
val packageSerializer = FirElementSerializer.createTopLevel(session, scopeSession, serializerExtension, approximator,
|
||||||
|
languageVersionSettings)
|
||||||
|
|
||||||
// TODO: typealiases (see klib serializer)
|
// TODO: typealiases (see klib serializer)
|
||||||
// TODO: split package fragment (see klib serializer)
|
// TODO: split package fragment (see klib serializer)
|
||||||
@@ -30,7 +36,8 @@ fun serializeSingleFirFile(file: FirFile, session: FirSession, scopeSession: Sco
|
|||||||
fun List<FirDeclaration>.makeClassesProtoWithNested(): List<Pair<ProtoBuf.Class, Int>> =
|
fun List<FirDeclaration>.makeClassesProtoWithNested(): List<Pair<ProtoBuf.Class, Int>> =
|
||||||
// TODO: filter out expects
|
// TODO: filter out expects
|
||||||
filterIsInstance<FirClass>().sortedBy { it.classId.asFqNameString() }.flatMap {
|
filterIsInstance<FirClass>().sortedBy { it.classId.asFqNameString() }.flatMap {
|
||||||
val classSerializer = FirElementSerializer.create(session, scopeSession, it, serializerExtension, null, approximator)
|
val classSerializer = FirElementSerializer.create(session, scopeSession, it, serializerExtension, null,
|
||||||
|
approximator, languageVersionSettings)
|
||||||
val index = classSerializer.stringTable.getFqNameIndex(it)
|
val index = classSerializer.stringTable.getFqNameIndex(it)
|
||||||
listOf(classSerializer.classProto(it).build() to index) + it.declarations.makeClassesProtoWithNested()
|
listOf(classSerializer.classProto(it).build() to index) + it.declarations.makeClassesProtoWithNested()
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-1
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.codegen.ClassBuilderMode
|
|||||||
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings
|
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
import org.jetbrains.kotlin.config.JvmDefaultMode
|
import org.jetbrains.kotlin.config.JvmDefaultMode
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
@@ -18,6 +19,7 @@ import org.jetbrains.kotlin.fir.backend.FirMetadataSource
|
|||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||||
|
import org.jetbrains.kotlin.fir.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.fir.render
|
import org.jetbrains.kotlin.fir.render
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
|
||||||
@@ -156,8 +158,9 @@ class FirJvmSerializerExtension(
|
|||||||
proto: BuilderType,
|
proto: BuilderType,
|
||||||
extension: GeneratedMessageLite.GeneratedExtension<MessageType, List<ProtoBuf.Property>>
|
extension: GeneratedMessageLite.GeneratedExtension<MessageType, List<ProtoBuf.Property>>
|
||||||
) {
|
) {
|
||||||
|
val languageVersionSettings = session.languageVersionSettings
|
||||||
for (localVariable in localDelegatedProperties) {
|
for (localVariable in localDelegatedProperties) {
|
||||||
val serializer = FirElementSerializer.createForLambda(session, scopeSession,this, approximator)
|
val serializer = FirElementSerializer.createForLambda(session, scopeSession,this, approximator, languageVersionSettings)
|
||||||
proto.addExtension(extension, serializer.propertyProto(localVariable)?.build() ?: continue)
|
proto.addExtension(extension, serializer.propertyProto(localVariable)?.build() ?: continue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-6
@@ -61,7 +61,10 @@ fun makeFirMetadataSerializerForIrClass(
|
|||||||
serializationBindings,
|
serializationBindings,
|
||||||
firSerializerExtension,
|
firSerializerExtension,
|
||||||
approximator,
|
approximator,
|
||||||
makeElementSerializer(irClass.metadata, components.session, components.scopeSession, firSerializerExtension, approximator, parent)
|
makeElementSerializer(
|
||||||
|
irClass.metadata, components.session, components.scopeSession, firSerializerExtension, approximator, parent,
|
||||||
|
context.state.configuration.languageVersionSettings,
|
||||||
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,7 +105,10 @@ fun makeLocalFirMetadataSerializerForMetadataSource(
|
|||||||
serializationBindings,
|
serializationBindings,
|
||||||
firSerializerExtension,
|
firSerializerExtension,
|
||||||
approximator,
|
approximator,
|
||||||
makeElementSerializer(metadata, session, scopeSession, firSerializerExtension, approximator, parent)
|
makeElementSerializer(
|
||||||
|
metadata, session, scopeSession, firSerializerExtension, approximator, parent,
|
||||||
|
configuration.languageVersionSettings,
|
||||||
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,7 +168,8 @@ internal fun makeElementSerializer(
|
|||||||
scopeSession: ScopeSession,
|
scopeSession: ScopeSession,
|
||||||
serializerExtension: FirJvmSerializerExtension,
|
serializerExtension: FirJvmSerializerExtension,
|
||||||
approximator: AbstractTypeApproximator,
|
approximator: AbstractTypeApproximator,
|
||||||
parent: MetadataSerializer?
|
parent: MetadataSerializer?,
|
||||||
|
languageVersionSettings: LanguageVersionSettings
|
||||||
): FirElementSerializer? =
|
): FirElementSerializer? =
|
||||||
when (metadata) {
|
when (metadata) {
|
||||||
is FirMetadataSource.Class -> FirElementSerializer.create(
|
is FirMetadataSource.Class -> FirElementSerializer.create(
|
||||||
@@ -170,17 +177,20 @@ internal fun makeElementSerializer(
|
|||||||
metadata.fir,
|
metadata.fir,
|
||||||
serializerExtension,
|
serializerExtension,
|
||||||
(parent as? FirMetadataSerializer)?.serializer,
|
(parent as? FirMetadataSerializer)?.serializer,
|
||||||
approximator
|
approximator,
|
||||||
|
languageVersionSettings,
|
||||||
)
|
)
|
||||||
is FirMetadataSource.File -> FirElementSerializer.createTopLevel(
|
is FirMetadataSource.File -> FirElementSerializer.createTopLevel(
|
||||||
session, scopeSession,
|
session, scopeSession,
|
||||||
serializerExtension,
|
serializerExtension,
|
||||||
approximator
|
approximator,
|
||||||
|
languageVersionSettings,
|
||||||
)
|
)
|
||||||
is FirMetadataSource.Function -> FirElementSerializer.createForLambda(
|
is FirMetadataSource.Function -> FirElementSerializer.createForLambda(
|
||||||
session, scopeSession,
|
session, scopeSession,
|
||||||
serializerExtension,
|
serializerExtension,
|
||||||
approximator
|
approximator,
|
||||||
|
languageVersionSettings,
|
||||||
)
|
)
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
|||||||
+17
-9
@@ -42,6 +42,7 @@ import org.jetbrains.kotlin.config.CompilerConfiguration
|
|||||||
import org.jetbrains.kotlin.config.IncrementalCompilation
|
import org.jetbrains.kotlin.config.IncrementalCompilation
|
||||||
import org.jetbrains.kotlin.config.LanguageVersion
|
import org.jetbrains.kotlin.config.LanguageVersion
|
||||||
import org.jetbrains.kotlin.config.Services
|
import org.jetbrains.kotlin.config.Services
|
||||||
|
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.incremental.ClasspathChanges.ClasspathSnapshotDisabled
|
import org.jetbrains.kotlin.incremental.ClasspathChanges.ClasspathSnapshotDisabled
|
||||||
import org.jetbrains.kotlin.incremental.ClasspathChanges.ClasspathSnapshotEnabled.IncrementalRun.NoChanges
|
import org.jetbrains.kotlin.incremental.ClasspathChanges.ClasspathSnapshotEnabled.IncrementalRun.NoChanges
|
||||||
import org.jetbrains.kotlin.incremental.ClasspathChanges.ClasspathSnapshotEnabled.IncrementalRun.ToBeComputedByIncrementalCompiler
|
import org.jetbrains.kotlin.incremental.ClasspathChanges.ClasspathSnapshotEnabled.IncrementalRun.ToBeComputedByIncrementalCompiler
|
||||||
@@ -167,18 +168,22 @@ open class IncrementalJvmCompilerRunner(
|
|||||||
|
|
||||||
private var dirtyClasspathChanges: Collection<FqName> = emptySet()
|
private var dirtyClasspathChanges: Collection<FqName> = emptySet()
|
||||||
|
|
||||||
private val psiFileProvider = object {
|
private val messageCollector = BufferingMessageCollector()
|
||||||
val messageCollector = BufferingMessageCollector()
|
private val compilerConfiguration: CompilerConfiguration by lazy {
|
||||||
|
val filterMessageCollector = FilteringMessageCollector(messageCollector) { !it.isError }
|
||||||
|
CompilerConfiguration().apply {
|
||||||
|
put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, filterMessageCollector)
|
||||||
|
configureJdkClasspathRoots()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val psiFileProvider = object {
|
||||||
fun javaFile(file: File): PsiFile? =
|
fun javaFile(file: File): PsiFile? =
|
||||||
psiFileFactory.createFileFromText(file.nameWithoutExtension, JavaLanguage.INSTANCE, file.readText())
|
psiFileFactory.createFileFromText(file.nameWithoutExtension, JavaLanguage.INSTANCE, file.readText())
|
||||||
|
|
||||||
private val psiFileFactory: PsiFileFactory by lazy {
|
private val psiFileFactory: PsiFileFactory by lazy {
|
||||||
val rootDisposable = Disposer.newDisposable()
|
val rootDisposable = Disposer.newDisposable()
|
||||||
val configuration = CompilerConfiguration()
|
val configuration = compilerConfiguration
|
||||||
val filterMessageCollector = FilteringMessageCollector(messageCollector, { !it.isError })
|
|
||||||
configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, filterMessageCollector)
|
|
||||||
configuration.configureJdkClasspathRoots()
|
|
||||||
val environment = KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES)
|
val environment = KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES)
|
||||||
val project = environment.project
|
val project = environment.project
|
||||||
PsiFileFactory.getInstance(project)
|
PsiFileFactory.getInstance(project)
|
||||||
@@ -203,8 +208,8 @@ open class IncrementalJvmCompilerRunner(
|
|||||||
return try {
|
return try {
|
||||||
calculateSourcesToCompileImpl(caches, changedFiles, args, messageCollector, classpathAbiSnapshots, withAbiSnapshot)
|
calculateSourcesToCompileImpl(caches, changedFiles, args, messageCollector, classpathAbiSnapshots, withAbiSnapshot)
|
||||||
} finally {
|
} finally {
|
||||||
psiFileProvider.messageCollector.flush(messageCollector)
|
this.messageCollector.flush(messageCollector)
|
||||||
psiFileProvider.messageCollector.clear()
|
this.messageCollector.clear()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -473,7 +478,10 @@ open class IncrementalJvmCompilerRunner(
|
|||||||
val incrementalComponents = IncrementalCompilationComponentsImpl(targetToCache)
|
val incrementalComponents = IncrementalCompilationComponentsImpl(targetToCache)
|
||||||
register(IncrementalCompilationComponents::class.java, incrementalComponents)
|
register(IncrementalCompilationComponents::class.java, incrementalComponents)
|
||||||
if (usePreciseJavaTracking) {
|
if (usePreciseJavaTracking) {
|
||||||
val changesTracker = JavaClassesTrackerImpl(caches.platformCache, changedUntrackedJavaClasses.toSet())
|
val changesTracker = JavaClassesTrackerImpl(
|
||||||
|
caches.platformCache, changedUntrackedJavaClasses.toSet(),
|
||||||
|
compilerConfiguration.languageVersionSettings,
|
||||||
|
)
|
||||||
changedUntrackedJavaClasses.clear()
|
changedUntrackedJavaClasses.clear()
|
||||||
register(JavaClassesTracker::class.java, changesTracker)
|
register(JavaClassesTracker::class.java, changesTracker)
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.backend.jvm.serialization.JvmIrSerializerSession
|
|||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||||
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
||||||
import org.jetbrains.kotlin.config.JvmSerializeIrMode
|
import org.jetbrains.kotlin.config.JvmSerializeIrMode
|
||||||
|
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.util.irMessageLogger
|
import org.jetbrains.kotlin.ir.util.irMessageLogger
|
||||||
@@ -38,6 +39,7 @@ class JvmIrSerializerImpl(private val configuration: CompilerConfiguration) : Jv
|
|||||||
declarationTable,
|
declarationTable,
|
||||||
mutableMapOf(),
|
mutableMapOf(),
|
||||||
configuration.get(JVMConfigurationKeys.SERIALIZE_IR) ?: JvmSerializeIrMode.NONE,
|
configuration.get(JVMConfigurationKeys.SERIALIZE_IR) ?: JvmSerializeIrMode.NONE,
|
||||||
fileClassFqName
|
fileClassFqName,
|
||||||
|
configuration.languageVersionSettings,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
+13
-5
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.codegen.binding.CodegenBinding
|
|||||||
import org.jetbrains.kotlin.codegen.createFreeFakeLambdaDescriptor
|
import org.jetbrains.kotlin.codegen.createFreeFakeLambdaDescriptor
|
||||||
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings
|
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings
|
||||||
import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension
|
import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension
|
||||||
|
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource
|
import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
||||||
@@ -32,18 +33,25 @@ class DescriptorMetadataSerializer(
|
|||||||
parent: MetadataSerializer?
|
parent: MetadataSerializer?
|
||||||
) : MetadataSerializer {
|
) : MetadataSerializer {
|
||||||
private val serializerExtension = JvmSerializerExtension(serializationBindings, context.state, context.defaultTypeMapper)
|
private val serializerExtension = JvmSerializerExtension(serializationBindings, context.state, context.defaultTypeMapper)
|
||||||
private val serializer: DescriptorSerializer? =
|
private val serializer: DescriptorSerializer? = run {
|
||||||
|
val languageVersionSettings = context.state.configuration.languageVersionSettings
|
||||||
when (val metadata = irClass.metadata) {
|
when (val metadata = irClass.metadata) {
|
||||||
is DescriptorMetadataSource.Class -> DescriptorSerializer.create(
|
is DescriptorMetadataSource.Class -> DescriptorSerializer.create(
|
||||||
metadata.descriptor, serializerExtension, (parent as? DescriptorMetadataSerializer)?.serializer, context.state.project
|
metadata.descriptor, serializerExtension, (parent as? DescriptorMetadataSerializer)?.serializer,
|
||||||
|
languageVersionSettings, context.state.project,
|
||||||
)
|
)
|
||||||
is DescriptorMetadataSource.Script -> DescriptorSerializer.create(
|
is DescriptorMetadataSource.Script -> DescriptorSerializer.create(
|
||||||
metadata.descriptor, serializerExtension, (parent as? DescriptorMetadataSerializer)?.serializer, context.state.project
|
metadata.descriptor, serializerExtension, (parent as? DescriptorMetadataSerializer)?.serializer,
|
||||||
|
languageVersionSettings, context.state.project,
|
||||||
)
|
)
|
||||||
is DescriptorMetadataSource.File -> DescriptorSerializer.createTopLevel(serializerExtension, context.state.project)
|
is DescriptorMetadataSource.File -> DescriptorSerializer.createTopLevel(
|
||||||
is DescriptorMetadataSource.Function -> DescriptorSerializer.createForLambda(serializerExtension)
|
serializerExtension, languageVersionSettings,
|
||||||
|
context.state.project
|
||||||
|
)
|
||||||
|
is DescriptorMetadataSource.Function -> DescriptorSerializer.createForLambda(serializerExtension, languageVersionSettings)
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun serialize(metadata: MetadataSource): Pair<MessageLite, JvmStringTable>? {
|
override fun serialize(metadata: MetadataSource): Pair<MessageLite, JvmStringTable>? {
|
||||||
val localDelegatedProperties = context.localDelegatedProperties[irClass.attributeOwnerId]
|
val localDelegatedProperties = context.localDelegatedProperties[irClass.attributeOwnerId]
|
||||||
|
|||||||
+3
-1
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.backend.common.serialization
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.encodings.*
|
import org.jetbrains.kotlin.backend.common.serialization.encodings.*
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrSimpleTypeNullability
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrSimpleTypeNullability
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.IrFileEntry
|
import org.jetbrains.kotlin.ir.IrFileEntry
|
||||||
@@ -117,6 +118,7 @@ open class IrFileSerializer(
|
|||||||
private val declarationTable: DeclarationTable,
|
private val declarationTable: DeclarationTable,
|
||||||
private val expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>,
|
private val expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>,
|
||||||
private val compatibilityMode: CompatibilityMode,
|
private val compatibilityMode: CompatibilityMode,
|
||||||
|
private val languageVersionSettings: LanguageVersionSettings,
|
||||||
private val bodiesOnlyForInlines: Boolean = false,
|
private val bodiesOnlyForInlines: Boolean = false,
|
||||||
private val skipExpects: Boolean = false,
|
private val skipExpects: Boolean = false,
|
||||||
private val addDebugInfo: Boolean = true,
|
private val addDebugInfo: Boolean = true,
|
||||||
@@ -1228,7 +1230,7 @@ open class IrFileSerializer(
|
|||||||
|
|
||||||
private fun serializeIrClass(clazz: IrClass): ProtoClass {
|
private fun serializeIrClass(clazz: IrClass): ProtoClass {
|
||||||
val proto = ProtoClass.newBuilder()
|
val proto = ProtoClass.newBuilder()
|
||||||
.setBase(serializeIrDeclarationBase(clazz, ClassFlags.encode(clazz)))
|
.setBase(serializeIrDeclarationBase(clazz, ClassFlags.encode(clazz, languageVersionSettings)))
|
||||||
.setName(serializeName(clazz.name))
|
.setName(serializeName(clazz.name))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+6
-2
@@ -6,6 +6,8 @@
|
|||||||
package org.jetbrains.kotlin.backend.common.serialization.encodings
|
package org.jetbrains.kotlin.backend.common.serialization.encodings
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.IrFlags
|
import org.jetbrains.kotlin.backend.common.serialization.IrFlags
|
||||||
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
||||||
@@ -33,15 +35,17 @@ value class ClassFlags(val flags: Long) {
|
|||||||
val isFun: Boolean get() = IrFlags.IS_FUN_INTERFACE.get(flags.toInt())
|
val isFun: Boolean get() = IrFlags.IS_FUN_INTERFACE.get(flags.toInt())
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun encode(clazz: IrClass): Long {
|
fun encode(clazz: IrClass, languageVersionSettings: LanguageVersionSettings): Long {
|
||||||
return clazz.run {
|
return clazz.run {
|
||||||
val hasAnnotation = annotations.isNotEmpty()
|
val hasAnnotation = annotations.isNotEmpty()
|
||||||
val visibility = ProtoEnumFlags.descriptorVisibility(visibility.normalize())
|
val visibility = ProtoEnumFlags.descriptorVisibility(visibility.normalize())
|
||||||
val modality = ProtoEnumFlags.modality(modality)
|
val modality = ProtoEnumFlags.modality(modality)
|
||||||
val kind = ProtoEnumFlags.classKind(kind, isCompanion)
|
val kind = ProtoEnumFlags.classKind(kind, isCompanion)
|
||||||
|
|
||||||
|
val hasEnumEntries = kind == ProtoBuf.Class.Kind.ENUM_CLASS &&
|
||||||
|
languageVersionSettings.supportsFeature(LanguageFeature.EnumEntries)
|
||||||
val flags = IrFlags.getClassFlags(
|
val flags = IrFlags.getClassFlags(
|
||||||
hasAnnotation, visibility, modality, kind, isInner, isData, isExternal, isExpect, isValue, isFun
|
hasAnnotation, visibility, modality, kind, isInner, isData, isExternal, isExpect, isValue, isFun, hasEnumEntries
|
||||||
)
|
)
|
||||||
|
|
||||||
flags.toLong()
|
flags.toLong()
|
||||||
|
|||||||
+2
-2
@@ -58,7 +58,7 @@ abstract class KlibMetadataSerializer(
|
|||||||
)
|
)
|
||||||
return SerializerContext(
|
return SerializerContext(
|
||||||
extension,
|
extension,
|
||||||
DescriptorSerializer.createTopLevel(extension, project)
|
DescriptorSerializer.createTopLevel(extension, languageVersionSettings, project)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,7 +73,7 @@ abstract class KlibMetadataSerializer(
|
|||||||
with(serializerContext) {
|
with(serializerContext) {
|
||||||
val previousSerializer = classSerializer
|
val previousSerializer = classSerializer
|
||||||
|
|
||||||
classSerializer = DescriptorSerializer.create(classDescriptor, serializerExtension, classSerializer, project)
|
classSerializer = DescriptorSerializer.create(classDescriptor, serializerExtension, classSerializer, languageVersionSettings, project)
|
||||||
val classProto = classSerializer.classProto(classDescriptor).build() ?: error("Class not serialized: $classDescriptor")
|
val classProto = classSerializer.classProto(classDescriptor).build() ?: error("Class not serialized: $classDescriptor")
|
||||||
//builder.addClass(classProto)
|
//builder.addClass(classProto)
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,6 @@ import org.jetbrains.kotlin.psi.KtFile
|
|||||||
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
|
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
|
||||||
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
|
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
|
||||||
import org.jetbrains.kotlin.psi2ir.descriptors.IrBuiltInsOverDescriptors
|
import org.jetbrains.kotlin.psi2ir.descriptors.IrBuiltInsOverDescriptors
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.DeclarationStubGeneratorImpl
|
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
|
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.TypeTranslatorImpl
|
import org.jetbrains.kotlin.psi2ir.generators.TypeTranslatorImpl
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
@@ -622,6 +621,7 @@ fun serializeModuleIntoKlib(
|
|||||||
skipExpects = !configuration.expectActualLinker,
|
skipExpects = !configuration.expectActualLinker,
|
||||||
normalizeAbsolutePaths = absolutePathNormalization,
|
normalizeAbsolutePaths = absolutePathNormalization,
|
||||||
sourceBaseDirs = sourceBaseDirs,
|
sourceBaseDirs = sourceBaseDirs,
|
||||||
|
configuration.languageVersionSettings,
|
||||||
signatureClashChecks
|
signatureClashChecks
|
||||||
).serializedIrModule(moduleFragment)
|
).serializedIrModule(moduleFragment)
|
||||||
|
|
||||||
|
|||||||
+3
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir
|
|||||||
import org.jetbrains.kotlin.backend.common.serialization.CompatibilityMode
|
import org.jetbrains.kotlin.backend.common.serialization.CompatibilityMode
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
|
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer
|
import org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
|
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
||||||
@@ -21,6 +22,7 @@ class JsIrFileSerializer(
|
|||||||
expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>,
|
expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>,
|
||||||
compatibilityMode: CompatibilityMode,
|
compatibilityMode: CompatibilityMode,
|
||||||
skipExpects: Boolean,
|
skipExpects: Boolean,
|
||||||
|
languageVersionSettings: LanguageVersionSettings,
|
||||||
bodiesOnlyForInlines: Boolean = false,
|
bodiesOnlyForInlines: Boolean = false,
|
||||||
normalizeAbsolutePaths: Boolean,
|
normalizeAbsolutePaths: Boolean,
|
||||||
sourceBaseDirs: Collection<String>
|
sourceBaseDirs: Collection<String>
|
||||||
@@ -29,6 +31,7 @@ class JsIrFileSerializer(
|
|||||||
declarationTable,
|
declarationTable,
|
||||||
expectDescriptorToSymbol,
|
expectDescriptorToSymbol,
|
||||||
compatibilityMode,
|
compatibilityMode,
|
||||||
|
languageVersionSettings,
|
||||||
bodiesOnlyForInlines = bodiesOnlyForInlines,
|
bodiesOnlyForInlines = bodiesOnlyForInlines,
|
||||||
skipExpects = skipExpects,
|
skipExpects = skipExpects,
|
||||||
normalizeAbsolutePaths = normalizeAbsolutePaths,
|
normalizeAbsolutePaths = normalizeAbsolutePaths,
|
||||||
|
|||||||
+4
-1
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.serialization.CompatibilityMode
|
|||||||
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
|
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.IdSignatureClashTracker
|
import org.jetbrains.kotlin.backend.common.serialization.IdSignatureClashTracker
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.IrModuleSerializer
|
import org.jetbrains.kotlin.backend.common.serialization.IrModuleSerializer
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
@@ -23,6 +24,7 @@ class JsIrModuleSerializer(
|
|||||||
val skipExpects: Boolean,
|
val skipExpects: Boolean,
|
||||||
normalizeAbsolutePaths: Boolean,
|
normalizeAbsolutePaths: Boolean,
|
||||||
sourceBaseDirs: Collection<String>,
|
sourceBaseDirs: Collection<String>,
|
||||||
|
private val languageVersionSettings: LanguageVersionSettings,
|
||||||
shouldCheckSignaturesOnUniqueness: Boolean = true
|
shouldCheckSignaturesOnUniqueness: Boolean = true
|
||||||
) : IrModuleSerializer<JsIrFileSerializer>(messageLogger, compatibilityMode, normalizeAbsolutePaths, sourceBaseDirs) {
|
) : IrModuleSerializer<JsIrFileSerializer>(messageLogger, compatibilityMode, normalizeAbsolutePaths, sourceBaseDirs) {
|
||||||
|
|
||||||
@@ -39,6 +41,7 @@ class JsIrModuleSerializer(
|
|||||||
compatibilityMode = compatibilityMode,
|
compatibilityMode = compatibilityMode,
|
||||||
skipExpects = skipExpects,
|
skipExpects = skipExpects,
|
||||||
normalizeAbsolutePaths = normalizeAbsolutePaths,
|
normalizeAbsolutePaths = normalizeAbsolutePaths,
|
||||||
sourceBaseDirs = sourceBaseDirs
|
sourceBaseDirs = sourceBaseDirs,
|
||||||
|
languageVersionSettings = languageVersionSettings,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
+3
-1
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
|
|||||||
import org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer
|
import org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer
|
||||||
import org.jetbrains.kotlin.backend.jvm.serialization.proto.JvmIr
|
import org.jetbrains.kotlin.backend.jvm.serialization.proto.JvmIr
|
||||||
import org.jetbrains.kotlin.config.JvmSerializeIrMode
|
import org.jetbrains.kotlin.config.JvmSerializeIrMode
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
@@ -25,9 +26,10 @@ class JvmIrSerializerSession(
|
|||||||
expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>,
|
expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>,
|
||||||
private val mode: JvmSerializeIrMode,
|
private val mode: JvmSerializeIrMode,
|
||||||
private val fileClassFqName: FqName,
|
private val fileClassFqName: FqName,
|
||||||
|
languageVersionSettings: LanguageVersionSettings,
|
||||||
skipExpects: Boolean = false,
|
skipExpects: Boolean = false,
|
||||||
) : IrFileSerializer(
|
) : IrFileSerializer(
|
||||||
messageLogger, declarationTable, expectDescriptorToSymbol, CompatibilityMode.CURRENT,
|
messageLogger, declarationTable, expectDescriptorToSymbol, CompatibilityMode.CURRENT, languageVersionSettings,
|
||||||
bodiesOnlyForInlines = mode == JvmSerializeIrMode.INLINE,
|
bodiesOnlyForInlines = mode == JvmSerializeIrMode.INLINE,
|
||||||
skipExpects, normalizeAbsolutePaths = false, sourceBaseDirs = emptyList()
|
skipExpects, normalizeAbsolutePaths = false, sourceBaseDirs = emptyList()
|
||||||
) {
|
) {
|
||||||
|
|||||||
+21
-9
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.builtins.isSuspendFunctionType
|
|||||||
import org.jetbrains.kotlin.builtins.isSuspendFunctionTypeOrSubtype
|
import org.jetbrains.kotlin.builtins.isSuspendFunctionTypeOrSubtype
|
||||||
import org.jetbrains.kotlin.builtins.transformSuspendFunctionToRuntimeFunctionType
|
import org.jetbrains.kotlin.builtins.transformSuspendFunctionToRuntimeFunctionType
|
||||||
import org.jetbrains.kotlin.config.LanguageFeature
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotated
|
import org.jetbrains.kotlin.descriptors.annotations.Annotated
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||||
@@ -51,8 +52,9 @@ class DescriptorSerializer private constructor(
|
|||||||
val typeTable: MutableTypeTable,
|
val typeTable: MutableTypeTable,
|
||||||
private val versionRequirementTable: MutableVersionRequirementTable?,
|
private val versionRequirementTable: MutableVersionRequirementTable?,
|
||||||
private val serializeTypeTableToFunction: Boolean,
|
private val serializeTypeTableToFunction: Boolean,
|
||||||
|
private val languageVersionSettings: LanguageVersionSettings,
|
||||||
val plugins: List<DescriptorSerializerPlugin> = emptyList(),
|
val plugins: List<DescriptorSerializerPlugin> = emptyList(),
|
||||||
val typeAttributeTranslators: TypeAttributeTranslators? = null
|
val typeAttributeTranslators: TypeAttributeTranslators? = null,
|
||||||
) {
|
) {
|
||||||
private val contractSerializer = ContractSerializer()
|
private val contractSerializer = ContractSerializer()
|
||||||
|
|
||||||
@@ -66,7 +68,8 @@ class DescriptorSerializer private constructor(
|
|||||||
private fun createChildSerializer(descriptor: DeclarationDescriptor): DescriptorSerializer =
|
private fun createChildSerializer(descriptor: DeclarationDescriptor): DescriptorSerializer =
|
||||||
DescriptorSerializer(
|
DescriptorSerializer(
|
||||||
descriptor, Interner(typeParameters), extension, typeTable, versionRequirementTable,
|
descriptor, Interner(typeParameters), extension, typeTable, versionRequirementTable,
|
||||||
serializeTypeTableToFunction = false, typeAttributeTranslators = typeAttributeTranslators
|
serializeTypeTableToFunction = false, typeAttributeTranslators = typeAttributeTranslators,
|
||||||
|
languageVersionSettings = languageVersionSettings,
|
||||||
)
|
)
|
||||||
|
|
||||||
val stringTable: DescriptorAwareStringTable
|
val stringTable: DescriptorAwareStringTable
|
||||||
@@ -86,6 +89,8 @@ class DescriptorSerializer private constructor(
|
|||||||
fun classProto(classDescriptor: ClassDescriptor): ProtoBuf.Class.Builder = withNewMetDefinitelyNotNullType {
|
fun classProto(classDescriptor: ClassDescriptor): ProtoBuf.Class.Builder = withNewMetDefinitelyNotNullType {
|
||||||
val builder = ProtoBuf.Class.newBuilder()
|
val builder = ProtoBuf.Class.newBuilder()
|
||||||
|
|
||||||
|
val hasEnumEntries = classDescriptor.kind == ClassKind.ENUM_CLASS &&
|
||||||
|
languageVersionSettings.supportsFeature(LanguageFeature.EnumEntries)
|
||||||
val flags = Flags.getClassFlags(
|
val flags = Flags.getClassFlags(
|
||||||
// Since 1.4.30 isInline & isValue are the same flag. To distinguish them we generate @JvmInline annotation.
|
// Since 1.4.30 isInline & isValue are the same flag. To distinguish them we generate @JvmInline annotation.
|
||||||
// See ClassDescriptor.isInlineClass() function.
|
// See ClassDescriptor.isInlineClass() function.
|
||||||
@@ -94,7 +99,7 @@ class DescriptorSerializer private constructor(
|
|||||||
ProtoEnumFlags.modality(classDescriptor.modality),
|
ProtoEnumFlags.modality(classDescriptor.modality),
|
||||||
ProtoEnumFlags.classKind(classDescriptor.kind, classDescriptor.isCompanionObject),
|
ProtoEnumFlags.classKind(classDescriptor.kind, classDescriptor.isCompanionObject),
|
||||||
classDescriptor.isInner, classDescriptor.isData, classDescriptor.isExternal, classDescriptor.isExpect,
|
classDescriptor.isInner, classDescriptor.isData, classDescriptor.isExternal, classDescriptor.isExpect,
|
||||||
classDescriptor.isValueClass(), classDescriptor.isFun
|
classDescriptor.isValueClass(), classDescriptor.isFun, hasEnumEntries,
|
||||||
)
|
)
|
||||||
if (flags != builder.flags) {
|
if (flags != builder.flags) {
|
||||||
builder.flags = flags
|
builder.flags = flags
|
||||||
@@ -861,16 +866,21 @@ class DescriptorSerializer private constructor(
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun createTopLevel(extension: SerializerExtension, project: Project? = null): DescriptorSerializer =
|
fun createTopLevel(
|
||||||
|
extension: SerializerExtension, languageVersionSettings: LanguageVersionSettings,
|
||||||
|
project: Project? = null
|
||||||
|
): DescriptorSerializer =
|
||||||
DescriptorSerializer(
|
DescriptorSerializer(
|
||||||
null, Interner(), extension, MutableTypeTable(), MutableVersionRequirementTable(), serializeTypeTableToFunction = false,
|
null, Interner(), extension, MutableTypeTable(), MutableVersionRequirementTable(), serializeTypeTableToFunction = false,
|
||||||
typeAttributeTranslators = project?.let { TypeAttributeTranslatorExtension.createTranslators(it) }
|
typeAttributeTranslators = project?.let { TypeAttributeTranslatorExtension.createTranslators(it) },
|
||||||
|
languageVersionSettings = languageVersionSettings,
|
||||||
)
|
)
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun createForLambda(extension: SerializerExtension): DescriptorSerializer =
|
fun createForLambda(extension: SerializerExtension, languageVersionSettings: LanguageVersionSettings): DescriptorSerializer =
|
||||||
DescriptorSerializer(
|
DescriptorSerializer(
|
||||||
null, Interner(), extension, MutableTypeTable(), versionRequirementTable = null, serializeTypeTableToFunction = true
|
null, Interner(), extension, MutableTypeTable(), versionRequirementTable = null,
|
||||||
|
serializeTypeTableToFunction = true, languageVersionSettings = languageVersionSettings,
|
||||||
)
|
)
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@@ -878,13 +888,14 @@ class DescriptorSerializer private constructor(
|
|||||||
descriptor: ClassDescriptor,
|
descriptor: ClassDescriptor,
|
||||||
extension: SerializerExtension,
|
extension: SerializerExtension,
|
||||||
parentSerializer: DescriptorSerializer?,
|
parentSerializer: DescriptorSerializer?,
|
||||||
|
languageVersionSettings: LanguageVersionSettings,
|
||||||
project: Project? = null
|
project: Project? = null
|
||||||
): DescriptorSerializer {
|
): DescriptorSerializer {
|
||||||
val container = descriptor.containingDeclaration
|
val container = descriptor.containingDeclaration
|
||||||
val parent = if (container is ClassDescriptor)
|
val parent = if (container is ClassDescriptor)
|
||||||
parentSerializer ?: create(container, extension, null, project)
|
parentSerializer ?: create(container, extension, null, languageVersionSettings, project)
|
||||||
else
|
else
|
||||||
createTopLevel(extension)
|
createTopLevel(extension, languageVersionSettings)
|
||||||
val plugins = project?.let { DescriptorSerializerPlugin.getInstances(it) }.orEmpty()
|
val plugins = project?.let { DescriptorSerializerPlugin.getInstances(it) }.orEmpty()
|
||||||
val typeAttributeTranslators = project?.let { TypeAttributeTranslatorExtension.createTranslators(it) }
|
val typeAttributeTranslators = project?.let { TypeAttributeTranslatorExtension.createTranslators(it) }
|
||||||
|
|
||||||
@@ -899,6 +910,7 @@ class DescriptorSerializer private constructor(
|
|||||||
if (container is ClassDescriptor && !isVersionRequirementTableWrittenCorrectly(extension.metadataVersion))
|
if (container is ClassDescriptor && !isVersionRequirementTableWrittenCorrectly(extension.metadataVersion))
|
||||||
parent.versionRequirementTable else MutableVersionRequirementTable(),
|
parent.versionRequirementTable else MutableVersionRequirementTable(),
|
||||||
serializeTypeTableToFunction = false,
|
serializeTypeTableToFunction = false,
|
||||||
|
languageVersionSettings,
|
||||||
plugins,
|
plugins,
|
||||||
typeAttributeTranslators
|
typeAttributeTranslators
|
||||||
)
|
)
|
||||||
|
|||||||
+2
-1
@@ -96,7 +96,8 @@ class Fir2IrJsResultsConverter(
|
|||||||
firFile,
|
firFile,
|
||||||
components.session,
|
components.session,
|
||||||
components.scopeSession,
|
components.scopeSession,
|
||||||
FirKLibSerializerExtension(components.session, metadataVersion, FirElementAwareSerializableStringTable())
|
FirKLibSerializerExtension(components.session, metadataVersion, FirElementAwareSerializableStringTable()),
|
||||||
|
configuration.languageVersionSettings,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,7 +145,8 @@ abstract class AbstractKlibTextTestCase : CodegenTestCase() {
|
|||||||
CompatibilityMode.CURRENT,
|
CompatibilityMode.CURRENT,
|
||||||
skipExpect,
|
skipExpect,
|
||||||
false,
|
false,
|
||||||
emptyList()
|
emptyList(),
|
||||||
|
myEnvironment.configuration.languageVersionSettings,
|
||||||
).serializedIrModule(irModuleFragment)
|
).serializedIrModule(irModuleFragment)
|
||||||
|
|
||||||
val moduleDescriptor = irModuleFragment.descriptor
|
val moduleDescriptor = irModuleFragment.descriptor
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ public class Flags {
|
|||||||
public static final BooleanFlagField IS_EXPECT_CLASS = FlagField.booleanAfter(IS_EXTERNAL_CLASS);
|
public static final BooleanFlagField IS_EXPECT_CLASS = FlagField.booleanAfter(IS_EXTERNAL_CLASS);
|
||||||
public static final BooleanFlagField IS_VALUE_CLASS = FlagField.booleanAfter(IS_EXPECT_CLASS);
|
public static final BooleanFlagField IS_VALUE_CLASS = FlagField.booleanAfter(IS_EXPECT_CLASS);
|
||||||
public static final BooleanFlagField IS_FUN_INTERFACE = FlagField.booleanAfter(IS_VALUE_CLASS);
|
public static final BooleanFlagField IS_FUN_INTERFACE = FlagField.booleanAfter(IS_VALUE_CLASS);
|
||||||
|
private static final BooleanFlagField HAS_ENUM_ENTRIES = FlagField.booleanAfter(IS_FUN_INTERFACE);
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
@@ -100,7 +101,8 @@ public class Flags {
|
|||||||
boolean isExternal,
|
boolean isExternal,
|
||||||
boolean isExpect,
|
boolean isExpect,
|
||||||
boolean isValue,
|
boolean isValue,
|
||||||
boolean isFun
|
boolean isFun,
|
||||||
|
boolean hasEnumEntries
|
||||||
) {
|
) {
|
||||||
return HAS_ANNOTATIONS.toFlags(hasAnnotations)
|
return HAS_ANNOTATIONS.toFlags(hasAnnotations)
|
||||||
| MODALITY.toFlags(modality)
|
| MODALITY.toFlags(modality)
|
||||||
@@ -112,6 +114,7 @@ public class Flags {
|
|||||||
| IS_EXPECT_CLASS.toFlags(isExpect)
|
| IS_EXPECT_CLASS.toFlags(isExpect)
|
||||||
| IS_VALUE_CLASS.toFlags(isValue)
|
| IS_VALUE_CLASS.toFlags(isValue)
|
||||||
| IS_FUN_INTERFACE.toFlags(isFun)
|
| IS_FUN_INTERFACE.toFlags(isFun)
|
||||||
|
| HAS_ENUM_ENTRIES.toFlags(hasEnumEntries)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -185,14 +185,14 @@ object KotlinJavascriptSerializationUtil {
|
|||||||
for (descriptor in descriptors) {
|
for (descriptor in descriptors) {
|
||||||
if (descriptor !is ClassDescriptor || skip(descriptor)) continue
|
if (descriptor !is ClassDescriptor || skip(descriptor)) continue
|
||||||
|
|
||||||
val serializer = DescriptorSerializer.create(descriptor, extension, parentSerializer, project)
|
val serializer = DescriptorSerializer.create(descriptor, extension, parentSerializer, languageVersionSettings, project)
|
||||||
serializeClasses(descriptor.unsubstitutedInnerClassesScope.getContributedDescriptors(), serializer)
|
serializeClasses(descriptor.unsubstitutedInnerClassesScope.getContributedDescriptors(), serializer)
|
||||||
val classProto = serializer.classProto(descriptor).build() ?: error("Class not serialized: $descriptor")
|
val classProto = serializer.classProto(descriptor).build() ?: error("Class not serialized: $descriptor")
|
||||||
builder.addClass_(classProto)
|
builder.addClass_(classProto)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val serializer = DescriptorSerializer.createTopLevel(extension)
|
val serializer = DescriptorSerializer.createTopLevel(extension, languageVersionSettings)
|
||||||
serializeClasses(classDescriptors, serializer)
|
serializeClasses(classDescriptors, serializer)
|
||||||
|
|
||||||
val stringTable = extension.stringTable
|
val stringTable = extension.stringTable
|
||||||
|
|||||||
@@ -535,7 +535,8 @@ class GenerateIrRuntime {
|
|||||||
CompatibilityMode.CURRENT,
|
CompatibilityMode.CURRENT,
|
||||||
skipExpects = true,
|
skipExpects = true,
|
||||||
normalizeAbsolutePaths = false,
|
normalizeAbsolutePaths = false,
|
||||||
emptyList()
|
emptyList(),
|
||||||
|
configuration.languageVersionSettings,
|
||||||
).serializedIrModule(module)
|
).serializedIrModule(module)
|
||||||
return serializedIr
|
return serializedIr
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-2
@@ -53,7 +53,9 @@ internal fun PhaseContext.firSerializer(
|
|||||||
firFile,
|
firFile,
|
||||||
input.session,
|
input.session,
|
||||||
input.scopeSession,
|
input.scopeSession,
|
||||||
FirNativeKLibSerializerExtension(input.session, metadataVersion, FirElementAwareSerializableStringTable()))
|
FirNativeKLibSerializerExtension(input.session, metadataVersion, FirElementAwareSerializableStringTable()),
|
||||||
|
configuration.languageVersionSettings,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,7 +84,8 @@ internal fun PhaseContext.serializeNativeModule(
|
|||||||
skipExpects = !expectActualLinker,
|
skipExpects = !expectActualLinker,
|
||||||
CompatibilityMode.CURRENT,
|
CompatibilityMode.CURRENT,
|
||||||
normalizeAbsolutePaths = absolutePathNormalization,
|
normalizeAbsolutePaths = absolutePathNormalization,
|
||||||
sourceBaseDirs = sourceBaseDirs
|
sourceBaseDirs = sourceBaseDirs,
|
||||||
|
languageVersionSettings = configuration.languageVersionSettings,
|
||||||
).serializedIrModule(moduleFragment)
|
).serializedIrModule(moduleFragment)
|
||||||
|
|
||||||
val moduleDescriptor = moduleFragment.descriptor
|
val moduleDescriptor = moduleFragment.descriptor
|
||||||
|
|||||||
+1
@@ -48,6 +48,7 @@ internal val SerializerPhase = createSimpleNamedCompilerPhase<PhaseContext, Seri
|
|||||||
compatibilityMode = CompatibilityMode.CURRENT,
|
compatibilityMode = CompatibilityMode.CURRENT,
|
||||||
normalizeAbsolutePaths = normalizeAbsolutePaths,
|
normalizeAbsolutePaths = normalizeAbsolutePaths,
|
||||||
sourceBaseDirs = relativePathBase,
|
sourceBaseDirs = relativePathBase,
|
||||||
|
languageVersionSettings = config.languageVersionSettings,
|
||||||
).serializedIrModule(ir)
|
).serializedIrModule(ir)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-1
@@ -4,6 +4,7 @@ import org.jetbrains.kotlin.backend.common.serialization.CompatibilityMode
|
|||||||
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
|
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer
|
import org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer
|
||||||
import org.jetbrains.kotlin.backend.konan.RuntimeNames
|
import org.jetbrains.kotlin.backend.konan.RuntimeNames
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
|
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
@@ -17,11 +18,13 @@ class KonanIrFileSerializer(
|
|||||||
declarationTable: DeclarationTable,
|
declarationTable: DeclarationTable,
|
||||||
expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>,
|
expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>,
|
||||||
skipExpects: Boolean,
|
skipExpects: Boolean,
|
||||||
|
languageVersionSettings: LanguageVersionSettings,
|
||||||
bodiesOnlyForInlines: Boolean = false,
|
bodiesOnlyForInlines: Boolean = false,
|
||||||
compatibilityMode: CompatibilityMode,
|
compatibilityMode: CompatibilityMode,
|
||||||
normalizeAbsolutePaths: Boolean,
|
normalizeAbsolutePaths: Boolean,
|
||||||
sourceBaseDirs: Collection<String>
|
sourceBaseDirs: Collection<String>
|
||||||
): IrFileSerializer(messageLogger, declarationTable, expectDescriptorToSymbol, compatibilityMode, bodiesOnlyForInlines, skipExpects, normalizeAbsolutePaths = normalizeAbsolutePaths, sourceBaseDirs = sourceBaseDirs) {
|
): IrFileSerializer(messageLogger, declarationTable, expectDescriptorToSymbol, compatibilityMode, languageVersionSettings,
|
||||||
|
bodiesOnlyForInlines, skipExpects, normalizeAbsolutePaths = normalizeAbsolutePaths, sourceBaseDirs = sourceBaseDirs) {
|
||||||
|
|
||||||
override fun backendSpecificExplicitRoot(node: IrAnnotationContainer): Boolean {
|
override fun backendSpecificExplicitRoot(node: IrAnnotationContainer): Boolean {
|
||||||
val fqn = when (node) {
|
val fqn = when (node) {
|
||||||
|
|||||||
+9
-2
@@ -3,6 +3,7 @@ package org.jetbrains.kotlin.backend.konan.serialization
|
|||||||
import org.jetbrains.kotlin.backend.common.serialization.CompatibilityMode
|
import org.jetbrains.kotlin.backend.common.serialization.CompatibilityMode
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.IrModuleSerializer
|
import org.jetbrains.kotlin.backend.common.serialization.IrModuleSerializer
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.interop.IrProviderForCEnumAndCStructStubs
|
import org.jetbrains.kotlin.backend.konan.ir.interop.IrProviderForCEnumAndCStructStubs
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
@@ -16,7 +17,8 @@ class KonanIrModuleSerializer(
|
|||||||
val skipExpects: Boolean,
|
val skipExpects: Boolean,
|
||||||
compatibilityMode: CompatibilityMode,
|
compatibilityMode: CompatibilityMode,
|
||||||
normalizeAbsolutePaths: Boolean,
|
normalizeAbsolutePaths: Boolean,
|
||||||
sourceBaseDirs: Collection<String>
|
sourceBaseDirs: Collection<String>,
|
||||||
|
private val languageVersionSettings: LanguageVersionSettings,
|
||||||
) : IrModuleSerializer<KonanIrFileSerializer>(messageLogger, compatibilityMode, normalizeAbsolutePaths, sourceBaseDirs) {
|
) : IrModuleSerializer<KonanIrFileSerializer>(messageLogger, compatibilityMode, normalizeAbsolutePaths, sourceBaseDirs) {
|
||||||
|
|
||||||
private val globalDeclarationTable = KonanGlobalDeclarationTable(irBuiltIns)
|
private val globalDeclarationTable = KonanGlobalDeclarationTable(irBuiltIns)
|
||||||
@@ -31,5 +33,10 @@ class KonanIrModuleSerializer(
|
|||||||
file.fileEntry.name != IrProviderForCEnumAndCStructStubs.cTypeDefinitionsFileName
|
file.fileEntry.name != IrProviderForCEnumAndCStructStubs.cTypeDefinitionsFileName
|
||||||
|
|
||||||
override fun createSerializerForFile(file: IrFile): KonanIrFileSerializer =
|
override fun createSerializerForFile(file: IrFile): KonanIrFileSerializer =
|
||||||
KonanIrFileSerializer(messageLogger, KonanDeclarationTable(globalDeclarationTable), expectDescriptorToSymbol, skipExpects = skipExpects, compatibilityMode = compatibilityMode, normalizeAbsolutePaths = normalizeAbsolutePaths, sourceBaseDirs = sourceBaseDirs)
|
KonanIrFileSerializer(messageLogger, KonanDeclarationTable(globalDeclarationTable), expectDescriptorToSymbol,
|
||||||
|
skipExpects = skipExpects,
|
||||||
|
compatibilityMode = compatibilityMode,
|
||||||
|
normalizeAbsolutePaths = normalizeAbsolutePaths,
|
||||||
|
sourceBaseDirs = sourceBaseDirs,
|
||||||
|
languageVersionSettings = languageVersionSettings)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user