diff --git a/build-common/test/org/jetbrains/kotlin/metadata/DebugProtoBuf.java b/build-common/test/org/jetbrains/kotlin/metadata/DebugProtoBuf.java index e3d0de92bd6..a2b354548fe 100644 --- a/build-common/test/org/jetbrains/kotlin/metadata/DebugProtoBuf.java +++ b/build-common/test/org/jetbrains/kotlin/metadata/DebugProtoBuf.java @@ -10100,6 +10100,7 @@ public final class DebugProtoBuf { *isExternal *isExpect *isInline + *isFun * */ boolean hasFlags(); @@ -10116,6 +10117,7 @@ public final class DebugProtoBuf { *isExternal *isExpect *isInline + *isFun * */ int getFlags(); @@ -10853,6 +10855,7 @@ public final class DebugProtoBuf { *isExternal *isExpect *isInline + *isFun * */ public boolean hasFlags() { @@ -10871,6 +10874,7 @@ public final class DebugProtoBuf { *isExternal *isExpect *isInline + *isFun * */ public int getFlags() { @@ -12242,6 +12246,7 @@ public final class DebugProtoBuf { *isExternal *isExpect *isInline + *isFun * */ public boolean hasFlags() { @@ -12260,6 +12265,7 @@ public final class DebugProtoBuf { *isExternal *isExpect *isInline + *isFun * */ public int getFlags() { @@ -12278,6 +12284,7 @@ public final class DebugProtoBuf { *isExternal *isExpect *isInline + *isFun * */ public Builder setFlags(int value) { @@ -12299,6 +12306,7 @@ public final class DebugProtoBuf { *isExternal *isExpect *isInline + *isFun * */ public Builder clearFlags() { diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index 66349b64f71..99d07495113 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -168,7 +168,8 @@ class Fir2IrDeclarationStorage( isData = regularClass?.isData == true, isExternal = regularClass?.isExternal == true, isInline = regularClass?.isInline == true, - isExpect = regularClass?.isExpect == true + isExpect = regularClass?.isExpect == true, + isFun = false // TODO ).apply { descriptor.bind(this) if (setParent && regularClass != null) { @@ -215,7 +216,8 @@ class Fir2IrDeclarationStorage( startOffset, endOffset, origin, symbol, Name.special(""), anonymousObject.classKind, Visibilities.LOCAL, modality, - isCompanion = false, isInner = false, isData = false, isExternal = false, isInline = false, isExpect = false + isCompanion = false, isInner = false, isData = false, isExternal = false, + isInline = false, isExpect = false, isFun = false ).apply { descriptor.bind(this) declareThisReceiver() 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 2b08cde5dfa..070ad1fa064 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt @@ -82,6 +82,7 @@ class SyntheticClassOrObjectDescriptor( override fun isInline() = false override fun isExpect() = false override fun isActual() = false + override fun isFun() = 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 8d6baaeedf2..641af53c4a5 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 @@ -86,6 +86,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes private final boolean isInline; private final boolean isExpect; private final boolean isActual; + private final boolean isFun; private final Annotations annotations; private final Annotations danglingAnnotations; @@ -158,6 +159,8 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes this.isExpect = modifierList != null && PsiUtilsKt.hasExpectModifier(modifierList) || containingDeclaration instanceof ClassDescriptor && ((ClassDescriptor) containingDeclaration).isExpect(); + this.isFun = modifierList != null && PsiUtilsKt.hasFunModifier(modifierList); + // Annotation entries are taken from both own annotations (if any) and object literal annotations (if any) List annotationEntries = new ArrayList<>(); if (classOrObject != null && classOrObject.getParent() instanceof KtObjectLiteralExpression) { @@ -533,6 +536,11 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes return isActual; } + @Override + public boolean isFun() { + return isFun; + } + @NotNull @Override public Annotations getAnnotations() { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt index a9339f691bd..5521bcb25f0 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt @@ -294,7 +294,8 @@ abstract class AbstractSuspendFunctionsLowering(val co isData = false, isExternal = false, isInline = false, - isExpect = false + isExpect = false, + isFun = false ).apply { d.bind(this) parent = irFunction.parent diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt index 511b8f5348d..a5ce2ff1746 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt @@ -26,7 +26,8 @@ fun IrClassBuilder.buildClass(): IrClass { startOffset, endOffset, origin, IrClassSymbolImpl(wrappedDescriptor), name, kind, visibility, modality, - isCompanion = isCompanion, isInner = isInner, isData = isData, isExternal = isExternal, isInline = isInline, isExpect = isExpect + isCompanion = isCompanion, isInner = isInner, isData = isData, isExternal = isExternal, + isInline = isInline, isExpect = isExpect, isFun = isFun ).also { wrappedDescriptor.bind(it) } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSharedVariablesManager.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSharedVariablesManager.kt index e5fb16c9398..e051a448181 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSharedVariablesManager.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSharedVariablesManager.kt @@ -126,7 +126,8 @@ class JsSharedVariablesManager(val builtIns: IrBuiltIns, val implicitDeclaration val declaration = IrClassImpl( UNDEFINED_OFFSET, UNDEFINED_OFFSET, JsLoweredDeclarationOrigin.JS_CLOSURE_BOX_CLASS_DECLARATION, IrClassSymbolImpl(descriptor), Name.identifier(boxTypeName), ClassKind.CLASS, Visibilities.PUBLIC, Modality.FINAL, - isCompanion = false, isInner = false, isData = false, isExternal = false, isInline = false, isExpect = false + isCompanion = false, isInner = false, isData = false, isExternal = false, + isInline = false, isExpect = false, isFun = false ) descriptor.bind(declaration) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDeclarationFactory.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDeclarationFactory.kt index 6e5b5c29406..484dbdce7e0 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDeclarationFactory.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDeclarationFactory.kt @@ -236,7 +236,8 @@ class JvmDeclarationFactory( isData = false, isExternal = false, isInline = false, - isExpect = false + isExpect = false, + isFun = false ).apply { descriptor.bind(this) parent = interfaceClass diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt index d725431e104..5654a32a28c 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt @@ -88,7 +88,8 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa isData = false, isExternal = false, isInline = false, - isExpect = false + isExpect = false, + isFun = false ).apply { descriptor.bind(this) superTypes.add(context.irBuiltIns.anyType) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/declarations/IrClassBuilder.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/declarations/IrClassBuilder.kt index 257dd31fa3a..c5b1f03788a 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/declarations/IrClassBuilder.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/declarations/IrClassBuilder.kt @@ -19,6 +19,7 @@ class IrClassBuilder : IrDeclarationBuilder() { var isExternal: Boolean = false var isInline: Boolean = false var isExpect: Boolean = false + var isFun: Boolean = false fun updateFrom(from: IrClass) { super.updateFrom(from) @@ -31,5 +32,6 @@ class IrClassBuilder : IrDeclarationBuilder() { isExternal = from.isExternal isInline = from.isInline isExpect = from.isExpect + isFun = from.isFun } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt index d0d9eacdcea..65a20c8fd3e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt @@ -39,6 +39,7 @@ interface IrClass : val isExternal: Boolean val isInline: Boolean val isExpect: Boolean + val isFun: Boolean val superTypes: MutableList diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt index e17bfd8ea8d..cd6eb0de4bd 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt @@ -44,7 +44,8 @@ class IrClassImpl( override val isData: Boolean, override val isExternal: Boolean, override val isInline: Boolean, - override val isExpect: Boolean + override val isExpect: Boolean, + override val isFun: Boolean ) : IrDeclarationBase(startOffset, endOffset, origin), IrClass { @@ -66,7 +67,8 @@ class IrClassImpl( isData = symbol.descriptor.isData, isExternal = symbol.descriptor.isEffectivelyExternal(), isInline = symbol.descriptor.isInline, - isExpect = symbol.descriptor.isExpect + isExpect = symbol.descriptor.isExpect, + isFun = symbol.descriptor.isFun ) init { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt index c4dac814a3d..1222fc0d2b3 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt @@ -35,6 +35,7 @@ class IrLazyClass( override val isExternal: Boolean, override val isInline: Boolean, override val isExpect: Boolean, + override val isFun: Boolean, stubGenerator: DeclarationStubGenerator, typeTranslator: TypeTranslator ) : @@ -59,6 +60,7 @@ class IrLazyClass( isExternal = symbol.descriptor.isEffectivelyExternal(), isInline = symbol.descriptor.isInline, isExpect = symbol.descriptor.isExpect, + isFun = symbol.descriptor.isFun, stubGenerator = stubGenerator, typeTranslator = TypeTranslator ) 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 d585ee394ba..cf9a5a21cf9 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 @@ -595,6 +595,8 @@ open class WrappedClassDescriptor( override fun isInline() = owner.isInline + override fun isFun() = owner.isFun + override fun getThisAsReceiverParameter() = owner.thisReceiver?.descriptor as ReceiverParameterDescriptor override fun getUnsubstitutedPrimaryConstructor() = @@ -705,6 +707,8 @@ open class WrappedEnumEntryDescriptor( override fun isInline() = false + override fun isFun() = false + override fun getThisAsReceiverParameter() = (owner.parent as IrClass).descriptor.thisAsReceiverParameter override fun getUnsubstitutedPrimaryConstructor(): ClassConstructorDescriptor? { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt index 1430cdbe878..8cfa58ca911 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt @@ -147,7 +147,8 @@ open class DeepCopyIrTreeWithSymbols( declaration.isData, declaration.isExternal, declaration.isInline, - declaration.isExpect + declaration.isExpect, + declaration.isFun ).apply { transformAnnotations(declaration) copyTypeParametersFrom(declaration) diff --git a/compiler/ir/serialization.common/src/KotlinIr.proto b/compiler/ir/serialization.common/src/KotlinIr.proto index 8d8aa973990..6afeab3fbaa 100644 --- a/compiler/ir/serialization.common/src/KotlinIr.proto +++ b/compiler/ir/serialization.common/src/KotlinIr.proto @@ -648,6 +648,7 @@ message IrClass { required IrDeclarationContainer declaration_container = 13; repeated int32 super_type = 14; required bool is_expect = 15; + required bool is_fun = 16; } message IrTypeAlias { diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt index 3810546e4a7..5ed26eb9863 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt @@ -980,7 +980,8 @@ abstract class IrFileDeserializer( isData = proto.isData, isExternal = proto.isExternal, isInline = proto.isInline, - isExpect = proto.isExpect + isExpect = proto.isExpect, + isFun = proto.isFun ) }.usingParent { proto.declarationContainer.declarationList.mapTo(declarations) { deserializeDeclaration(it) } diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/IrClass.java b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/IrClass.java index 77be52d4303..9c614d2a7a0 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/IrClass.java +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/IrClass.java @@ -198,6 +198,11 @@ public final class IrClass extends isExpect_ = input.readBool(); break; } + case 128: { + bitField0_ |= 0x00004000; + isFun_ = input.readBool(); + break; + } } } } catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) { @@ -475,6 +480,21 @@ public final class IrClass extends return isExpect_; } + public static final int IS_FUN_FIELD_NUMBER = 16; + private boolean isFun_; + /** + * required bool is_fun = 16; + */ + public boolean hasIsFun() { + return ((bitField0_ & 0x00004000) == 0x00004000); + } + /** + * required bool is_fun = 16; + */ + public boolean getIsFun() { + return isFun_; + } + private void initFields() { base_ = org.jetbrains.kotlin.backend.common.serialization.proto.IrDeclarationBase.getDefaultInstance(); name_ = 0; @@ -491,6 +511,7 @@ public final class IrClass extends declarationContainer_ = org.jetbrains.kotlin.backend.common.serialization.proto.IrDeclarationContainer.getDefaultInstance(); superType_ = java.util.Collections.emptyList(); isExpect_ = false; + isFun_ = false; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -550,6 +571,10 @@ public final class IrClass extends memoizedIsInitialized = 0; return false; } + if (!hasIsFun()) { + memoizedIsInitialized = 0; + return false; + } if (!getBase().isInitialized()) { memoizedIsInitialized = 0; return false; @@ -624,6 +649,9 @@ public final class IrClass extends if (((bitField0_ & 0x00002000) == 0x00002000)) { output.writeBool(15, isExpect_); } + if (((bitField0_ & 0x00004000) == 0x00004000)) { + output.writeBool(16, isFun_); + } output.writeRawBytes(unknownFields); } @@ -698,6 +726,10 @@ public final class IrClass extends size += org.jetbrains.kotlin.protobuf.CodedOutputStream .computeBoolSize(15, isExpect_); } + if (((bitField0_ & 0x00004000) == 0x00004000)) { + size += org.jetbrains.kotlin.protobuf.CodedOutputStream + .computeBoolSize(16, isFun_); + } size += unknownFields.size(); memoizedSerializedSize = size; return size; @@ -822,6 +854,8 @@ public final class IrClass extends bitField0_ = (bitField0_ & ~0x00002000); isExpect_ = false; bitField0_ = (bitField0_ & ~0x00004000); + isFun_ = false; + bitField0_ = (bitField0_ & ~0x00008000); return this; } @@ -906,6 +940,10 @@ public final class IrClass extends to_bitField0_ |= 0x00002000; } result.isExpect_ = isExpect_; + if (((from_bitField0_ & 0x00008000) == 0x00008000)) { + to_bitField0_ |= 0x00004000; + } + result.isFun_ = isFun_; result.bitField0_ = to_bitField0_; return result; } @@ -964,6 +1002,9 @@ public final class IrClass extends if (other.hasIsExpect()) { setIsExpect(other.getIsExpect()); } + if (other.hasIsFun()) { + setIsFun(other.getIsFun()); + } setUnknownFields( getUnknownFields().concat(other.unknownFields)); return this; @@ -1022,6 +1063,10 @@ public final class IrClass extends return false; } + if (!hasIsFun()) { + + return false; + } if (!getBase().isInitialized()) { return false; @@ -1742,6 +1787,38 @@ public final class IrClass extends return this; } + private boolean isFun_ ; + /** + * required bool is_fun = 16; + */ + public boolean hasIsFun() { + return ((bitField0_ & 0x00008000) == 0x00008000); + } + /** + * required bool is_fun = 16; + */ + public boolean getIsFun() { + return isFun_; + } + /** + * required bool is_fun = 16; + */ + public Builder setIsFun(boolean value) { + bitField0_ |= 0x00008000; + isFun_ = value; + + return this; + } + /** + * required bool is_fun = 16; + */ + public Builder clearIsFun() { + bitField0_ = (bitField0_ & ~0x00008000); + isFun_ = false; + + return this; + } + // @@protoc_insertion_point(builder_scope:org.jetbrains.kotlin.backend.common.serialization.proto.IrClass) } diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/IrClassOrBuilder.java b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/IrClassOrBuilder.java index 3b8911e6f27..8eb261aaaa0 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/IrClassOrBuilder.java +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/proto/IrClassOrBuilder.java @@ -153,4 +153,13 @@ public interface IrClassOrBuilder extends * required bool is_expect = 15; */ boolean getIsExpect(); + + /** + * required bool is_fun = 16; + */ + boolean hasIsFun(); + /** + * required bool is_fun = 16; + */ + boolean getIsFun(); } \ No newline at end of file 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 03308f75970..2f90b4bfb3a 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/psiUtils.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/psiUtils.kt @@ -445,6 +445,8 @@ fun KtModifierListOwner.hasActualModifier() = hasModifier(KtTokens.IMPL_KEYWORD) fun KtModifierList.hasActualModifier() = hasModifier(KtTokens.IMPL_KEYWORD) || hasModifier(KtTokens.ACTUAL_KEYWORD) fun KtModifierList.hasSuspendModifier() = hasModifier(KtTokens.SUSPEND_KEYWORD) +fun KtModifierList.hasFunModifier() = hasModifier(KtTokens.FUN_KEYWORD) + fun ASTNode.children() = generateSequence(firstChildNode) { node -> node.treeNext } fun ASTNode.parents() = generateSequence(treeParent) { node -> node.treeParent } diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt index 076a658c155..31a7857c210 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt @@ -69,7 +69,8 @@ class DescriptorSerializer private constructor( ProtoEnumFlags.visibility(normalizeVisibility(classDescriptor)), ProtoEnumFlags.modality(classDescriptor.modality), ProtoEnumFlags.classKind(classDescriptor.kind, classDescriptor.isCompanionObject), - classDescriptor.isInner, classDescriptor.isData, classDescriptor.isExternal, classDescriptor.isExpect, classDescriptor.isInline + classDescriptor.isInner, classDescriptor.isData, classDescriptor.isExternal, classDescriptor.isExpect, + classDescriptor.isInline, classDescriptor.isFun ) if (flags != builder.flags) { builder.flags = flags 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 654ef1a9a07..57009e6c3d7 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 @@ -97,6 +97,7 @@ class LazyJavaClassDescriptor( override fun isCompanionObject() = false override fun isExpect() = false override fun isActual() = false + override fun isFun() = 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 1a228159e9b..3ab74eca96d 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionClassDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionClassDescriptor.kt @@ -95,6 +95,7 @@ class FunctionClassDescriptor( override fun isInner() = false override fun isData() = false override fun isInline() = false + override fun isFun() = 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 36e7f298c70..02133a552df 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java @@ -70,6 +70,8 @@ public interface ClassDescriptor extends ClassifierDescriptorWithTypeParameters, boolean isInline(); + boolean isFun(); + @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 0cc097f4d1e..c9591988ece 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/NotFoundClasses.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/NotFoundClasses.kt @@ -69,6 +69,7 @@ class NotFoundClasses(private val storageManager: StorageManager, private val mo override fun isCompanionObject() = false override fun isData() = false override fun isInline() = false + override fun isFun() = 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 a0cc195df4a..e9a3ada4b1b 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassDescriptorImpl.java @@ -144,6 +144,11 @@ public class ClassDescriptorImpl extends ClassDescriptorBase { return false; } + @Override + public boolean isFun() { + 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 4eda4b8ce17..ad5f701ba28 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 isFun() { + return false; + } + @Override public boolean isCompanionObject() { 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 9de9cc8dec7..827371c5b5f 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java @@ -243,6 +243,11 @@ public class LazySubstitutingClassDescriptor extends ModuleAwareClassDescriptor return original.isInline(); } + @Override + public boolean isFun() { + return original.isFun(); + } + @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 5884475ee1b..831477747cd 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/MutableClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/MutableClassDescriptor.java @@ -99,6 +99,11 @@ public class MutableClassDescriptor extends ClassDescriptorBase { return false; } + @Override + public boolean isFun() { + 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 349744290b2..521911899c4 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 @@ -104,6 +104,8 @@ class DeserializedClassDescriptor( override fun isExternal() = Flags.IS_EXTERNAL_CLASS.get(classProto.flags) + override fun isFun() = Flags.IS_FUN_INTERFACE.get(classProto.flags) + override fun getUnsubstitutedMemberScope(kotlinTypeRefiner: KotlinTypeRefiner): MemberScope = memberScopeHolder.getScope(kotlinTypeRefiner) diff --git a/core/metadata/src/metadata.proto b/core/metadata/src/metadata.proto index 543298918c3..38e6418c3e0 100644 --- a/core/metadata/src/metadata.proto +++ b/core/metadata/src/metadata.proto @@ -209,6 +209,7 @@ message Class { isExternal isExpect isInline + isFun */ optional int32 flags = 1 [default = 6 /* public final class, no annotations */]; diff --git a/core/metadata/src/org/jetbrains/kotlin/metadata/ProtoBuf.java b/core/metadata/src/org/jetbrains/kotlin/metadata/ProtoBuf.java index f9e5fa99b2f..3847b3915e2 100644 --- a/core/metadata/src/org/jetbrains/kotlin/metadata/ProtoBuf.java +++ b/core/metadata/src/org/jetbrains/kotlin/metadata/ProtoBuf.java @@ -8273,6 +8273,7 @@ public final class ProtoBuf { *isExternal *isExpect *isInline + *isFun * */ boolean hasFlags(); @@ -8289,6 +8290,7 @@ public final class ProtoBuf { *isExternal *isExpect *isInline + *isFun * */ int getFlags(); @@ -8914,6 +8916,7 @@ public final class ProtoBuf { *isExternal *isExpect *isInline + *isFun * */ public boolean hasFlags() { @@ -8932,6 +8935,7 @@ public final class ProtoBuf { *isExternal *isExpect *isInline + *isFun * */ public int getFlags() { @@ -10059,6 +10063,7 @@ public final class ProtoBuf { *isExternal *isExpect *isInline + *isFun * */ public boolean hasFlags() { @@ -10077,6 +10082,7 @@ public final class ProtoBuf { *isExternal *isExpect *isInline + *isFun * */ public int getFlags() { @@ -10095,6 +10101,7 @@ public final class ProtoBuf { *isExternal *isExpect *isInline + *isFun * */ public Builder setFlags(int value) { @@ -10116,6 +10123,7 @@ public final class ProtoBuf { *isExternal *isExpect *isInline + *isFun * */ public Builder clearFlags() { diff --git a/core/metadata/src/org/jetbrains/kotlin/metadata/deserialization/Flags.java b/core/metadata/src/org/jetbrains/kotlin/metadata/deserialization/Flags.java index 40dbbe58902..ab9c16dc328 100644 --- a/core/metadata/src/org/jetbrains/kotlin/metadata/deserialization/Flags.java +++ b/core/metadata/src/org/jetbrains/kotlin/metadata/deserialization/Flags.java @@ -30,6 +30,7 @@ public class Flags { public static final BooleanFlagField IS_EXTERNAL_CLASS = FlagField.booleanAfter(IS_DATA); public static final BooleanFlagField IS_EXPECT_CLASS = FlagField.booleanAfter(IS_EXTERNAL_CLASS); public static final BooleanFlagField IS_INLINE_CLASS = FlagField.booleanAfter(IS_EXPECT_CLASS); + public static final BooleanFlagField IS_FUN_INTERFACE = FlagField.booleanAfter(IS_INLINE_CLASS); // Constructors @@ -95,7 +96,8 @@ public class Flags { boolean isData, boolean isExternal, boolean isExpect, - boolean isInline + boolean isInline, + boolean isFun ) { return HAS_ANNOTATIONS.toFlags(hasAnnotations) | MODALITY.toFlags(modality) @@ -106,6 +108,7 @@ public class Flags { | IS_EXTERNAL_CLASS.toFlags(isExternal) | IS_EXPECT_CLASS.toFlags(isExpect) | IS_INLINE_CLASS.toFlags(isInline) + | IS_FUN_INTERFACE.toFlags(isFun) ; } diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedClassDescriptor.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedClassDescriptor.kt index c602e3d8ded..8728d82a64b 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedClassDescriptor.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedClassDescriptor.kt @@ -78,6 +78,7 @@ class CommonizedClassDescriptor( override fun isInner() = isInner override fun isExpect() = isExpect override fun isActual() = isActual + override fun isFun() = false // TODO: modifier "fun" should be accessible from here too override fun getUnsubstitutedMemberScope(kotlinTypeRefiner: KotlinTypeRefiner): CommonizedMemberScope { check(kotlinTypeRefiner == KotlinTypeRefiner.Default) {