diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt index 1e7da298e68..5d4e71fc46a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt @@ -83,6 +83,7 @@ class SyntheticClassOrObjectDescriptor( override fun isExpect() = false override fun isActual() = false override fun isFun() = false + override fun isValue() = false override fun getCompanionObjectDescriptor(): ClassDescriptorWithResolutionScopes? = null override fun getTypeConstructor(): TypeConstructor = typeConstructor diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java index e254e8f4f6b..e0de663ae1d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java @@ -87,6 +87,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes private final boolean isExpect; private final boolean isActual; private final boolean isFun; + private final boolean isValue; private final Annotations annotations; private final Annotations danglingAnnotations; @@ -160,6 +161,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes containingDeclaration instanceof ClassDescriptor && ((ClassDescriptor) containingDeclaration).isExpect(); this.isFun = modifierList != null && PsiUtilsKt.hasFunModifier(modifierList); + this.isValue = modifierList != null && PsiUtilsKt.hasValueModifier(modifierList); // Annotation entries are taken from both own annotations (if any) and object literal annotations (if any) List annotationEntries = new ArrayList<>(); @@ -552,6 +554,11 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes return isFun; } + @Override + public boolean isValue() { + return isValue; + } + @NotNull @Override public Annotations getAnnotations() { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBasedDescriptors.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBasedDescriptors.kt index c70f623de37..4946c8a249d 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBasedDescriptors.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBasedDescriptors.kt @@ -604,6 +604,9 @@ open class IrBasedClassDescriptor(owner: IrClass) : ClassDescriptor, IrBasedDecl override fun isFun() = owner.isFun + // In IR, inline and value are synonyms + override fun isValue() = owner.isInline + override fun getThisAsReceiverParameter() = owner.thisReceiver?.toIrBasedDescriptor() as ReceiverParameterDescriptor override fun getUnsubstitutedPrimaryConstructor() = @@ -704,6 +707,8 @@ open class IrBasedEnumEntryDescriptor(owner: IrEnumEntry) : ClassDescriptor, IrB override fun isFun() = false + override fun isValue() = false + override fun getThisAsReceiverParameter() = (owner.parent as IrClass).toIrBasedDescriptor().thisAsReceiverParameter override fun getUnsubstitutedPrimaryConstructor(): ClassConstructorDescriptor? { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt index 56c6d5ed28a..83de1535e70 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt @@ -583,6 +583,8 @@ open class WrappedClassDescriptor : ClassDescriptor, WrappedDeclarationDescripto override fun isFun() = owner.isFun + override fun isValue() = owner.isInline + override fun getThisAsReceiverParameter() = owner.thisReceiver?.descriptor as ReceiverParameterDescriptor override fun getUnsubstitutedPrimaryConstructor() = @@ -682,6 +684,8 @@ open class WrappedScriptDescriptor : ScriptDescriptor, WrappedDeclarationDescrip override fun isFun() = false + override fun isValue() = false + override fun getThisAsReceiverParameter() = owner.thisReceiver.descriptor as ReceiverParameterDescriptor override fun getUnsubstitutedPrimaryConstructor() = TODO() @@ -822,6 +826,8 @@ open class WrappedEnumEntryDescriptor : ClassDescriptor, WrappedDeclarationDescr override fun isFun() = false + override fun isValue() = false + override fun getThisAsReceiverParameter() = (owner.parent as IrClass).descriptor.thisAsReceiverParameter override fun getUnsubstitutedPrimaryConstructor(): ClassConstructorDescriptor? { diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/psiUtils.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/psiUtils.kt index 0c60c6088b2..dec4596cacc 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/psiUtils.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/psiUtils.kt @@ -452,6 +452,8 @@ fun KtModifierList.hasSuspendModifier() = hasModifier(KtTokens.SUSPEND_KEYWORD) fun KtModifierList.hasFunModifier() = hasModifier(KtTokens.FUN_KEYWORD) +fun KtModifierList.hasValueModifier() = hasModifier(KtTokens.VALUE_KEYWORD) + fun ASTNode.children() = generateSequence(firstChildNode) { node -> node.treeNext } fun ASTNode.parents() = generateSequence(treeParent) { node -> node.treeParent } diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt index 6f989521869..5a5c60b822d 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt @@ -105,6 +105,7 @@ class LazyJavaClassDescriptor( override fun isExpect() = false override fun isActual() = false override fun isFun() = false + override fun isValue() = false private val typeConstructor = LazyJavaClassTypeConstructor() override fun getTypeConstructor(): TypeConstructor = typeConstructor diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionClassDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionClassDescriptor.kt index 8c1c498dbd6..6260b799b20 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionClassDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionClassDescriptor.kt @@ -81,6 +81,7 @@ class FunctionClassDescriptor( override fun isData() = false override fun isInline() = false override fun isFun() = false + override fun isValue() = false override fun isExpect() = false override fun isActual() = false override fun isExternal() = false diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java index 32a28a37868..1dc500cd374 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java @@ -72,6 +72,8 @@ public interface ClassDescriptor extends ClassifierDescriptorWithTypeParameters, boolean isFun(); + boolean isValue(); + @NotNull ReceiverParameterDescriptor getThisAsReceiverParameter(); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/NotFoundClasses.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/NotFoundClasses.kt index a170029b278..13aae6577c1 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/NotFoundClasses.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/NotFoundClasses.kt @@ -71,6 +71,7 @@ class NotFoundClasses(private val storageManager: StorageManager, private val mo override fun isData() = false override fun isInline() = false override fun isFun() = false + override fun isValue() = false override fun isExpect() = false override fun isActual() = false override fun isExternal() = false diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassDescriptorImpl.java index d0ea87359bd..b6ff4a1a21f 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassDescriptorImpl.java @@ -148,6 +148,11 @@ public class ClassDescriptorImpl extends ClassDescriptorBase { return false; } + @Override + public boolean isValue() { + return false; + } + @Override public boolean isInner() { return false; diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java index 31dc3ecbbed..32340869521 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java @@ -138,6 +138,11 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase { return false; } + @Override + public boolean isValue() { + return false; + } + @Override public boolean isFun() { return false; diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java index 0e1e3f556d5..b16b085e013 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java @@ -248,6 +248,11 @@ public class LazySubstitutingClassDescriptor extends ModuleAwareClassDescriptor return original.isFun(); } + @Override + public boolean isValue() { + return original.isValue(); + } + @Override public boolean isExternal() { return original.isExternal(); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/MutableClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/MutableClassDescriptor.java index 1b525c6b471..de5fbac9c3a 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/MutableClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/MutableClassDescriptor.java @@ -104,6 +104,11 @@ public class MutableClassDescriptor extends ClassDescriptorBase { return false; } + @Override + public boolean isValue() { + return false; + } + @Override public boolean isCompanionObject() { return false; diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt index 69efe153489..f74ab63e0b8 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt @@ -98,7 +98,7 @@ class DeserializedClassDescriptor( override fun isData() = Flags.IS_DATA.get(classProto.flags) - override fun isInline() = Flags.IS_INLINE_CLASS.get(classProto.flags) + override fun isInline() = Flags.IS_INLINE_CLASS.get(classProto.flags) && metadataVersion.isAtMost(1, 4, 1) override fun isExpect() = Flags.IS_EXPECT_CLASS.get(classProto.flags) @@ -108,6 +108,8 @@ class DeserializedClassDescriptor( override fun isFun() = Flags.IS_FUN_INTERFACE.get(classProto.flags) + override fun isValue() = Flags.IS_INLINE_CLASS.get(classProto.flags) && metadataVersion.isAtLeast(1, 4, 2) + override fun getUnsubstitutedMemberScope(kotlinTypeRefiner: KotlinTypeRefiner): MemberScope = memberScopeHolder.getScope(kotlinTypeRefiner) diff --git a/core/metadata/src/org/jetbrains/kotlin/metadata/deserialization/BinaryVersion.kt b/core/metadata/src/org/jetbrains/kotlin/metadata/deserialization/BinaryVersion.kt index 5463c8c8434..10163e9a308 100644 --- a/core/metadata/src/org/jetbrains/kotlin/metadata/deserialization/BinaryVersion.kt +++ b/core/metadata/src/org/jetbrains/kotlin/metadata/deserialization/BinaryVersion.kt @@ -48,6 +48,19 @@ abstract class BinaryVersion(private vararg val numbers: Int) { return this.patch >= patch } + fun isAtMost(version: BinaryVersion): Boolean = + isAtMost(version.major, version.minor, version.patch) + + fun isAtMost(major: Int, minor: Int, patch: Int): Boolean { + if (this.major < major) return true + if (this.major > major) return false + + if (this.minor < minor) return true + if (this.minor > minor) return false + + return this.patch <= patch + } + override fun toString(): String { val versions = toArray().takeWhile { it != UNKNOWN } return if (versions.isEmpty()) "unknown" else versions.joinToString(".") diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedClassDescriptor.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedClassDescriptor.kt index 8261964c993..3f67f514d36 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedClassDescriptor.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedClassDescriptor.kt @@ -80,6 +80,7 @@ class CommonizedClassDescriptor( override fun isExpect() = isExpect override fun isActual() = isActual override fun isFun() = false // TODO: modifier "fun" should be accessible from here too + override fun isValue() = false // TODO: modifier "value" should be accessible from here too override fun getUnsubstitutedMemberScope(kotlinTypeRefiner: KotlinTypeRefiner): CommonizedMemberScope { check(kotlinTypeRefiner == KotlinTypeRefiner.Default) {