diff --git a/libraries/kotlinx-metadata/jvm/ReadMe.md b/libraries/kotlinx-metadata/jvm/ReadMe.md index 5fcfb117b75..dd8a59262fe 100644 --- a/libraries/kotlinx-metadata/jvm/ReadMe.md +++ b/libraries/kotlinx-metadata/jvm/ReadMe.md @@ -31,7 +31,7 @@ Let's assume we've obtained an instance of `KotlinClassMetadata.Class`; other ki ```kotlin metadata.accept(object : KmClassVisitor() { - override fun visitFunction(flags: Int, name: String): KmFunctionVisitor? { + override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? { // This will be called for each function in the class. "name" is the // function name, and "flags" represent modifier flags (see below) @@ -47,14 +47,14 @@ Please refer to [`MetadataSmokeTest.listInlineFunctions`](test/kotlinx/metadata/ ## Flags -Numerous `visit*` methods are declared with the parameter named `flags`. These flags represent modifiers or other boolean attributes of a declaration or a type. To check if a certain flag is present, call one of the flags in [`Flags`](../src/kotlinx/metadata/Flags.kt) on the given integer value. The set of applicable flags is documented in each `visit*` method. For example, for functions, this is common declaration flags (visibility, modality) plus `Flags.Function` flags: +Numerous `visit*` methods take the parameter named `flags`. These flags represent modifiers or other boolean attributes of a declaration or a type. To check if a certain flag is present, call one of the flags in [`Flag`](../src/kotlinx/metadata/Flag.kt) on the given integer value. The set of applicable flags is documented in each `visit*` method. For example, for functions, this is common declaration flags (visibility, modality) plus `Flag.Function` flags: ```kotlin -override fun visitFunction(flags: Int, name: String): KmFunctionVisitor? { - if (Flags.IS_PUBLIC(flags)) { +override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? { + if (Flag.IS_PUBLIC(flags)) { println("function $name is public") } - if (Flags.Function.IS_SUSPEND(flags)) { + if (Flag.Function.IS_SUSPEND(flags)) { println("function $name has the 'suspend' modifier") } ... @@ -92,11 +92,11 @@ When using metadata writers from Kotlin source code, it's very convenient to use // Writing metadata of a class val header = KotlinClassMetadata.Class.Writer().run { // Visiting the name and the modifiers on the class. - // Flags are constructed by invoking "Flags(...)" - visit(Flags(Flags.IS_PUBLIC), "MyClass") + // Flags are constructed by invoking "flagsOf(...)" + visit(flagsOf(Flag.IS_PUBLIC), "MyClass") // Adding one public primary constructor - visitConstructor(Flags(Flags.IS_PUBLIC, Flags.Constructor.IS_PRIMARY))!!.run { + visitConstructor(flagsOf(Flag.IS_PUBLIC, Flag.Constructor.IS_PRIMARY))!!.run { // Visiting JVM signature (for example, to be used by kotlin-reflect) (visitExtensions(JvmConstructorExtensionVisitor.TYPE) as JvmConstructorExtensionVisitor).run { visit("()V") diff --git a/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/MetadataSmokeTest.kt b/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/MetadataSmokeTest.kt index 58758aa6a7f..c2f0065b6b7 100644 --- a/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/MetadataSmokeTest.kt +++ b/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/MetadataSmokeTest.kt @@ -38,14 +38,14 @@ class MetadataSmokeTest { val klass = KotlinClassMetadata.read(L::class.java.readMetadata()) as KotlinClassMetadata.Class klass.accept(object : KmClassVisitor() { - override fun visitFunction(flags: Int, name: String): KmFunctionVisitor? { + override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? { return object : KmFunctionVisitor() { override fun visitExtensions(type: KmExtensionType): KmFunctionExtensionVisitor? { if (type != JvmFunctionExtensionVisitor.TYPE) return null return object : JvmFunctionExtensionVisitor() { override fun visit(desc: String?) { - if (Flags.Function.IS_INLINE(flags) && desc != null) { + if (Flag.Function.IS_INLINE(flags) && desc != null) { inlineFunctions += desc } } @@ -69,14 +69,14 @@ class MetadataSmokeTest { // } val header = KotlinClassMetadata.Class.Writer().run { - visit(Flags(Flags.IS_PUBLIC), "Hello") - visitConstructor(Flags(Flags.IS_PUBLIC, Flags.Constructor.IS_PRIMARY))!!.run { + visit(flagsOf(Flag.IS_PUBLIC), "Hello") + visitConstructor(flagsOf(Flag.IS_PUBLIC, Flag.Constructor.IS_PRIMARY))!!.run { (visitExtensions(JvmConstructorExtensionVisitor.TYPE) as JvmConstructorExtensionVisitor).run { visit("()V") } visitEnd() } - visitFunction(Flags(Flags.IS_PUBLIC, Flags.Function.IS_DECLARATION), "hello")!!.run { + visitFunction(flagsOf(Flag.IS_PUBLIC, Flag.Function.IS_DECLARATION), "hello")!!.run { visitReturnType(0)!!.run { visitClass("kotlin/String") visitEnd() diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/Flag.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/Flag.kt new file mode 100644 index 00000000000..45f210b0435 --- /dev/null +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/Flag.kt @@ -0,0 +1,493 @@ +/* + * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package kotlinx.metadata + +import org.jetbrains.kotlin.metadata.ProtoBuf.* +import org.jetbrains.kotlin.metadata.deserialization.Flags as F +import org.jetbrains.kotlin.metadata.ProtoBuf.Class.Kind as ClassKind + +/** + * Represents a boolean flag that is either present or not in a Kotlin declaration. A "flag" is a boolean trait that is either present + * or not in a declaration. To check whether the flag is present in the bitmask, call [Flag.invoke] on the flag, passing the bitmask + * as the argument: + * + * override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? { + * if (Flag.Function.IS_INLINE(flags)) { + * ... + * } + * } + * + * To construct a bitmask out of several flags, call [flagsOf] on the needed flags: + * + * v.visitFunction(flagsOf(Flag.Function.IS_DECLARATION, Flag.Function.IS_INLINE), "foo") + * + * Flag common to multiple kinds of Kotlin declarations ("common flags") are declared in [Flag.Common]. + * Flag applicable to specific kinds of declarations ("declaration-specific flags") are declared in nested objects of the [Flag] object. + * + * Some flags are mutually exclusive, i.e. there are "flag groups" such that no more than one flag from each group can be present + * in the same bitmask. Among common flags, there are the following flag groups: + * * visibility flags: [IS_INTERNAL], [IS_PRIVATE], [IS_PROTECTED], [IS_PUBLIC], [IS_PRIVATE_TO_THIS], [IS_LOCAL] + * * modality flags: [IS_FINAL], [IS_OPEN], [IS_ABSTRACT], [IS_SEALED] + * + * Some declaration-specific flags form other flag groups, see the documentation of the corresponding containers for more information. + * + * @see Flags + * @see flagsOf + */ +class Flag internal constructor( + private val offset: Int, + private val bitWidth: Int, + private val value: Int +) { + internal constructor(field: F.FlagField<*>, value: Int) : this(field.offset, field.bitWidth, value) + + internal constructor(field: F.BooleanFlagField) : this(field, 1) + + internal operator fun plus(flags: Flags): Flags = + (flags and (((1 shl bitWidth) - 1) shl offset).inv()) + (value shl offset) + + /** + * Checks whether the flag is present in the given bitmask. + */ + operator fun invoke(flags: Flags): Boolean = + (flags ushr offset) and ((1 shl bitWidth) - 1) == value + + companion object Common { + /** + * Signifies that the corresponding declaration has at least one annotation. + * + * This flag is useful for reading Kotlin metadata on JVM efficiently. On JVM, most of the annotations are written not to the Kotlin + * metadata, but directly on the corresponding declarations in the class file. This flag can be used as an optimization to avoid + * reading annotations from the class file (which can be slow) in case when a declaration has no annotations. + */ + @JvmField + val HAS_ANNOTATIONS = Flag(F.HAS_ANNOTATIONS) + + + /** + * A visibility flag, signifying that the corresponding declaration is `internal`. + */ + @JvmField + val IS_INTERNAL = Flag(F.VISIBILITY, Visibility.INTERNAL_VALUE) + + /** + * A visibility flag, signifying that the corresponding declaration is `private`. + */ + @JvmField + val IS_PRIVATE = Flag(F.VISIBILITY, Visibility.PRIVATE_VALUE) + + /** + * A visibility flag, signifying that the corresponding declaration is `protected`. + */ + @JvmField + val IS_PROTECTED = Flag(F.VISIBILITY, Visibility.PROTECTED_VALUE) + + /** + * A visibility flag, signifying that the corresponding declaration is `public`. + */ + @JvmField + val IS_PUBLIC = Flag(F.VISIBILITY, Visibility.PUBLIC_VALUE) + + /** + * A visibility flag, signifying that the corresponding declaration is "private-to-this", which is a non-denotable visibility of + * private members in Kotlin which are callable only on the same instance of the declaring class. + */ + @JvmField + val IS_PRIVATE_TO_THIS = Flag(F.VISIBILITY, Visibility.PRIVATE_TO_THIS_VALUE) + + /** + * A visibility flag, signifying that the corresponding declaration is local, i.e. declared inside a code block + * and not visible from the outside. + */ + @JvmField + val IS_LOCAL = Flag(F.VISIBILITY, Visibility.LOCAL_VALUE) + + + /** + * A modality flag, signifying that the corresponding declaration is `final`. + */ + @JvmField + val IS_FINAL = Flag(F.MODALITY, Modality.FINAL_VALUE) + + /** + * A modality flag, signifying that the corresponding declaration is `open`. + */ + @JvmField + val IS_OPEN = Flag(F.MODALITY, Modality.OPEN_VALUE) + + /** + * A modality flag, signifying that the corresponding declaration is `abstract`. + */ + @JvmField + val IS_ABSTRACT = Flag(F.MODALITY, Modality.ABSTRACT_VALUE) + + /** + * A modality flag, signifying that the corresponding declaration is `sealed`. + */ + @JvmField + val IS_SEALED = Flag(F.MODALITY, Modality.SEALED_VALUE) + } + + /** + * A container of flags applicable to Kotlin classes, including interfaces, objects, enum classes and annotation classes. + * + * In addition to the common flag groups, the following flag groups exist for class flags: + * * class kind flags: [IS_CLASS], [IS_INTERFACE], [IS_ENUM_CLASS], [IS_ENUM_ENTRY], [IS_ANNOTATION_CLASS], [IS_OBJECT], + * [IS_COMPANION_OBJECT] + */ + object Class { + /** + * A class kind flag, signifying that the corresponding class is a usual `class`. + */ + @JvmField + val IS_CLASS = Flag(F.CLASS_KIND, ClassKind.CLASS_VALUE) + + /** + * A class kind flag, signifying that the corresponding class is an `interface`. + */ + @JvmField + val IS_INTERFACE = Flag(F.CLASS_KIND, ClassKind.INTERFACE_VALUE) + + /** + * A class kind flag, signifying that the corresponding class is an `enum class`. + */ + @JvmField + val IS_ENUM_CLASS = Flag(F.CLASS_KIND, ClassKind.ENUM_CLASS_VALUE) + + /** + * A class kind flag, signifying that the corresponding class is an enum entry. + */ + @JvmField + val IS_ENUM_ENTRY = Flag(F.CLASS_KIND, ClassKind.ENUM_ENTRY_VALUE) + + /** + * A class kind flag, signifying that the corresponding class is an `annotation class`. + */ + @JvmField + val IS_ANNOTATION_CLASS = Flag(F.CLASS_KIND, ClassKind.ANNOTATION_CLASS_VALUE) + + /** + * A class kind flag, signifying that the corresponding class is a non-companion `object`. + */ + @JvmField + val IS_OBJECT = Flag(F.CLASS_KIND, ClassKind.OBJECT_VALUE) + + /** + * A class kind flag, signifying that the corresponding class is a `companion object`. + */ + @JvmField + val IS_COMPANION_OBJECT = Flag(F.CLASS_KIND, ClassKind.COMPANION_OBJECT_VALUE) + + + /** + * Signifies that the corresponding class is `inner`. + */ + @JvmField + val IS_INNER = Flag(F.IS_INNER) + + /** + * Signifies that the corresponding class is `data`. + */ + @JvmField + val IS_DATA = Flag(F.IS_DATA) + + /** + * Signifies that the corresponding class is `external`. + */ + @JvmField + val IS_EXTERNAL = Flag(F.IS_EXTERNAL_CLASS) + + /** + * Signifies that the corresponding class is `expect`. + */ + @JvmField + val IS_EXPECT = Flag(F.IS_EXPECT_CLASS) + + /** + * Signifies that the corresponding class is `inline`. + */ + @JvmField + val IS_INLINE = Flag(F.IS_INLINE_CLASS) + } + + /** + * A container of flags applicable to Kotlin constructors. + */ + object Constructor { + /** + * Signifies that the corresponding constructor is primary, i.e. declared in the class header, not in the class body. + */ + @JvmField + val IS_PRIMARY = Flag(F.IS_SECONDARY, 0) + } + + /** + * A container of flags applicable to Kotlin functions. + * + * In addition to the common flag groups, the following flag groups exist for function flags: + * * member kind flags: [IS_DECLARATION], [IS_FAKE_OVERRIDE], [IS_DELEGATION], [IS_SYNTHESIZED] + */ + object Function { + /** + * A member kind flag, signifying that the corresponding function is explicitly declared in the containing class. + */ + @JvmField + val IS_DECLARATION = Flag(F.MEMBER_KIND, MemberKind.DECLARATION_VALUE) + + /** + * A member kind flag, signifying that the corresponding function exists in the containing class because a function with a suitable + * signature exists in a supertype. This flag is not written by the Kotlin compiler and its effects are unspecified. + */ + @JvmField + val IS_FAKE_OVERRIDE = Flag(F.MEMBER_KIND, MemberKind.FAKE_OVERRIDE_VALUE) + + /** + * A member kind flag, signifying that the corresponding function exists in the containing class because it has been produced + * by interface delegation (delegation "by"). + */ + @JvmField + val IS_DELEGATION = Flag(F.MEMBER_KIND, MemberKind.DELEGATION_VALUE) + + /** + * A member kind flag, signifying that the corresponding function exists in the containing class because it has been synthesized + * by the compiler and has no declaration in the source code. + */ + @JvmField + val IS_SYNTHESIZED = Flag(F.MEMBER_KIND, MemberKind.SYNTHESIZED_VALUE) + + + /** + * Signifies that the corresponding function is `operator`. + */ + @JvmField + val IS_OPERATOR = Flag(F.IS_OPERATOR) + + /** + * Signifies that the corresponding function is `infix`. + */ + @JvmField + val IS_INFIX = Flag(F.IS_INFIX) + + /** + * Signifies that the corresponding function is `inline`. + */ + @JvmField + val IS_INLINE = Flag(F.IS_INLINE) + + /** + * Signifies that the corresponding function is `tailrec`. + */ + @JvmField + val IS_TAILREC = Flag(F.IS_TAILREC) + + /** + * Signifies that the corresponding function is `external`. + */ + @JvmField + val IS_EXTERNAL = Flag(F.IS_EXTERNAL_FUNCTION) + + /** + * Signifies that the corresponding function is `suspend`. + */ + @JvmField + val IS_SUSPEND = Flag(F.IS_SUSPEND) + + /** + * Signifies that the corresponding function is `expect`. + */ + @JvmField + val IS_EXPECT = Flag(F.IS_EXPECT_FUNCTION) + } + + /** + * A container of flags applicable to Kotlin properties. + * + * In addition to the common flag groups, the following flag groups exist for property flags: + * * member kind flags: [IS_DECLARATION], [IS_FAKE_OVERRIDE], [IS_DELEGATION], [IS_SYNTHESIZED] + */ + object Property { + /** + * A member kind flag, signifying that the corresponding property is explicitly declared in the containing class. + */ + @JvmField + val IS_DECLARATION = Flag(F.MEMBER_KIND, MemberKind.DECLARATION_VALUE) + + /** + * A member kind flag, signifying that the corresponding property exists in the containing class because a property with a suitable + * signature exists in a supertype. This flag is not written by the Kotlin compiler and its effects are unspecified. + */ + @JvmField + val IS_FAKE_OVERRIDE = Flag(F.MEMBER_KIND, MemberKind.FAKE_OVERRIDE_VALUE) + + /** + * A member kind flag, signifying that the corresponding property exists in the containing class because it has been produced + * by interface delegation (delegation "by"). + */ + @JvmField + val IS_DELEGATION = Flag(F.MEMBER_KIND, MemberKind.DELEGATION_VALUE) + + /** + * A member kind flag, signifying that the corresponding property exists in the containing class because it has been synthesized + * by the compiler and has no declaration in the source code. + */ + @JvmField + val IS_SYNTHESIZED = Flag(F.MEMBER_KIND, MemberKind.SYNTHESIZED_VALUE) + + + /** + * Signifies that the corresponding property is `var`. + */ + @JvmField + val IS_VAR = Flag(F.IS_VAR) + + /** + * Signifies that the corresponding property has a getter. + */ + @JvmField + val HAS_GETTER = Flag(F.HAS_GETTER) + + /** + * Signifies that the corresponding property has a setter. + */ + @JvmField + val HAS_SETTER = Flag(F.HAS_SETTER) + + /** + * Signifies that the corresponding property is `const`. + */ + @JvmField + val IS_CONST = Flag(F.IS_CONST) + + /** + * Signifies that the corresponding property is `lateinit`. + */ + @JvmField + val IS_LATEINIT = Flag(F.IS_LATEINIT) + + /** + * Signifies that the corresponding property has a constant value. On JVM, this flag allows an optimization similarly to + * [F.HAS_ANNOTATIONS]: constant values of properties are written to the bytecode directly, and this flag can be used to avoid + * reading the value from the bytecode in case there isn't one. + */ + @JvmField + val HAS_CONSTANT = Flag(F.HAS_CONSTANT) + + /** + * Signifies that the corresponding property is `external`. + */ + @JvmField + val IS_EXTERNAL = Flag(F.IS_EXTERNAL_PROPERTY) + + /** + * Signifies that the corresponding property is a delegated property. + */ + @JvmField + val IS_DELEGATED = Flag(F.IS_DELEGATED) + + /** + * Signifies that the corresponding property is `expect`. + */ + @JvmField + val IS_EXPECT = Flag(F.IS_EXPECT_PROPERTY) + } + + /** + * A container of flags applicable to Kotlin property getters and setters. + */ + object PropertyAccessor { + /** + * Signifies that the corresponding property accessor is not default, i.e. it has a body and/or annotations in the source code. + */ + @JvmField + val IS_NOT_DEFAULT = Flag(F.IS_NOT_DEFAULT) + + /** + * Signifies that the corresponding property accessor is `external`. + */ + @JvmField + val IS_EXTERNAL = Flag(F.IS_EXTERNAL_ACCESSOR) + + /** + * Signifies that the corresponding property accessor is `inline`. + */ + @JvmField + val IS_INLINE = Flag(F.IS_INLINE_ACCESSOR) + } + + /** + * A container of flags applicable to Kotlin types. + */ + object Type { + /** + * Signifies that the corresponding type is marked as nullable, i.e. has a question mark at the end of its notation. + */ + @JvmField + val IS_NULLABLE = Flag(0, 1, 1) + + /** + * Signifies that the corresponding type is `suspend`. + */ + @JvmField + val IS_SUSPEND = Flag(F.SUSPEND_TYPE.offset + 1, F.SUSPEND_TYPE.bitWidth, 1) + } + + /** + * A container of flags applicable to Kotlin type parameters. + */ + object TypeParameter { + /** + * Signifies that the corresponding type parameter is `reified`. + */ + @JvmField + val IS_REIFIED = Flag(0, 1, 1) + } + + /** + * A container of flags applicable to Kotlin value parameters. + */ + object ValueParameter { + /** + * Signifies that the corresponding value parameter declares a default value. Note that the default value itself can be a complex + * expression and is not available via metadata. Also note that in case of an override of a parameter with default value, the + * parameter in the derived method does _not_ declare the default value ([DECLARES_DEFAULT_VALUE] == false), but the parameter is + * still optional at the call site because the default value from the base method is used. + */ + @JvmField + val DECLARES_DEFAULT_VALUE = Flag(F.DECLARES_DEFAULT_VALUE) + + /** + * Signifies that the corresponding value parameter is `crossinline`. + */ + @JvmField + val IS_CROSSINLINE = Flag(F.IS_CROSSINLINE) + + /** + * Signifies that the corresponding value parameter is `noinline`. + */ + @JvmField + val IS_NOINLINE = Flag(F.IS_NOINLINE) + } + + /** + * A container of flags applicable to Kotlin effect expressions. + * + * Contracts are an internal feature of the standard Kotlin library, and their behavior and/or binary format + * may change in a subsequent release. + */ + object EffectExpression { + /** + * Signifies that the corresponding effect expression should be negated to compute the proposition or the conclusion of an effect. + */ + @JvmField + val IS_NEGATED = Flag(F.IS_NEGATED) + + /** + * Signifies that the corresponding effect expression checks whether a value of some variable is `null`. + */ + @JvmField + val IS_NULL_CHECK_PREDICATE = Flag(F.IS_NULL_CHECK_PREDICATE) + } +} diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/Flags.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/Flags.kt index e529dcc47e9..f7d0e2df57c 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/Flags.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/Flags.kt @@ -1,481 +1,23 @@ /* - * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the license/LICENSE.txt file. */ package kotlinx.metadata -import org.jetbrains.kotlin.metadata.ProtoBuf.* -import org.jetbrains.kotlin.metadata.deserialization.Flags as F -import org.jetbrains.kotlin.metadata.ProtoBuf.Class.Kind as ClassKind +/** + * Declaration flags are represented as bitmasks of this type. + * + * @see Flag + */ +typealias Flags = Int /** - * A container of all flags applicable to all Kotlin declarations. A "flag" is a boolean trait that is either present or not - * in a declaration. To check whether the flag is present in the bitmask, call [MetadataFlag.invoke] on the flag, passing the bitmask - * as the argument: + * Combines several flags into an integer bitmask. * - * override fun visitFunction(flags: Int, name: String): KmFunctionVisitor? { - * if (Flags.Function.IS_INLINE(flags)) { - * ... - * } - * } - * - * To construct a bitmask out of several flags, call [Flags.invoke] on the needed flags: - * - * v.visitFunction(Flags(Flags.Function.IS_DECLARATION, Flags.Function.IS_INLINE), "foo") - * - * Flags common to multiple kinds of Kotlin declarations ("common flags") are declared directly in the [Flags] object. - * Flags applicable to specific kinds of declarations ("declaration-specific flags") are declared in nested objects of the [Flags] object. - * - * Some flags are mutually exclusive, i.e. there are "flag groups" such that no more than one flag from each group can be present - * in the same bitmask. Among common flags, there are the following flag groups: - * * visibility flags: [IS_INTERNAL], [IS_PRIVATE], [IS_PROTECTED], [IS_PUBLIC], [IS_PRIVATE_TO_THIS], [IS_LOCAL] - * * modality flags: [IS_FINAL], [IS_OPEN], [IS_ABSTRACT], [IS_SEALED] - * - * Some declaration-specific flags form other flag groups, see the documentation of the corresponding containers for more information. + * Note that in case several mutually exclusive flags are passed (for example, several visibility flags), the resulting bitmask will + * hold the value of the latest flag. For example, `flagsOf(Flag.IS_PRIVATE, Flag.IS_PUBLIC, Flag.IS_INTERNAL)` is the same as + * `flagsOf(Flag.IS_INTERNAL)`. */ -object Flags { - /** - * Combines several flags into an integer bitmask. Note that in case several mutually exclusive flags are passed (for example, - * several visibility flags), the resulting bitmask will hold the value of the latest flag. - * - * For example, `Flags(Flags.IS_PRIVATE, Flags.IS_PUBLIC, Flags.IS_INTERNAL)` is the same as `Flags(Flags.IS_INTERNAL)` - */ - operator fun invoke(vararg flags: MetadataFlag): Int = - flags.fold(0) { acc, flag -> flag + acc } - - /** - * Signifies that the corresponding declaration has at least one annotation. - * - * This flag is useful for reading Kotlin metadata on JVM efficiently. On JVM, most of the annotations are written not to the Kotlin - * metadata, but directly on the corresponding declarations in the class file. This flag can be used as an optimization to avoid - * reading annotations from the class file (which can be slow) in case when a declaration has no annotations. - */ - @JvmField - val HAS_ANNOTATIONS = MetadataFlag(F.HAS_ANNOTATIONS) - - - /** - * A visibility flag, signifying that the corresponding declaration is `internal`. - */ - @JvmField - val IS_INTERNAL = MetadataFlag(F.VISIBILITY, Visibility.INTERNAL_VALUE) - - /** - * A visibility flag, signifying that the corresponding declaration is `private`. - */ - @JvmField - val IS_PRIVATE = MetadataFlag(F.VISIBILITY, Visibility.PRIVATE_VALUE) - - /** - * A visibility flag, signifying that the corresponding declaration is `protected`. - */ - @JvmField - val IS_PROTECTED = MetadataFlag(F.VISIBILITY, Visibility.PROTECTED_VALUE) - - /** - * A visibility flag, signifying that the corresponding declaration is `public`. - */ - @JvmField - val IS_PUBLIC = MetadataFlag(F.VISIBILITY, Visibility.PUBLIC_VALUE) - - /** - * A visibility flag, signifying that the corresponding declaration is "private-to-this", which is a non-denotable visibility of - * private members in Kotlin which are callable only on the same instance of the declaring class. - */ - @JvmField - val IS_PRIVATE_TO_THIS = MetadataFlag(F.VISIBILITY, Visibility.PRIVATE_TO_THIS_VALUE) - - /** - * A visibility flag, signifying that the corresponding declaration is local, i.e. declared inside a code block - * and not visible from the outside. - */ - @JvmField - val IS_LOCAL = MetadataFlag(F.VISIBILITY, Visibility.LOCAL_VALUE) - - - /** - * A modality flag, signifying that the corresponding declaration is `final`. - */ - @JvmField - val IS_FINAL = MetadataFlag(F.MODALITY, Modality.FINAL_VALUE) - - /** - * A modality flag, signifying that the corresponding declaration is `open`. - */ - @JvmField - val IS_OPEN = MetadataFlag(F.MODALITY, Modality.OPEN_VALUE) - - /** - * A modality flag, signifying that the corresponding declaration is `abstract`. - */ - @JvmField - val IS_ABSTRACT = MetadataFlag(F.MODALITY, Modality.ABSTRACT_VALUE) - - /** - * A modality flag, signifying that the corresponding declaration is `sealed`. - */ - @JvmField - val IS_SEALED = MetadataFlag(F.MODALITY, Modality.SEALED_VALUE) - - - /** - * A container of flags applicable to Kotlin classes, including interfaces, objects, enum classes and annotation classes. - * - * In addition to the common flag groups, the following flag groups exist for class flags: - * * class kind flags: [IS_CLASS], [IS_INTERFACE], [IS_ENUM_CLASS], [IS_ENUM_ENTRY], [IS_ANNOTATION_CLASS], [IS_OBJECT], - * [IS_COMPANION_OBJECT] - */ - object Class { - /** - * A class kind flag, signifying that the corresponding class is a usual `class`. - */ - @JvmField - val IS_CLASS = MetadataFlag(F.CLASS_KIND, ClassKind.CLASS_VALUE) - - /** - * A class kind flag, signifying that the corresponding class is an `interface`. - */ - @JvmField - val IS_INTERFACE = MetadataFlag(F.CLASS_KIND, ClassKind.INTERFACE_VALUE) - - /** - * A class kind flag, signifying that the corresponding class is an `enum class`. - */ - @JvmField - val IS_ENUM_CLASS = MetadataFlag(F.CLASS_KIND, ClassKind.ENUM_CLASS_VALUE) - - /** - * A class kind flag, signifying that the corresponding class is an enum entry. - */ - @JvmField - val IS_ENUM_ENTRY = MetadataFlag(F.CLASS_KIND, ClassKind.ENUM_ENTRY_VALUE) - - /** - * A class kind flag, signifying that the corresponding class is an `annotation class`. - */ - @JvmField - val IS_ANNOTATION_CLASS = MetadataFlag(F.CLASS_KIND, ClassKind.ANNOTATION_CLASS_VALUE) - - /** - * A class kind flag, signifying that the corresponding class is a non-companion `object`. - */ - @JvmField - val IS_OBJECT = MetadataFlag(F.CLASS_KIND, ClassKind.OBJECT_VALUE) - - /** - * A class kind flag, signifying that the corresponding class is a `companion object`. - */ - @JvmField - val IS_COMPANION_OBJECT = MetadataFlag(F.CLASS_KIND, ClassKind.COMPANION_OBJECT_VALUE) - - - /** - * Signifies that the corresponding class is `inner`. - */ - @JvmField - val IS_INNER = MetadataFlag(F.IS_INNER) - - /** - * Signifies that the corresponding class is `data`. - */ - @JvmField - val IS_DATA = MetadataFlag(F.IS_DATA) - - /** - * Signifies that the corresponding class is `external`. - */ - @JvmField - val IS_EXTERNAL = MetadataFlag(F.IS_EXTERNAL_CLASS) - - /** - * Signifies that the corresponding class is `expect`. - */ - @JvmField - val IS_EXPECT = MetadataFlag(F.IS_EXPECT_CLASS) - - /** - * Signifies that the corresponding class is `inline`. - */ - @JvmField - val IS_INLINE = MetadataFlag(F.IS_INLINE_CLASS) - } - - /** - * A container of flags applicable to Kotlin constructors. - */ - object Constructor { - /** - * Signifies that the corresponding constructor is primary, i.e. declared in the class header, not in the class body. - */ - @JvmField - val IS_PRIMARY = MetadataFlag(F.IS_SECONDARY, 0) - } - - /** - * A container of flags applicable to Kotlin functions. - * - * In addition to the common flag groups, the following flag groups exist for function flags: - * * member kind flags: [IS_DECLARATION], [IS_FAKE_OVERRIDE], [IS_DELEGATION], [IS_SYNTHESIZED] - */ - object Function { - /** - * A member kind flag, signifying that the corresponding function is explicitly declared in the containing class. - */ - @JvmField - val IS_DECLARATION = MetadataFlag(F.MEMBER_KIND, MemberKind.DECLARATION_VALUE) - - /** - * A member kind flag, signifying that the corresponding function exists in the containing class because a function with a suitable - * signature exists in a supertype. This flag is not written by the Kotlin compiler and its effects are unspecified. - */ - @JvmField - val IS_FAKE_OVERRIDE = MetadataFlag(F.MEMBER_KIND, MemberKind.FAKE_OVERRIDE_VALUE) - - /** - * A member kind flag, signifying that the corresponding function exists in the containing class because it has been produced - * by interface delegation (delegation "by"). - */ - @JvmField - val IS_DELEGATION = MetadataFlag(F.MEMBER_KIND, MemberKind.DELEGATION_VALUE) - - /** - * A member kind flag, signifying that the corresponding function exists in the containing class because it has been synthesized - * by the compiler and has no declaration in the source code. - */ - @JvmField - val IS_SYNTHESIZED = MetadataFlag(F.MEMBER_KIND, MemberKind.SYNTHESIZED_VALUE) - - - /** - * Signifies that the corresponding function is `operator`. - */ - @JvmField - val IS_OPERATOR = MetadataFlag(F.IS_OPERATOR) - - /** - * Signifies that the corresponding function is `infix`. - */ - @JvmField - val IS_INFIX = MetadataFlag(F.IS_INFIX) - - /** - * Signifies that the corresponding function is `inline`. - */ - @JvmField - val IS_INLINE = MetadataFlag(F.IS_INLINE) - - /** - * Signifies that the corresponding function is `tailrec`. - */ - @JvmField - val IS_TAILREC = MetadataFlag(F.IS_TAILREC) - - /** - * Signifies that the corresponding function is `external`. - */ - @JvmField - val IS_EXTERNAL = MetadataFlag(F.IS_EXTERNAL_FUNCTION) - - /** - * Signifies that the corresponding function is `suspend`. - */ - @JvmField - val IS_SUSPEND = MetadataFlag(F.IS_SUSPEND) - - /** - * Signifies that the corresponding function is `expect`. - */ - @JvmField - val IS_EXPECT = MetadataFlag(F.IS_EXPECT_FUNCTION) - } - - /** - * A container of flags applicable to Kotlin properties. - * - * In addition to the common flag groups, the following flag groups exist for property flags: - * * member kind flags: [IS_DECLARATION], [IS_FAKE_OVERRIDE], [IS_DELEGATION], [IS_SYNTHESIZED] - */ - object Property { - /** - * A member kind flag, signifying that the corresponding property is explicitly declared in the containing class. - */ - @JvmField - val IS_DECLARATION = MetadataFlag(F.MEMBER_KIND, MemberKind.DECLARATION_VALUE) - - /** - * A member kind flag, signifying that the corresponding property exists in the containing class because a property with a suitable - * signature exists in a supertype. This flag is not written by the Kotlin compiler and its effects are unspecified. - */ - @JvmField - val IS_FAKE_OVERRIDE = MetadataFlag(F.MEMBER_KIND, MemberKind.FAKE_OVERRIDE_VALUE) - - /** - * A member kind flag, signifying that the corresponding property exists in the containing class because it has been produced - * by interface delegation (delegation "by"). - */ - @JvmField - val IS_DELEGATION = MetadataFlag(F.MEMBER_KIND, MemberKind.DELEGATION_VALUE) - - /** - * A member kind flag, signifying that the corresponding property exists in the containing class because it has been synthesized - * by the compiler and has no declaration in the source code. - */ - @JvmField - val IS_SYNTHESIZED = MetadataFlag(F.MEMBER_KIND, MemberKind.SYNTHESIZED_VALUE) - - - /** - * Signifies that the corresponding property is `var`. - */ - @JvmField - val IS_VAR = MetadataFlag(F.IS_VAR) - - /** - * Signifies that the corresponding property has a getter. - */ - @JvmField - val HAS_GETTER = MetadataFlag(F.HAS_GETTER) - - /** - * Signifies that the corresponding property has a setter. - */ - @JvmField - val HAS_SETTER = MetadataFlag(F.HAS_SETTER) - - /** - * Signifies that the corresponding property is `const`. - */ - @JvmField - val IS_CONST = MetadataFlag(F.IS_CONST) - - /** - * Signifies that the corresponding property is `lateinit`. - */ - @JvmField - val IS_LATEINIT = MetadataFlag(F.IS_LATEINIT) - - /** - * Signifies that the corresponding property has a constant value. On JVM, this flag allows an optimization similarly to - * [F.HAS_ANNOTATIONS]: constant values of properties are written to the bytecode directly, and this flag can be used to avoid - * reading the value from the bytecode in case there isn't one. - */ - @JvmField - val HAS_CONSTANT = MetadataFlag(F.HAS_CONSTANT) - - /** - * Signifies that the corresponding property is `external`. - */ - @JvmField - val IS_EXTERNAL = MetadataFlag(F.IS_EXTERNAL_PROPERTY) - - /** - * Signifies that the corresponding property is a delegated property. - */ - @JvmField - val IS_DELEGATED = MetadataFlag(F.IS_DELEGATED) - - /** - * Signifies that the corresponding property is `expect`. - */ - @JvmField - val IS_EXPECT = MetadataFlag(F.IS_EXPECT_PROPERTY) - } - - /** - * A container of flags applicable to Kotlin property getters and setters. - */ - object PropertyAccessor { - /** - * Signifies that the corresponding property accessor is not default, i.e. it has a body and/or annotations in the source code. - */ - @JvmField - val IS_NOT_DEFAULT = MetadataFlag(F.IS_NOT_DEFAULT) - - /** - * Signifies that the corresponding property accessor is `external`. - */ - @JvmField - val IS_EXTERNAL = MetadataFlag(F.IS_EXTERNAL_ACCESSOR) - - /** - * Signifies that the corresponding property accessor is `inline`. - */ - @JvmField - val IS_INLINE = MetadataFlag(F.IS_INLINE_ACCESSOR) - } - - /** - * A container of flags applicable to Kotlin types. - */ - object Type { - /** - * Signifies that the corresponding type is marked as nullable, i.e. has a question mark at the end of its notation. - */ - @JvmField - val IS_NULLABLE = MetadataFlag(0, 1, 1) - - /** - * Signifies that the corresponding type is `suspend`. - */ - @JvmField - val IS_SUSPEND = MetadataFlag(F.SUSPEND_TYPE.offset + 1, F.SUSPEND_TYPE.bitWidth, 1) - } - - /** - * A container of flags applicable to Kotlin type parameters. - */ - object TypeParameter { - /** - * Signifies that the corresponding type parameter is `reified`. - */ - @JvmField - val IS_REIFIED = MetadataFlag(0, 1, 1) - } - - /** - * A container of flags applicable to Kotlin value parameters. - */ - object ValueParameter { - /** - * Signifies that the corresponding value parameter declares a default value. Note that the default value itself can be a complex - * expression and is not available via metadata. Also note that in case of an override of a parameter with default value, the - * parameter in the derived method does _not_ declare the default value ([DECLARES_DEFAULT_VALUE] == false), but the parameter is - * still optional at the call site because the default value from the base method is used. - */ - @JvmField - val DECLARES_DEFAULT_VALUE = MetadataFlag(F.DECLARES_DEFAULT_VALUE) - - /** - * Signifies that the corresponding value parameter is `crossinline`. - */ - @JvmField - val IS_CROSSINLINE = MetadataFlag(F.IS_CROSSINLINE) - - /** - * Signifies that the corresponding value parameter is `noinline`. - */ - @JvmField - val IS_NOINLINE = MetadataFlag(F.IS_NOINLINE) - } - - /** - * A container of flags applicable to Kotlin effect expressions. - * - * Contracts are an internal feature of the standard Kotlin library, and their behavior and/or binary format - * may change in a subsequent release. - */ - object EffectExpression { - /** - * Signifies that the corresponding effect expression should be negated to compute the proposition or the conclusion of an effect. - */ - @JvmField - val IS_NEGATED = MetadataFlag(F.IS_NEGATED) - - /** - * Signifies that the corresponding effect expression checks whether a value of some variable is `null`. - */ - @JvmField - val IS_NULL_CHECK_PREDICATE = MetadataFlag(F.IS_NULL_CHECK_PREDICATE) - } -} +fun flagsOf(vararg flags: Flag): Flags = + flags.fold(0) { acc, flag -> flag + acc } diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/MetadataFlag.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/MetadataFlag.kt deleted file mode 100644 index 782ed012988..00000000000 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/MetadataFlag.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. - */ - -package kotlinx.metadata - -import org.jetbrains.kotlin.metadata.deserialization.Flags.BooleanFlagField -import org.jetbrains.kotlin.metadata.deserialization.Flags.FlagField - -/** - * Represents a boolean flag that is either present or not in a Kotlin declaration. - * - * @see Flags - */ -class MetadataFlag internal constructor( - private val offset: Int, - private val bitWidth: Int, - private val value: Int -) { - internal constructor(field: FlagField<*>, value: Int) : this(field.offset, field.bitWidth, value) - - internal constructor(field: BooleanFlagField) : this(field, 1) - - internal operator fun plus(flags: Int): Int = - (flags and (((1 shl bitWidth) - 1) shl offset).inv()) + (value shl offset) - - /** - * Checks whether the flag is present in the given bitmask. - */ - operator fun invoke(flags: Int): Boolean = - (flags ushr offset) and ((1 shl bitWidth) - 1) == value -} diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/annotations.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/annotations.kt index e0147cf4619..80b2f5788ff 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/annotations.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/annotations.kt @@ -8,7 +8,7 @@ package kotlinx.metadata /** * Represents an annotation, written to the Kotlin metadata. Note that not all annotations are written to metadata on all platforms. * For example, on JVM most of the annotations are written directly on the corresponding declarations in the class file, - * and entries in the metadata only have a flag ([Flags.HAS_ANNOTATIONS]) to signal if they do have annotations in the bytecode. + * and entries in the metadata only have a flag ([Flag.HAS_ANNOTATIONS]) to signal if they do have annotations in the bytecode. * On JVM, only annotations on type parameters and types are serialized to the Kotlin metadata. * * @param className the fully qualified name of the annotation class diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/readers.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/readers.kt index aeb80e7c398..6796a36e764 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/readers.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/readers.kt @@ -9,8 +9,8 @@ import kotlinx.metadata.* import kotlinx.metadata.impl.extensions.MetadataExtensions import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.* -import org.jetbrains.kotlin.metadata.deserialization.Flags import org.jetbrains.kotlin.protobuf.MessageLite +import org.jetbrains.kotlin.metadata.deserialization.Flags as F class ReadContext( internal val strings: NameResolver, @@ -104,8 +104,8 @@ private fun KmDeclarationContainerVisitor.visitDeclarations( for (property in properties) { val flags = property.flags - val defaultAccessorFlags = Flags.getAccessorFlags( - Flags.HAS_ANNOTATIONS.get(flags), Flags.VISIBILITY.get(flags), Flags.MODALITY.get(flags), false, false, false + val defaultAccessorFlags = F.getAccessorFlags( + F.HAS_ANNOTATIONS.get(flags), F.VISIBILITY.get(flags), F.MODALITY.get(flags), false, false, false ) visitProperty( flags, @@ -242,7 +242,7 @@ private fun ProtoBuf.ValueParameter.accept(v: KmValueParameterVisitor, c: ReadCo } private inline fun ProtoBuf.TypeParameter.accept( - visit: (flags: Int, name: String, id: Int, variance: KmVariance) -> KmTypeParameterVisitor?, + visit: (flags: Flags, name: String, id: Int, variance: KmVariance) -> KmTypeParameterVisitor?, c: ReadContext ) { val variance = when (variance!!) { @@ -405,9 +405,9 @@ private fun ProtoBuf.Expression.accept(v: KmEffectExpressionVisitor, c: ReadCont v.visitEnd() } -private val ProtoBuf.Type.typeFlags: Int +private val ProtoBuf.Type.typeFlags: Flags get() = (if (nullable) 1 shl 0 else 0) + (flags shl 1) -private val ProtoBuf.TypeParameter.typeParameterFlags: Int +private val ProtoBuf.TypeParameter.typeParameterFlags: Flags get() = if (reified) 1 else 0 diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/writers.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/writers.kt index 199ba54726f..b48482ca233 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/writers.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/writers.kt @@ -25,13 +25,13 @@ class WriteContext { } private fun writeTypeParameter( - c: WriteContext, flags: Int, name: String, id: Int, variance: KmVariance, + c: WriteContext, flags: Flags, name: String, id: Int, variance: KmVariance, output: (ProtoBuf.TypeParameter.Builder) -> Unit ): KmTypeParameterVisitor = object : KmTypeParameterVisitor() { private val t = ProtoBuf.TypeParameter.newBuilder() - override fun visitUpperBound(flags: Int): KmTypeVisitor? = + override fun visitUpperBound(flags: Flags): KmTypeVisitor? = writeType(c, flags) { t.addUpperBound(it) } override fun visitExtensions(type: KmExtensionType): KmTypeParameterExtensionVisitor? = @@ -40,7 +40,7 @@ private fun writeTypeParameter( override fun visitEnd() { t.name = c[name] t.id = id - val reified = Flags.TypeParameter.IS_REIFIED(flags) + val reified = Flag.TypeParameter.IS_REIFIED(flags) if (reified != ProtoBuf.TypeParameter.getDefaultInstance().reified) { t.reified = reified } @@ -53,7 +53,7 @@ private fun writeTypeParameter( } } -private fun writeType(c: WriteContext, flags: Int, output: (ProtoBuf.Type.Builder) -> Unit): KmTypeVisitor = +private fun writeType(c: WriteContext, flags: Flags, output: (ProtoBuf.Type.Builder) -> Unit): KmTypeVisitor = object : KmTypeVisitor() { private val t = ProtoBuf.Type.newBuilder() @@ -71,7 +71,7 @@ private fun writeType(c: WriteContext, flags: Int, output: (ProtoBuf.Type.Builde }) } - override fun visitArgument(flags: Int, variance: KmVariance): KmTypeVisitor? = + override fun visitArgument(flags: Flags, variance: KmVariance): KmTypeVisitor? = writeType(c, flags) { argument -> t.addArgument(ProtoBuf.Type.Argument.newBuilder().apply { if (variance == KmVariance.IN) { @@ -87,13 +87,13 @@ private fun writeType(c: WriteContext, flags: Int, output: (ProtoBuf.Type.Builde t.typeParameter = id } - override fun visitAbbreviatedType(flags: Int): KmTypeVisitor? = + override fun visitAbbreviatedType(flags: Flags): KmTypeVisitor? = writeType(c, flags) { t.abbreviatedType = it.build() } - override fun visitOuterType(flags: Int): KmTypeVisitor? = + override fun visitOuterType(flags: Flags): KmTypeVisitor? = writeType(c, flags) { t.outerType = it.build() } - override fun visitFlexibleTypeUpperBound(flags: Int, typeFlexibilityId: String?): KmTypeVisitor? = + override fun visitFlexibleTypeUpperBound(flags: Flags, typeFlexibilityId: String?): KmTypeVisitor? = writeType(c, flags) { if (typeFlexibilityId != null) { t.flexibleTypeCapabilitiesId = c[typeFlexibilityId] @@ -105,7 +105,7 @@ private fun writeType(c: WriteContext, flags: Int, output: (ProtoBuf.Type.Builde c.extensions.writeTypeExtensions(type, t, c.strings) override fun visitEnd() { - if (Flags.Type.IS_NULLABLE(flags)) { + if (Flag.Type.IS_NULLABLE(flags)) { t.nullable = true } val flagsToWrite = flags shr 1 @@ -116,11 +116,11 @@ private fun writeType(c: WriteContext, flags: Int, output: (ProtoBuf.Type.Builde } } -private fun writeConstructor(c: WriteContext, flags: Int, output: (ProtoBuf.Constructor.Builder) -> Unit): KmConstructorVisitor = +private fun writeConstructor(c: WriteContext, flags: Flags, output: (ProtoBuf.Constructor.Builder) -> Unit): KmConstructorVisitor = object : KmConstructorVisitor() { val t = ProtoBuf.Constructor.newBuilder() - override fun visitValueParameter(flags: Int, name: String): KmValueParameterVisitor? = + override fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor? = writeValueParameter(c, flags, name) { t.addValueParameter(it.build()) } override fun visitVersionRequirement(): KmVersionRequirementVisitor? = @@ -137,20 +137,20 @@ private fun writeConstructor(c: WriteContext, flags: Int, output: (ProtoBuf.Cons } } -private fun writeFunction(c: WriteContext, flags: Int, name: String, output: (ProtoBuf.Function.Builder) -> Unit): KmFunctionVisitor = +private fun writeFunction(c: WriteContext, flags: Flags, name: String, output: (ProtoBuf.Function.Builder) -> Unit): KmFunctionVisitor = object : KmFunctionVisitor() { val t = ProtoBuf.Function.newBuilder() - override fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = + override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = writeTypeParameter(c, flags, name, id, variance) { t.addTypeParameter(it) } - override fun visitReceiverParameterType(flags: Int): KmTypeVisitor? = + override fun visitReceiverParameterType(flags: Flags): KmTypeVisitor? = writeType(c, flags) { t.receiverType = it.build() } - override fun visitValueParameter(flags: Int, name: String): KmValueParameterVisitor? = + override fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor? = writeValueParameter(c, flags, name) { t.addValueParameter(it) } - override fun visitReturnType(flags: Int): KmTypeVisitor? = + override fun visitReturnType(flags: Flags): KmTypeVisitor? = writeType(c, flags) { t.returnType = it.build() } override fun visitVersionRequirement(): KmVersionRequirementVisitor? = @@ -172,20 +172,20 @@ private fun writeFunction(c: WriteContext, flags: Int, name: String, output: (Pr } private fun writeProperty( - c: WriteContext, flags: Int, name: String, getterFlags: Int, setterFlags: Int, output: (ProtoBuf.Property.Builder) -> Unit + c: WriteContext, flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags, output: (ProtoBuf.Property.Builder) -> Unit ): KmPropertyVisitor = object : KmPropertyVisitor() { val t = ProtoBuf.Property.newBuilder() - override fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = + override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = writeTypeParameter(c, flags, name, id, variance) { t.addTypeParameter(it) } - override fun visitReceiverParameterType(flags: Int): KmTypeVisitor? = + override fun visitReceiverParameterType(flags: Flags): KmTypeVisitor? = writeType(c, flags) { t.receiverType = it.build() } - override fun visitSetterParameter(flags: Int, name: String): KmValueParameterVisitor? = + override fun visitSetterParameter(flags: Flags, name: String): KmValueParameterVisitor? = writeValueParameter(c, flags, name) { t.setterValueParameter = it.build() } - override fun visitReturnType(flags: Int): KmTypeVisitor? = + override fun visitReturnType(flags: Flags): KmTypeVisitor? = writeType(c, flags) { t.returnType = it.build() } override fun visitVersionRequirement(): KmVersionRequirementVisitor? = @@ -207,15 +207,15 @@ private fun writeProperty( } private fun writeValueParameter( - c: WriteContext, flags: Int, name: String, + c: WriteContext, flags: Flags, name: String, output: (ProtoBuf.ValueParameter.Builder) -> Unit ): KmValueParameterVisitor = object : KmValueParameterVisitor() { val t = ProtoBuf.ValueParameter.newBuilder() - override fun visitType(flags: Int): KmTypeVisitor? = + override fun visitType(flags: Flags): KmTypeVisitor? = writeType(c, flags) { t.type = it.build() } - override fun visitVarargElementType(flags: Int): KmTypeVisitor? = + override fun visitVarargElementType(flags: Flags): KmTypeVisitor? = writeType(c, flags) { t.varargElementType = it.build() } override fun visitEnd() { @@ -228,18 +228,18 @@ private fun writeValueParameter( } private fun writeTypeAlias( - c: WriteContext, flags: Int, name: String, + c: WriteContext, flags: Flags, name: String, output: (ProtoBuf.TypeAlias.Builder) -> Unit ): KmTypeAliasVisitor = object : KmTypeAliasVisitor() { val t = ProtoBuf.TypeAlias.newBuilder() - override fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = + override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = writeTypeParameter(c, flags, name, id, variance) { t.addTypeParameter(it) } - override fun visitUnderlyingType(flags: Int): KmTypeVisitor? = + override fun visitUnderlyingType(flags: Flags): KmTypeVisitor? = writeType(c, flags) { t.underlyingType = it.build() } - override fun visitExpandedType(flags: Int): KmTypeVisitor? = + override fun visitExpandedType(flags: Flags): KmTypeVisitor? = writeType(c, flags) { t.expandedType = it.build() } override fun visitAnnotation(annotation: KmAnnotation) { @@ -351,7 +351,7 @@ private fun writeEffectExpression(c: WriteContext, output: (ProtoBuf.Expression. object : KmEffectExpressionVisitor() { val t = ProtoBuf.Expression.newBuilder() - override fun visit(flags: Int, parameterIndex: Int?) { + override fun visit(flags: Flags, parameterIndex: Int?) { if (flags != ProtoBuf.Expression.getDefaultInstance().flags) { t.flags = flags } @@ -370,7 +370,7 @@ private fun writeEffectExpression(c: WriteContext, output: (ProtoBuf.Expression. } } - override fun visitIsInstanceType(flags: Int): KmTypeVisitor? = + override fun visitIsInstanceType(flags: Flags): KmTypeVisitor? = writeType(c, flags) { t.isInstanceType = it.build() } override fun visitAndArgument(): KmEffectExpressionVisitor? = @@ -388,29 +388,29 @@ open class ClassWriter : KmClassVisitor() { val t = ProtoBuf.Class.newBuilder()!! val c = WriteContext() - override fun visit(flags: Int, name: ClassName) { + override fun visit(flags: Flags, name: ClassName) { if (flags != ProtoBuf.Class.getDefaultInstance().flags) { t.flags = flags } t.fqName = c.getClassName(name) } - override fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = + override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = writeTypeParameter(c, flags, name, id, variance) { t.addTypeParameter(it) } - override fun visitSupertype(flags: Int): KmTypeVisitor? = + override fun visitSupertype(flags: Flags): KmTypeVisitor? = writeType(c, flags) { t.addSupertype(it) } - override fun visitConstructor(flags: Int): KmConstructorVisitor? = + override fun visitConstructor(flags: Flags): KmConstructorVisitor? = writeConstructor(c, flags) { t.addConstructor(it) } - override fun visitFunction(flags: Int, name: String): KmFunctionVisitor? = + override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? = writeFunction(c, flags, name) { t.addFunction(it) } - override fun visitProperty(flags: Int, name: String, getterFlags: Int, setterFlags: Int): KmPropertyVisitor? = + override fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor? = writeProperty(c, flags, name, getterFlags, setterFlags) { t.addProperty(it) } - override fun visitTypeAlias(flags: Int, name: String): KmTypeAliasVisitor? = + override fun visitTypeAlias(flags: Flags, name: String): KmTypeAliasVisitor? = writeTypeAlias(c, flags, name) { t.addTypeAlias(it) } override fun visitCompanionObject(name: String) { @@ -445,13 +445,13 @@ open class PackageWriter : KmPackageVisitor() { val t = ProtoBuf.Package.newBuilder()!! val c = WriteContext() - override fun visitFunction(flags: Int, name: String): KmFunctionVisitor? = + override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? = writeFunction(c, flags, name) { t.addFunction(it) } - override fun visitProperty(flags: Int, name: String, getterFlags: Int, setterFlags: Int): KmPropertyVisitor? = + override fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor? = writeProperty(c, flags, name, getterFlags, setterFlags) { t.addProperty(it) } - override fun visitTypeAlias(flags: Int, name: String): KmTypeAliasVisitor? = + override fun visitTypeAlias(flags: Flags, name: String): KmTypeAliasVisitor? = writeTypeAlias(c, flags, name) { t.addTypeAlias(it) } override fun visitEnd() { @@ -465,6 +465,6 @@ open class LambdaWriter : KmLambdaVisitor() { var t: ProtoBuf.Function.Builder? = null val c = WriteContext() - override fun visitFunction(flags: Int, name: String): KmFunctionVisitor? = + override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? = writeFunction(c, flags, name) { t = it } } diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/visitors.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/visitors.kt index 0d0e8e85aaf..309a872e47b 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/visitors.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/visitors.kt @@ -12,32 +12,32 @@ abstract class KmDeclarationContainerVisitor @JvmOverloads constructor(protected /** * Visits a function in the container. * - * @param flags function flags, consisting of [Flags.HAS_ANNOTATIONS], visibility flag, modality flag and [Flags.Function] flags + * @param flags function flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag and [Flag.Function] flags * @param name the name of the function */ - open fun visitFunction(flags: Int, name: String): KmFunctionVisitor? = + open fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? = delegate?.visitFunction(flags, name) /** * Visits a property in the container. * - * @param flags property flags, consisting of [Flags.HAS_ANNOTATIONS], visibility flag, modality flag and [Flags.Property] flags + * @param flags property flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag and [Flag.Property] flags * @param name the name of the property - * @param getterFlags property accessor flags, consisting of [Flags.HAS_ANNOTATIONS], visibility flag, modality flag - * and [Flags.PropertyAccessor] flags - * @param setterFlags property accessor flags, consisting of [Flags.HAS_ANNOTATIONS], visibility flag, modality flag - * and [Flags.PropertyAccessor] flags + * @param getterFlags property accessor flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag + * and [Flag.PropertyAccessor] flags + * @param setterFlags property accessor flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag + * and [Flag.PropertyAccessor] flags */ - open fun visitProperty(flags: Int, name: String, getterFlags: Int, setterFlags: Int): KmPropertyVisitor? = + open fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor? = delegate?.visitProperty(flags, name, getterFlags, setterFlags) /** * Visits a type alias in the container. * - * @param flags type alias flags, consisting of [Flags.HAS_ANNOTATIONS] and visibility flag + * @param flags type alias flags, consisting of [Flag.HAS_ANNOTATIONS] and visibility flag * @param name the name of the type alias */ - open fun visitTypeAlias(flags: Int, name: String): KmTypeAliasVisitor? = + open fun visitTypeAlias(flags: Flags, name: String): KmTypeAliasVisitor? = delegate?.visitTypeAlias(flags, name) } @@ -54,39 +54,39 @@ abstract class KmClassVisitor @JvmOverloads constructor(delegate: KmClassVisitor /** * Visits the basic information about the class. * - * @param flags class flags, consisting of [Flags.HAS_ANNOTATIONS], visibility flag, modality flag and [Flags.Class] flags + * @param flags class flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag and [Flag.Class] flags * @param name the name of the class */ - open fun visit(flags: Int, name: ClassName) { + open fun visit(flags: Flags, name: ClassName) { delegate?.visit(flags, name) } /** * Visits a type parameter of the class. * - * @param flags type parameter flags, consisting of [Flags.TypeParameter] flags + * @param flags type parameter flags, consisting of [Flag.TypeParameter] flags * @param name the name of the type parameter * @param id the id of the type parameter, useful to be able to uniquely identify the type parameter in different contexts where * the name isn't enough (e.g. `class A { fun foo(t: T) }`) * @param variance the declaration-site variance of the type parameter */ - open fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = + open fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = delegate?.visitTypeParameter(flags, name, id, variance) /** * Visits a supertype of the class. * - * @param flags type flags, consisting of [Flags.Type] flags + * @param flags type flags, consisting of [Flag.Type] flags */ - open fun visitSupertype(flags: Int): KmTypeVisitor? = + open fun visitSupertype(flags: Flags): KmTypeVisitor? = delegate?.visitSupertype(flags) /** * Visits a constructor of the class. * - * @param flags constructor flags, consisting of [Flags.HAS_ANNOTATIONS], visibility flag and [Flags.Constructor] flags + * @param flags constructor flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag and [Flag.Constructor] flags */ - open fun visitConstructor(flags: Int): KmConstructorVisitor? = + open fun visitConstructor(flags: Flags): KmConstructorVisitor? = delegate?.visitConstructor(flags) /** @@ -165,10 +165,10 @@ abstract class KmLambdaVisitor @JvmOverloads constructor(private val delegate: K /** * Visits the signature of a synthetic anonymous function, representing the lambda. * - * @param flags function flags, consisting of [Flags.HAS_ANNOTATIONS], visibility flag, modality flag and [Flags.Function] flags + * @param flags function flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag and [Flag.Function] flags * @param name the name of the function (usually `""` or `""` for lambdas emitted by the Kotlin compiler) */ - open fun visitFunction(flags: Int, name: String): KmFunctionVisitor? = + open fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? = delegate?.visitFunction(flags, name) /** @@ -188,10 +188,10 @@ abstract class KmConstructorVisitor @JvmOverloads constructor(private val delega /** * Visits a value parameter of the constructor. * - * @param flags value parameter flags, consisting of [Flags.ValueParameter] flags + * @param flags value parameter flags, consisting of [Flag.ValueParameter] flags * @param name the name of the value parameter */ - open fun visitValueParameter(flags: Int, name: String): KmValueParameterVisitor? = + open fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor? = delegate?.visitValueParameter(flags, name) /** @@ -226,38 +226,38 @@ abstract class KmFunctionVisitor @JvmOverloads constructor(private val delegate: /** * Visits a type parameter of the function. * - * @param flags type parameter flags, consisting of [Flags.TypeParameter] flags + * @param flags type parameter flags, consisting of [Flag.TypeParameter] flags * @param name the name of the type parameter * @param id the id of the type parameter, useful to be able to uniquely identify the type parameter in different contexts where * the name isn't enough (e.g. `class A { fun foo(t: T) }`) * @param variance the declaration-site variance of the type parameter */ - open fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = + open fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = delegate?.visitTypeParameter(flags, name, id, variance) /** * Visits the type of the receiver of the function, if this is an extension function. * - * @param flags type flags, consisting of [Flags.Type] flags + * @param flags type flags, consisting of [Flag.Type] flags */ - open fun visitReceiverParameterType(flags: Int): KmTypeVisitor? = + open fun visitReceiverParameterType(flags: Flags): KmTypeVisitor? = delegate?.visitReceiverParameterType(flags) /** * Visits a value parameter of the function. * - * @param flags value parameter flags, consisting of [Flags.ValueParameter] flags + * @param flags value parameter flags, consisting of [Flag.ValueParameter] flags * @param name the name of the value parameter */ - open fun visitValueParameter(flags: Int, name: String): KmValueParameterVisitor? = + open fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor? = delegate?.visitValueParameter(flags, name) /** * Visits the return type of the function. * - * @param flags type flags, consisting of [Flags.Type] flags + * @param flags type flags, consisting of [Flag.Type] flags */ - open fun visitReturnType(flags: Int): KmTypeVisitor? = + open fun visitReturnType(flags: Flags): KmTypeVisitor? = delegate?.visitReturnType(flags) /** @@ -298,38 +298,38 @@ abstract class KmPropertyVisitor @JvmOverloads constructor(private val delegate: /** * Visits a type parameter of the property. * - * @param flags type parameter flags, consisting of [Flags.TypeParameter] flags + * @param flags type parameter flags, consisting of [Flag.TypeParameter] flags * @param name the name of the type parameter * @param id the id of the type parameter, useful to be able to uniquely identify the type parameter in different contexts where * the name isn't enough (e.g. `class A { fun foo(t: T) }`) * @param variance the declaration-site variance of the type parameter */ - open fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = + open fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = delegate?.visitTypeParameter(flags, name, id, variance) /** * Visits the type of the receiver of the property, if this is an extension property. * - * @param flags type flags, consisting of [Flags.Type] flags + * @param flags type flags, consisting of [Flag.Type] flags */ - open fun visitReceiverParameterType(flags: Int): KmTypeVisitor? = + open fun visitReceiverParameterType(flags: Flags): KmTypeVisitor? = delegate?.visitReceiverParameterType(flags) /** * Visits a value parameter of the setter of this property, if this is a `var` property. * - * @param flags value parameter flags, consisting of [Flags.ValueParameter] flags + * @param flags value parameter flags, consisting of [Flag.ValueParameter] flags * @param name the name of the value parameter (`""` for properties emitted by the Kotlin compiler) */ - open fun visitSetterParameter(flags: Int, name: String): KmValueParameterVisitor? = + open fun visitSetterParameter(flags: Flags, name: String): KmValueParameterVisitor? = delegate?.visitSetterParameter(flags, name) /** * Visits the type of the property. * - * @param flags type flags, consisting of [Flags.Type] flags + * @param flags type flags, consisting of [Flag.Type] flags */ - open fun visitReturnType(flags: Int): KmTypeVisitor? = + open fun visitReturnType(flags: Flags): KmTypeVisitor? = delegate?.visitReturnType(flags) /** @@ -364,30 +364,30 @@ abstract class KmTypeAliasVisitor @JvmOverloads constructor(private val delegate /** * Visits a type parameter of the type alias. * - * @param flags type parameter flags, consisting of [Flags.TypeParameter] flags + * @param flags type parameter flags, consisting of [Flag.TypeParameter] flags * @param name the name of the type parameter * @param id the id of the type parameter, useful to be able to uniquely identify the type parameter in different contexts where * the name isn't enough (e.g. `class A { fun foo(t: T) }`) * @param variance the declaration-site variance of the type parameter */ - open fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = + open fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = delegate?.visitTypeParameter(flags, name, id, variance) /** * Visits the underlying type of the type alias, i.e. the type in the right-hand side of the type alias declaration. * - * @param flags type flags, consisting of [Flags.Type] flags + * @param flags type flags, consisting of [Flag.Type] flags */ - open fun visitUnderlyingType(flags: Int): KmTypeVisitor? = + open fun visitUnderlyingType(flags: Flags): KmTypeVisitor? = delegate?.visitUnderlyingType(flags) /** * Visits the expanded type of the type alias, i.e. the full expansion of the underlying type, where all type aliases are substituted * with their expanded types. If not type aliases are used in the underlying type, expanded type is equal to the underlying type. * - * @param flags type flags, consisting of [Flags.Type] flags + * @param flags type flags, consisting of [Flag.Type] flags */ - open fun visitExpandedType(flags: Int): KmTypeVisitor? = + open fun visitExpandedType(flags: Flags): KmTypeVisitor? = delegate?.visitExpandedType(flags) /** @@ -423,17 +423,17 @@ abstract class KmValueParameterVisitor @JvmOverloads constructor(private val del /** * Visits the type of the value parameter, if this is **not** a `vararg` parameter. * - * @param flags type flags, consisting of [Flags.Type] flags + * @param flags type flags, consisting of [Flag.Type] flags */ - open fun visitType(flags: Int): KmTypeVisitor? = + open fun visitType(flags: Flags): KmTypeVisitor? = delegate?.visitType(flags) /** * Visits the type of the value parameter, if this is a `vararg` parameter. * - * @param flags type flags, consisting of [Flags.Type] flags + * @param flags type flags, consisting of [Flag.Type] flags */ - open fun visitVarargElementType(flags: Int): KmTypeVisitor? = + open fun visitVarargElementType(flags: Flags): KmTypeVisitor? = delegate?.visitVarargElementType(flags) /** @@ -453,9 +453,9 @@ abstract class KmTypeParameterVisitor @JvmOverloads constructor(private val dele /** * Visits the upper bound of the type parameter. * - * @param flags type flags, consisting of [Flags.Type] flags + * @param flags type flags, consisting of [Flag.Type] flags */ - open fun visitUpperBound(flags: Int): KmTypeVisitor? = + open fun visitUpperBound(flags: Flags): KmTypeVisitor? = delegate?.visitUpperBound(flags) /** @@ -518,10 +518,10 @@ abstract class KmTypeVisitor @JvmOverloads constructor(private val delegate: KmT * Visits the type projection used in a type argument of the type based on a class or on a type alias. * For example, in `MutableMap`, `in String?` is the type projection which is the first type argument of the type. * - * @param flags type flags, consisting of [Flags.Type] flags + * @param flags type flags, consisting of [Flag.Type] flags * @param variance the variance of the type projection */ - open fun visitArgument(flags: Int, variance: KmVariance): KmTypeVisitor? = + open fun visitArgument(flags: Flags, variance: KmVariance): KmTypeVisitor? = delegate?.visitArgument(flags, variance) /** @@ -541,9 +541,9 @@ abstract class KmTypeVisitor @JvmOverloads constructor(private val delegate: KmT * * The type of the `foo`'s parameter in the metadata is actually `MutableList`, and its abbreviation is `A`. * - * @param flags type flags, consisting of [Flags.Type] flags + * @param flags type flags, consisting of [Flag.Type] flags */ - open fun visitAbbreviatedType(flags: Int): KmTypeVisitor? = + open fun visitAbbreviatedType(flags: Flags): KmTypeVisitor? = delegate?.visitAbbreviatedType(flags) /** @@ -556,20 +556,20 @@ abstract class KmTypeVisitor @JvmOverloads constructor(private val delegate: KmT * The type of the `foo`'s parameter in the metadata is `B` (a type whose classifier is class `B`, and it has one type argument, * type `Byte?`), and its outer type is `A<*>` (a type whose classifier is class `A`, and it has one type argument, star projection). * - * @param flags type flags, consisting of [Flags.Type] flags + * @param flags type flags, consisting of [Flag.Type] flags */ - open fun visitOuterType(flags: Int): KmTypeVisitor? = + open fun visitOuterType(flags: Flags): KmTypeVisitor? = delegate?.visitOuterType(flags) /** * Visits the upper bound of the type, marking it as flexible and its contents as the lower bound. Flexible types in Kotlin include * platform types in Kotlin/JVM and `dynamic` type in Kotlin/JS. * - * @param flags type flags, consisting of [Flags.Type] flags + * @param flags type flags, consisting of [Flag.Type] flags * @param typeFlexibilityId id of the kind of flexibility this type has. For example, "kotlin.jvm.PlatformType" for JVM platform types, * or "kotlin.DynamicType" for JS dynamic type */ - open fun visitFlexibleTypeUpperBound(flags: Int, typeFlexibilityId: String?): KmTypeVisitor? = + open fun visitFlexibleTypeUpperBound(flags: Flags, typeFlexibilityId: String?): KmTypeVisitor? = delegate?.visitFlexibleTypeUpperBound(flags, typeFlexibilityId) /** @@ -699,18 +699,18 @@ abstract class KmEffectVisitor @JvmOverloads constructor(private val delegate: K abstract class KmEffectExpressionVisitor @JvmOverloads constructor(private val delegate: KmEffectExpressionVisitor? = null) { /** * Visits the basic information of the effect expression. - * - * @param flags effect expression flags, consisting of [Flags.EffectExpression] flags + * + * @param flags effect expression flags, consisting of [Flag.EffectExpression] flags * @param parameterIndex optional 1-based index of the value parameter of the function, for effects which assert something about * the function parameters. The index 0 means the extension receiver parameter */ - open fun visit(flags: Int, parameterIndex: Int?) { + open fun visit(flags: Flags, parameterIndex: Int?) { delegate?.visit(flags, parameterIndex) } /** * Visits the constant value used in the effect expression. May be `true`, `false` or `null`. - * + * * @param value the constant value */ open fun visitConstantValue(value: Any?) { @@ -719,10 +719,10 @@ abstract class KmEffectExpressionVisitor @JvmOverloads constructor(private val d /** * Visits the type used as the target of an `is`-expression in the effect expression. - * - * @param flags type flags, consisting of [Flags.Type] flags + * + * @param flags type flags, consisting of [Flag.Type] flags */ - open fun visitIsInstanceType(flags: Int): KmTypeVisitor? = + open fun visitIsInstanceType(flags: Flags): KmTypeVisitor? = delegate?.visitIsInstanceType(flags) /** diff --git a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt index b083d0121c7..a45b595c576 100644 --- a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt +++ b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt @@ -12,7 +12,7 @@ private object SpecialCharacters { const val TYPE_ALIAS_MARKER = '^' } -private fun visitFunction(sb: StringBuilder, flags: Int, name: String): KmFunctionVisitor = +private fun visitFunction(sb: StringBuilder, flags: Flags, name: String): KmFunctionVisitor = object : KmFunctionVisitor() { val typeParams = mutableListOf() val params = mutableListOf() @@ -21,18 +21,18 @@ private fun visitFunction(sb: StringBuilder, flags: Int, name: String): KmFuncti var versionRequirement: String? = null var jvmDesc: String? = null - override fun visitReceiverParameterType(flags: Int): KmTypeVisitor? = + override fun visitReceiverParameterType(flags: Flags): KmTypeVisitor? = printType(flags) { receiverParameterType = it } override fun visitTypeParameter( - flags: Int, name: String, id: Int, variance: KmVariance + flags: Flags, name: String, id: Int, variance: KmVariance ): KmTypeParameterVisitor? = printTypeParameter(flags, name, id, variance) { typeParams.add(it) } - override fun visitValueParameter(flags: Int, name: String): KmValueParameterVisitor? = + override fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor? = printValueParameter(flags, name) { params.add(it) } - override fun visitReturnType(flags: Int): KmTypeVisitor? = + override fun visitReturnType(flags: Flags): KmTypeVisitor? = printType(flags) { returnType = it } override fun visitVersionRequirement(): KmVersionRequirementVisitor? = @@ -74,7 +74,7 @@ private fun visitFunction(sb: StringBuilder, flags: Int, name: String): KmFuncti } } -private fun visitProperty(sb: StringBuilder, flags: Int, name: String, getterFlags: Int, setterFlags: Int): KmPropertyVisitor = +private fun visitProperty(sb: StringBuilder, flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor = object : KmPropertyVisitor() { val typeParams = mutableListOf() var receiverParameterType: String? = null @@ -87,16 +87,16 @@ private fun visitProperty(sb: StringBuilder, flags: Int, name: String, getterFla var jvmSetterDesc: String? = null var jvmSyntheticMethodForAnnotationsDesc: String? = null - override fun visitReceiverParameterType(flags: Int): KmTypeVisitor? = + override fun visitReceiverParameterType(flags: Flags): KmTypeVisitor? = printType(flags) { receiverParameterType = it } - override fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = + override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = printTypeParameter(flags, name, id, variance) { typeParams.add(it) } - override fun visitSetterParameter(flags: Int, name: String): KmValueParameterVisitor? = + override fun visitSetterParameter(flags: Flags, name: String): KmValueParameterVisitor? = printValueParameter(flags, name) { setterParameter = it } - override fun visitReturnType(flags: Int): KmTypeVisitor? = + override fun visitReturnType(flags: Flags): KmTypeVisitor? = printType(flags) { returnType = it } override fun visitVersionRequirement(): KmVersionRequirementVisitor? = @@ -141,7 +141,7 @@ private fun visitProperty(sb: StringBuilder, flags: Int, name: String, getterFla } sb.append(" ") sb.appendFlags(flags, PROPERTY_FLAGS_MAP) - sb.append(if (Flags.Property.IS_VAR(flags)) "var " else "val ") + sb.append(if (Flag.Property.IS_VAR(flags)) "var " else "val ") if (typeParams.isNotEmpty()) { typeParams.joinTo(sb, prefix = "<", postfix = ">") sb.append(" ") @@ -153,16 +153,16 @@ private fun visitProperty(sb: StringBuilder, flags: Int, name: String, getterFla if (returnType != null) { sb.append(": ").append(returnType) } - if (Flags.Property.HAS_CONSTANT(flags)) { + if (Flag.Property.HAS_CONSTANT(flags)) { sb.append(" /* = ... */") } sb.appendln() - if (Flags.Property.HAS_GETTER(flags)) { + if (Flag.Property.HAS_GETTER(flags)) { sb.append(" ") sb.appendFlags(getterFlags, PROPERTY_ACCESSOR_FLAGS_MAP) sb.appendln("get") } - if (Flags.Property.HAS_SETTER(flags)) { + if (Flag.Property.HAS_SETTER(flags)) { sb.append(" ") sb.appendFlags(setterFlags, PROPERTY_ACCESSOR_FLAGS_MAP) sb.append("set") @@ -174,13 +174,13 @@ private fun visitProperty(sb: StringBuilder, flags: Int, name: String, getterFla } } -private fun visitConstructor(sb: StringBuilder, flags: Int): KmConstructorVisitor = +private fun visitConstructor(sb: StringBuilder, flags: Flags): KmConstructorVisitor = object : KmConstructorVisitor() { val params = mutableListOf() var versionRequirement: String? = null var jvmDesc: String? = null - override fun visitValueParameter(flags: Int, name: String): KmValueParameterVisitor? = + override fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor? = printValueParameter(flags, name) { params.add(it) } override fun visitVersionRequirement(): KmVersionRequirementVisitor? = @@ -211,7 +211,7 @@ private fun visitConstructor(sb: StringBuilder, flags: Int): KmConstructorVisito } } -private fun visitTypeAlias(sb: StringBuilder, flags: Int, name: String): KmTypeAliasVisitor = +private fun visitTypeAlias(sb: StringBuilder, flags: Flags, name: String): KmTypeAliasVisitor = object : KmTypeAliasVisitor() { val annotations = mutableListOf() val typeParams = mutableListOf() @@ -219,13 +219,13 @@ private fun visitTypeAlias(sb: StringBuilder, flags: Int, name: String): KmTypeA var expandedType: String? = null var versionRequirement: String? = null - override fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = + override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = printTypeParameter(flags, name, id, variance) { typeParams.add(it) } - override fun visitUnderlyingType(flags: Int): KmTypeVisitor? = + override fun visitUnderlyingType(flags: Flags): KmTypeVisitor? = printType(flags) { underlyingType = it } - override fun visitExpandedType(flags: Int): KmTypeVisitor? = + override fun visitExpandedType(flags: Flags): KmTypeVisitor? = printType(flags) { expandedType = it } override fun visitAnnotation(annotation: KmAnnotation) { @@ -259,7 +259,7 @@ private fun visitTypeAlias(sb: StringBuilder, flags: Int, name: String): KmTypeA } } -private fun printType(flags: Int, output: (String) -> Unit): KmTypeVisitor = +private fun printType(flags: Flags, output: (String) -> Unit): KmTypeVisitor = object : KmTypeVisitor() { var classifier: String? = null val arguments = mutableListOf() @@ -281,10 +281,10 @@ private fun printType(flags: Int, output: (String) -> Unit): KmTypeVisitor = classifier = "$name${SpecialCharacters.TYPE_ALIAS_MARKER}" } - override fun visitAbbreviatedType(flags: Int): KmTypeVisitor? = + override fun visitAbbreviatedType(flags: Flags): KmTypeVisitor? = printType(flags) { abbreviatedType = it } - override fun visitArgument(flags: Int, variance: KmVariance): KmTypeVisitor? = + override fun visitArgument(flags: Flags, variance: KmVariance): KmTypeVisitor? = printType(flags) { argumentTypeString -> arguments += buildString { if (variance != KmVariance.INVARIANT) { @@ -298,10 +298,10 @@ private fun printType(flags: Int, output: (String) -> Unit): KmTypeVisitor = arguments += "*" } - override fun visitOuterType(flags: Int): KmTypeVisitor? = + override fun visitOuterType(flags: Flags): KmTypeVisitor? = printType(flags) { outerType = it } - override fun visitFlexibleTypeUpperBound(flags: Int, typeFlexibilityId: String?): KmTypeVisitor? = + override fun visitFlexibleTypeUpperBound(flags: Flags, typeFlexibilityId: String?): KmTypeVisitor? = if (typeFlexibilityId == JvmTypeExtensionVisitor.PLATFORM_TYPE_ID) { printType(flags) { platformTypeUpperBound = it } } else null @@ -336,7 +336,7 @@ private fun printType(flags: Int, output: (String) -> Unit): KmTypeVisitor = if (arguments.isNotEmpty()) { arguments.joinTo(this, prefix = "<", postfix = ">") } - if (Flags.Type.IS_NULLABLE(flags)) { + if (Flag.Type.IS_NULLABLE(flags)) { append("?") } if (abbreviatedType != null) { @@ -352,12 +352,14 @@ private fun printType(flags: Int, output: (String) -> Unit): KmTypeVisitor = } } -private fun printTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance, output: (String) -> Unit): KmTypeParameterVisitor = +private fun printTypeParameter( + flags: Flags, name: String, id: Int, variance: KmVariance, output: (String) -> Unit +): KmTypeParameterVisitor = object : KmTypeParameterVisitor() { val bounds = mutableListOf() val jvmAnnotations = mutableListOf() - override fun visitUpperBound(flags: Int): KmTypeVisitor? = + override fun visitUpperBound(flags: Flags): KmTypeVisitor? = printType(flags) { bounds += it } override fun visitExtensions(type: KmExtensionType): KmTypeParameterExtensionVisitor? { @@ -386,15 +388,15 @@ private fun printTypeParameter(flags: Int, name: String, id: Int, variance: KmVa } } -private fun printValueParameter(flags: Int, name: String, output: (String) -> Unit): KmValueParameterVisitor = +private fun printValueParameter(flags: Flags, name: String, output: (String) -> Unit): KmValueParameterVisitor = object : KmValueParameterVisitor() { var varargElementType: String? = null var type: String? = null - override fun visitType(flags: Int): KmTypeVisitor? = + override fun visitType(flags: Flags): KmTypeVisitor? = printType(flags) { type = it } - override fun visitVarargElementType(flags: Int): KmTypeVisitor? = + override fun visitVarargElementType(flags: Flags): KmTypeVisitor? = printType(flags) { varargElementType = it } override fun visitEnd() { @@ -405,7 +407,7 @@ private fun printValueParameter(flags: Int, name: String, output: (String) -> Un } else { append(name).append(": ").append(type) } - if (Flags.ValueParameter.DECLARES_DEFAULT_VALUE(flags)) { + if (Flag.ValueParameter.DECLARES_DEFAULT_VALUE(flags)) { append(" /* = ... */") } }) @@ -491,7 +493,7 @@ private fun printVersionRequirement(output: (String) -> Unit): KmVersionRequirem } } -private fun StringBuilder.appendFlags(flags: Int, map: Map) { +private fun StringBuilder.appendFlags(flags: Flags, map: Map) { for ((modifier, string) in map) { if (modifier(flags)) { append(string) @@ -508,13 +510,13 @@ class ClassPrinter : KmClassVisitor(), AbstractPrinter() private val supertypes = mutableListOf() private var versionRequirement: String? = null - override fun visit(flags: Int, name: ClassName) { + override fun visit(flags: Flags, name: ClassName) { this.flags = flags this.name = name } @@ -537,22 +539,22 @@ class ClassPrinter : KmClassVisitor(), AbstractPrinter