aboutsummaryrefslogtreecommitdiff
path: root/interop/kotlinx-metadata/src
diff options
context:
space:
mode:
authorZac Sweers <zac.sweers@gmail.com>2023-07-14 10:47:50 -0400
committerGitHub <noreply@github.com>2023-07-14 10:47:50 -0400
commita5bc35277e2a8898f215dda1fc4085b1303ed675 (patch)
tree4d5190963f82b0976bcd88ce8b38bcb44ee3e08a /interop/kotlinx-metadata/src
parent90841a5fd8c3be9624726db190283e218ab4dd19 (diff)
downloadkotlinpoet-a5bc35277e2a8898f215dda1fc4085b1303ed675.tar.gz
Update kotlinx-metadata to 0.7.0 (#1627)
Diffstat (limited to 'interop/kotlinx-metadata/src')
-rw-r--r--interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/Flags.kt338
-rw-r--r--interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/KotlinPoetMetadata.kt2
-rw-r--r--interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/ClassInspectorUtil.kt6
-rw-r--r--interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/ElementsClassInspector.kt41
-rw-r--r--interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/JvmDescriptorUtils.kt1
-rw-r--r--interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/ReflectiveClassInspector.kt44
-rw-r--r--interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/specs/KmTypes.kt10
-rw-r--r--interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/specs/KotlinPoetMetadataSpecs.kt241
-rw-r--r--interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/specs/kmAnnotations.kt7
-rw-r--r--interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/util.kt74
-rw-r--r--interop/kotlinx-metadata/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/KmAnnotationsTest.kt2
-rw-r--r--interop/kotlinx-metadata/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/KotlinPoetMetadataSpecsTest.kt18
-rw-r--r--interop/kotlinx-metadata/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/MultiClassInspectorTest.kt2
13 files changed, 229 insertions, 557 deletions
diff --git a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/Flags.kt b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/Flags.kt
deleted file mode 100644
index 4745dda0..00000000
--- a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/Flags.kt
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * Copyright (C) 2019 Square, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-@file:Suppress("unused")
-
-package com.squareup.kotlinpoet.metadata
-
-import kotlinx.metadata.Flag
-import kotlinx.metadata.Flags
-import kotlinx.metadata.KmClass
-import kotlinx.metadata.KmConstructor
-import kotlinx.metadata.KmFunction
-import kotlinx.metadata.KmProperty
-import kotlinx.metadata.KmType
-import kotlinx.metadata.KmTypeParameter
-import kotlinx.metadata.KmValueParameter
-
-// Common flags for any element with flags.
-@KotlinPoetMetadataPreview
-public val Flags.hasAnnotations: Boolean get() = Flag.HAS_ANNOTATIONS(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isAbstract: Boolean get() = Flag.IS_ABSTRACT(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isFinal: Boolean get() = Flag.IS_FINAL(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isInternal: Boolean get() = Flag.IS_INTERNAL(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isLocal: Boolean get() = Flag.IS_LOCAL(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isOpen: Boolean get() = Flag.IS_OPEN(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isPrivate: Boolean get() = Flag.IS_PRIVATE(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isPrivate_to_this: Boolean get() = Flag.IS_PRIVATE_TO_THIS(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isProtected: Boolean get() = Flag.IS_PROTECTED(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isPublic: Boolean get() = Flag.IS_PUBLIC(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isSealed: Boolean get() = Flag.IS_SEALED(this)
-
-// Type flags.
-@KotlinPoetMetadataPreview
-public val Flags.isNullableType: Boolean get() = Flag.Type.IS_NULLABLE(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isSuspendType: Boolean get() = Flag.Type.IS_SUSPEND(this)
-
-// Class flags.
-@KotlinPoetMetadataPreview
-public val Flags.isAnnotationClass: Boolean get() = Flag.Class.IS_ANNOTATION_CLASS(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isClass: Boolean get() = Flag.Class.IS_CLASS(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isCompanionObjectClass: Boolean get() = Flag.Class.IS_COMPANION_OBJECT(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isDataClass: Boolean get() = Flag.Class.IS_DATA(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isEnumClass: Boolean get() = Flag.Class.IS_ENUM_CLASS(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isEnumEntryClass: Boolean get() = Flag.Class.IS_ENUM_ENTRY(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isExpectClass: Boolean get() = Flag.Class.IS_EXPECT(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isExternalClass: Boolean get() = Flag.Class.IS_EXTERNAL(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isValueClass: Boolean get() = Flag.Class.IS_VALUE(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isInnerClass: Boolean get() = Flag.Class.IS_INNER(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isObjectClass: Boolean get() = Flag.Class.IS_OBJECT(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isInterface: Boolean get() = Flag.Class.IS_INTERFACE(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isFun: Boolean get() = Flag.Class.IS_FUN(this)
-
-@KotlinPoetMetadataPreview
-public val KmClass.isAnnotation: Boolean get() = flags.isAnnotationClass
-
-@KotlinPoetMetadataPreview
-public val KmClass.isClass: Boolean get() = flags.isClass
-
-@KotlinPoetMetadataPreview
-public val KmClass.isCompanionObject: Boolean get() = flags.isCompanionObjectClass
-
-@KotlinPoetMetadataPreview
-public val KmClass.isData: Boolean get() = flags.isDataClass
-
-@KotlinPoetMetadataPreview
-public val KmClass.isEnum: Boolean get() = flags.isEnumClass
-
-@KotlinPoetMetadataPreview
-public val KmClass.isEnumEntry: Boolean get() = flags.isEnumEntryClass
-
-@KotlinPoetMetadataPreview
-public val KmClass.isExpect: Boolean get() = flags.isExpectClass
-
-@KotlinPoetMetadataPreview
-public val KmClass.isExternal: Boolean get() = flags.isExternalClass
-
-@KotlinPoetMetadataPreview
-public val KmClass.isValue: Boolean get() = flags.isValueClass
-
-@KotlinPoetMetadataPreview
-public val KmClass.isInner: Boolean get() = flags.isInnerClass
-
-@KotlinPoetMetadataPreview
-public val KmClass.isObject: Boolean get() = flags.isObjectClass
-
-@KotlinPoetMetadataPreview
-public val KmClass.isInterface: Boolean get() = flags.isInterface
-
-@KotlinPoetMetadataPreview
-public val KmClass.isFun: Boolean get() = flags.isFun
-
-@KotlinPoetMetadataPreview
-public val KmType.isSuspend: Boolean get() = flags.isSuspendType
-
-@KotlinPoetMetadataPreview
-public val KmType.isNullable: Boolean get() = flags.isNullableType
-
-// Constructor flags.
-@KotlinPoetMetadataPreview
-public val Flags.isPrimaryConstructor: Boolean get() = !Flag.Constructor.IS_SECONDARY(this)
-
-@KotlinPoetMetadataPreview
-public val KmConstructor.isPrimary: Boolean get() = flags.isPrimaryConstructor
-
-@KotlinPoetMetadataPreview
-public val KmConstructor.isSecondary: Boolean get() = !isPrimary
-
-// Function flags.
-@KotlinPoetMetadataPreview
-public val Flags.isDeclarationFunction: Boolean get() = Flag.Function.IS_DECLARATION(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isFakeOverrideFunction: Boolean get() = Flag.Function.IS_FAKE_OVERRIDE(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isDelegationFunction: Boolean get() = Flag.Function.IS_DELEGATION(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isSynthesizedFunction: Boolean get() = Flag.Function.IS_SYNTHESIZED(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isOperatorFunction: Boolean get() = Flag.Function.IS_OPERATOR(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isInfixFunction: Boolean get() = Flag.Function.IS_INFIX(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isInlineFunction: Boolean get() = Flag.Function.IS_INLINE(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isTailRecFunction: Boolean get() = Flag.Function.IS_TAILREC(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isExternalFunction: Boolean get() = Flag.Function.IS_EXTERNAL(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isSuspendFunction: Boolean get() = Flag.Function.IS_SUSPEND(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isExpectFunction: Boolean get() = Flag.Function.IS_EXPECT(this)
-
-@KotlinPoetMetadataPreview
-public val KmFunction.isDeclaration: Boolean get() = flags.isDeclarationFunction
-
-@KotlinPoetMetadataPreview
-public val KmFunction.isFakeOverride: Boolean get() = flags.isFakeOverrideFunction
-
-@KotlinPoetMetadataPreview
-public val KmFunction.isDelegation: Boolean get() = flags.isDelegationFunction
-
-@KotlinPoetMetadataPreview
-public val KmFunction.isSynthesized: Boolean get() = flags.isSynthesizedFunction
-
-@KotlinPoetMetadataPreview
-public val KmFunction.isOperator: Boolean get() = flags.isOperatorFunction
-
-@KotlinPoetMetadataPreview
-public val KmFunction.isInfix: Boolean get() = flags.isInfixFunction
-
-@KotlinPoetMetadataPreview
-public val KmFunction.isInline: Boolean get() = flags.isInlineFunction
-
-@KotlinPoetMetadataPreview
-public val KmFunction.isTailRec: Boolean get() = flags.isTailRecFunction
-
-@KotlinPoetMetadataPreview
-public val KmFunction.isExternal: Boolean get() = flags.isExternalFunction
-
-@KotlinPoetMetadataPreview
-public val KmFunction.isSuspend: Boolean get() = flags.isSuspendFunction
-
-@KotlinPoetMetadataPreview
-public val KmFunction.isExpect: Boolean get() = flags.isExpectFunction
-
-// Parameter flags.
-@KotlinPoetMetadataPreview
-public val KmValueParameter.declaresDefaultValue: Boolean get() =
- Flag.ValueParameter.DECLARES_DEFAULT_VALUE(flags)
-
-@KotlinPoetMetadataPreview
-public val KmValueParameter.isCrossInline: Boolean get() = Flag.ValueParameter.IS_CROSSINLINE(flags)
-
-@KotlinPoetMetadataPreview
-public val KmValueParameter.isNoInline: Boolean get() = Flag.ValueParameter.IS_NOINLINE(flags)
-
-// Property flags.
-@KotlinPoetMetadataPreview
-public val Flags.isFakeOverrideProperty: Boolean get() = Flag.Property.IS_FAKE_OVERRIDE(this)
-
-@KotlinPoetMetadataPreview
-public val KmProperty.hasConstant: Boolean get() = Flag.Property.HAS_CONSTANT(flags)
-
-@KotlinPoetMetadataPreview
-public val KmProperty.hasGetter: Boolean get() = Flag.Property.HAS_GETTER(flags)
-
-@KotlinPoetMetadataPreview
-public val KmProperty.hasSetter: Boolean get() = Flag.Property.HAS_SETTER(flags)
-
-@KotlinPoetMetadataPreview
-public val KmProperty.isConst: Boolean get() = Flag.Property.IS_CONST(flags)
-
-@KotlinPoetMetadataPreview
-public val KmProperty.isDeclaration: Boolean get() = Flag.Property.IS_DECLARATION(flags)
-
-@KotlinPoetMetadataPreview
-public val KmProperty.isDelegated: Boolean get() = Flag.Property.IS_DELEGATED(flags)
-
-@KotlinPoetMetadataPreview
-public val KmProperty.isDelegation: Boolean get() = Flag.Property.IS_DELEGATION(flags)
-
-@KotlinPoetMetadataPreview
-public val KmProperty.isExpect: Boolean get() = Flag.Property.IS_EXPECT(flags)
-
-@KotlinPoetMetadataPreview
-public val KmProperty.isExternal: Boolean get() = Flag.Property.IS_EXTERNAL(flags)
-
-@KotlinPoetMetadataPreview
-public val KmProperty.isFakeOverride: Boolean get() = flags.isFakeOverrideProperty
-
-@KotlinPoetMetadataPreview
-public val KmProperty.isLateinit: Boolean get() = Flag.Property.IS_LATEINIT(flags)
-
-@KotlinPoetMetadataPreview
-public val KmProperty.isSynthesized: Boolean get() = Flag.Property.IS_SYNTHESIZED(flags)
-
-@KotlinPoetMetadataPreview
-public val KmProperty.isVar: Boolean get() = Flag.Property.IS_VAR(flags)
-
-@KotlinPoetMetadataPreview
-public val KmProperty.isVal: Boolean get() = !isVar
-
-// Property Accessor Flags
-@KotlinPoetMetadataPreview
-public val Flags.isPropertyAccessorExternal: Boolean
- get() = Flag.PropertyAccessor.IS_EXTERNAL(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isPropertyAccessorInline: Boolean
- get() = Flag.PropertyAccessor.IS_INLINE(this)
-
-@KotlinPoetMetadataPreview
-public val Flags.isPropertyAccessorNotDefault: Boolean
- get() = Flag.PropertyAccessor.IS_NOT_DEFAULT(this)
-
-// TypeParameter flags.
-@KotlinPoetMetadataPreview
-public val KmTypeParameter.isReified: Boolean get() = Flag.TypeParameter.IS_REIFIED(flags)
-
-// Property Accessor Flags
-public enum class PropertyAccessorFlag {
- IS_EXTERNAL,
- IS_INLINE,
- IS_NOT_DEFAULT,
-}
-
-@KotlinPoetMetadataPreview
-public val KmProperty.setterPropertyAccessorFlags: Set<PropertyAccessorFlag>
- get() = setterFlags.propertyAccessorFlags
-
-@KotlinPoetMetadataPreview
-public val KmProperty.getterPropertyAccessorFlags: Set<PropertyAccessorFlag>
- get() = getterFlags.propertyAccessorFlags
-
-@KotlinPoetMetadataPreview
-public val Flags.propertyAccessorFlags: Set<PropertyAccessorFlag>
- get() = setOf {
- if (Flag.PropertyAccessor.IS_EXTERNAL(this@propertyAccessorFlags)) {
- add(PropertyAccessorFlag.IS_EXTERNAL)
- }
- if (Flag.PropertyAccessor.IS_INLINE(this@propertyAccessorFlags)) {
- add(PropertyAccessorFlag.IS_INLINE)
- }
- if (Flag.PropertyAccessor.IS_NOT_DEFAULT(this@propertyAccessorFlags)) {
- add(PropertyAccessorFlag.IS_NOT_DEFAULT)
- }
- }
-
-internal inline fun <E> setOf(body: MutableSet<E>.() -> Unit): Set<E> {
- return mutableSetOf<E>().apply(body).toSet()
-}
diff --git a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/KotlinPoetMetadata.kt b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/KotlinPoetMetadata.kt
index eafa0490..bae24747 100644
--- a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/KotlinPoetMetadata.kt
+++ b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/KotlinPoetMetadata.kt
@@ -50,7 +50,7 @@ public fun TypeElement.toKmClass(): KmClass = readMetadata(::getAnnotation).toKm
@KotlinPoetMetadataPreview
public fun Metadata.toKmClass(): KmClass {
return toKotlinClassMetadata<KotlinClassMetadata.Class>()
- .toKmClass()
+ .kmClass
}
@KotlinPoetMetadataPreview
diff --git a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/ClassInspectorUtil.kt b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/ClassInspectorUtil.kt
index d9caa834..1bbf6945 100644
--- a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/ClassInspectorUtil.kt
+++ b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/ClassInspectorUtil.kt
@@ -38,12 +38,12 @@ import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.asClassName
import com.squareup.kotlinpoet.joinToCode
import com.squareup.kotlinpoet.metadata.KotlinPoetMetadataPreview
-import com.squareup.kotlinpoet.metadata.isConst
import com.squareup.kotlinpoet.metadata.specs.ClassInspector
import java.util.Collections
import java.util.TreeSet
import kotlinx.metadata.KmProperty
-import kotlinx.metadata.isLocal
+import kotlinx.metadata.isConst
+import kotlinx.metadata.isLocalClassName
import org.jetbrains.annotations.NotNull
import org.jetbrains.annotations.Nullable
@@ -195,7 +195,7 @@ internal object ClassInspectorUtil {
* with those.
*/
fun createClassName(kotlinMetadataName: String): ClassName {
- require(!kotlinMetadataName.isLocal) {
+ require(!kotlinMetadataName.isLocalClassName()) {
"Local/anonymous classes are not supported!"
}
// Top-level: package/of/class/MyClass
diff --git a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/ElementsClassInspector.kt b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/ElementsClassInspector.kt
index cbbea286..0282913c 100644
--- a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/ElementsClassInspector.kt
+++ b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/ElementsClassInspector.kt
@@ -32,14 +32,7 @@ import com.squareup.kotlinpoet.metadata.KotlinPoetMetadataPreview
import com.squareup.kotlinpoet.metadata.classinspectors.ClassInspectorUtil.JAVA_DEPRECATED
import com.squareup.kotlinpoet.metadata.classinspectors.ClassInspectorUtil.JVM_NAME
import com.squareup.kotlinpoet.metadata.classinspectors.ClassInspectorUtil.filterOutNullabilityAnnotations
-import com.squareup.kotlinpoet.metadata.hasAnnotations
-import com.squareup.kotlinpoet.metadata.hasConstant
-import com.squareup.kotlinpoet.metadata.isAnnotation
-import com.squareup.kotlinpoet.metadata.isCompanionObject
-import com.squareup.kotlinpoet.metadata.isConst
import com.squareup.kotlinpoet.metadata.isDeclaration
-import com.squareup.kotlinpoet.metadata.isSynthesized
-import com.squareup.kotlinpoet.metadata.isValue
import com.squareup.kotlinpoet.metadata.readKotlinClassMetadata
import com.squareup.kotlinpoet.metadata.specs.ClassData
import com.squareup.kotlinpoet.metadata.specs.ClassInspector
@@ -74,9 +67,14 @@ import javax.lang.model.util.ElementFilter
import javax.lang.model.util.Elements
import javax.lang.model.util.Types
import kotlin.LazyThreadSafetyMode.NONE
+import kotlinx.metadata.ClassKind
import kotlinx.metadata.KmClass
import kotlinx.metadata.KmDeclarationContainer
import kotlinx.metadata.KmPackage
+import kotlinx.metadata.hasAnnotations
+import kotlinx.metadata.hasConstant
+import kotlinx.metadata.isConst
+import kotlinx.metadata.isValue
import kotlinx.metadata.jvm.JvmFieldSignature
import kotlinx.metadata.jvm.JvmMethodSignature
import kotlinx.metadata.jvm.KotlinClassMetadata
@@ -85,6 +83,7 @@ import kotlinx.metadata.jvm.getterSignature
import kotlinx.metadata.jvm.setterSignature
import kotlinx.metadata.jvm.signature
import kotlinx.metadata.jvm.syntheticMethodForAnnotations
+import kotlinx.metadata.kind
private typealias ElementsModifier = javax.lang.model.element.Modifier
@@ -117,8 +116,8 @@ public class ElementsClassInspector private constructor(
val metadata = typeElement.getAnnotation(Metadata::class.java)
return when (val kotlinClassMetadata = metadata.readKotlinClassMetadata()) {
- is KotlinClassMetadata.Class -> kotlinClassMetadata.toKmClass()
- is KotlinClassMetadata.FileFacade -> kotlinClassMetadata.toKmPackage()
+ is KotlinClassMetadata.Class -> kotlinClassMetadata.kmClass
+ is KotlinClassMetadata.FileFacade -> kotlinClassMetadata.kmPackage
else -> TODO("Not implemented yet: ${kotlinClassMetadata.javaClass.simpleName}")
}
}
@@ -131,7 +130,7 @@ public class ElementsClassInspector private constructor(
}
private fun TypeElement.lookupField(fieldSignature: JvmFieldSignature): VariableElement? {
- val signatureString = fieldSignature.asString()
+ val signatureString = fieldSignature.toString()
return variableElementCache.getOrPut(this to signatureString) {
ElementFilter.fieldsIn(enclosedElements)
.find { signatureString == it.jvmFieldSignature(types) }.toOptional()
@@ -150,7 +149,7 @@ public class ElementsClassInspector private constructor(
methodSignature: JvmMethodSignature,
elementFilter: (Iterable<Element>) -> List<ExecutableElement>,
): ExecutableElement? {
- val signatureString = methodSignature.asString()
+ val signatureString = methodSignature.toString()
return methodCache.getOrPut(this to signatureString) {
elementFilter(enclosedElements)
.find { signatureString == it.jvmMethodSignature(types) }.toOptional()
@@ -313,7 +312,7 @@ public class ElementsClassInspector private constructor(
val typeElement: TypeElement = lookupTypeElement(className) ?: error("No class found for: $className.")
val isCompanionObject = when (declarationContainer) {
is KmClass -> {
- declarationContainer.isCompanionObject
+ declarationContainer.kind == ClassKind.COMPANION_OBJECT
}
is KmPackage -> {
false
@@ -333,8 +332,7 @@ public class ElementsClassInspector private constructor(
val propertyData = declarationContainer.properties
.asSequence()
- .filter { it.isDeclaration }
- .filterNot { it.isSynthesized }
+ .filter { it.kind.isDeclaration }
.associateWithTo(TreeMap(KM_PROPERTY_COMPARATOR)) { property ->
val isJvmField = ClassInspectorUtil.computeIsJvmField(
property = property,
@@ -397,7 +395,7 @@ public class ElementsClassInspector private constructor(
val method = classIfCompanion.lookupMethod(getterSignature, ElementFilter::methodsIn)
method?.methodData(
typeElement = typeElement,
- hasAnnotations = property.getterFlags.hasAnnotations,
+ hasAnnotations = property.getter.hasAnnotations,
jvmInformationMethod = classIfCompanion.takeIf { it != typeElement }
?.lookupMethod(getterSignature, ElementFilter::methodsIn)
?: method,
@@ -409,7 +407,7 @@ public class ElementsClassInspector private constructor(
val method = classIfCompanion.lookupMethod(setterSignature, ElementFilter::methodsIn)
method?.methodData(
typeElement = typeElement,
- hasAnnotations = property.setterFlags.hasAnnotations,
+ hasAnnotations = property.setter?.hasAnnotations ?: false,
jvmInformationMethod = classIfCompanion.takeIf { it != typeElement }
?.lookupMethod(setterSignature, ElementFilter::methodsIn)
?: method,
@@ -419,7 +417,7 @@ public class ElementsClassInspector private constructor(
}
val annotations = mutableListOf<AnnotationSpec>()
- if (property.flags.hasAnnotations) {
+ if (property.hasAnnotations) {
property.syntheticMethodForAnnotations?.let { annotationsHolderSignature ->
val method = typeElement.lookupMethod(annotationsHolderSignature, ElementFilter::methodsIn)
?: return@let MethodData.SYNTHETIC
@@ -461,7 +459,7 @@ public class ElementsClassInspector private constructor(
val method = typeElement.lookupMethod(signature, ElementFilter::methodsIn)
method?.methodData(
typeElement = typeElement,
- hasAnnotations = kmFunction.flags.hasAnnotations,
+ hasAnnotations = kmFunction.hasAnnotations,
jvmInformationMethod = classIfCompanion.takeIf { it != typeElement }
?.lookupMethod(signature, ElementFilter::methodsIn)
?: method,
@@ -476,7 +474,7 @@ public class ElementsClassInspector private constructor(
is KmClass -> {
val constructorData = declarationContainer.constructors
.associateWithTo(TreeMap(KM_CONSTRUCTOR_COMPARATOR)) { kmConstructor ->
- if (declarationContainer.isAnnotation || declarationContainer.isValue) {
+ if (declarationContainer.kind == ClassKind.ANNOTATION_CLASS || declarationContainer.isValue) {
//
// Annotations are interfaces in bytecode, but kotlin metadata will still report a
// constructor signature
@@ -490,7 +488,7 @@ public class ElementsClassInspector private constructor(
val constructor = typeElement.lookupMethod(signature, ElementFilter::constructorsIn)
?: return@associateWithTo ConstructorData.EMPTY
ConstructorData(
- annotations = if (kmConstructor.flags.hasAnnotations) {
+ annotations = if (kmConstructor.hasAnnotations) {
constructor.annotationSpecs()
} else {
emptyList()
@@ -507,7 +505,7 @@ public class ElementsClassInspector private constructor(
return ClassData(
declarationContainer = declarationContainer,
className = className,
- annotations = if (declarationContainer.flags.hasAnnotations) {
+ annotations = if (declarationContainer.hasAnnotations) {
ClassInspectorUtil.createAnnotations {
addAll(typeElement.annotationMirrors.map { AnnotationSpec.get(it) })
}
@@ -533,7 +531,6 @@ public class ElementsClassInspector private constructor(
}
jvmName = nameValue.value as String
}
- @Suppress("DEPRECATION")
AnnotationSpec.get(it)
},
)
diff --git a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/JvmDescriptorUtils.kt b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/JvmDescriptorUtils.kt
index 51e9c453..aea3213b 100644
--- a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/JvmDescriptorUtils.kt
+++ b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/JvmDescriptorUtils.kt
@@ -57,6 +57,7 @@ import kotlinx.metadata.jvm.JvmMethodSignature
*
* @return the name of this [Element] in its "internal form".
*/
+@Suppress("RecursivePropertyAccessor")
internal val Element.internalName: String
get() = when (this) {
is TypeElement -> {
diff --git a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/ReflectiveClassInspector.kt b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/ReflectiveClassInspector.kt
index 0bde6193..d4c74eb3 100644
--- a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/ReflectiveClassInspector.kt
+++ b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/classinspectors/ReflectiveClassInspector.kt
@@ -25,14 +25,7 @@ import com.squareup.kotlinpoet.asTypeName
import com.squareup.kotlinpoet.metadata.KotlinPoetMetadataPreview
import com.squareup.kotlinpoet.metadata.classinspectors.ClassInspectorUtil.JAVA_DEPRECATED
import com.squareup.kotlinpoet.metadata.classinspectors.ClassInspectorUtil.filterOutNullabilityAnnotations
-import com.squareup.kotlinpoet.metadata.hasAnnotations
-import com.squareup.kotlinpoet.metadata.hasConstant
-import com.squareup.kotlinpoet.metadata.isAnnotation
-import com.squareup.kotlinpoet.metadata.isCompanionObject
-import com.squareup.kotlinpoet.metadata.isConst
import com.squareup.kotlinpoet.metadata.isDeclaration
-import com.squareup.kotlinpoet.metadata.isSynthesized
-import com.squareup.kotlinpoet.metadata.isValue
import com.squareup.kotlinpoet.metadata.readKotlinClassMetadata
import com.squareup.kotlinpoet.metadata.specs.ClassData
import com.squareup.kotlinpoet.metadata.specs.ClassInspector
@@ -62,9 +55,14 @@ import java.lang.reflect.Parameter
import java.util.TreeMap
import java.util.concurrent.ConcurrentHashMap
import kotlin.LazyThreadSafetyMode.NONE
+import kotlinx.metadata.ClassKind
import kotlinx.metadata.KmClass
import kotlinx.metadata.KmDeclarationContainer
import kotlinx.metadata.KmPackage
+import kotlinx.metadata.hasAnnotations
+import kotlinx.metadata.hasConstant
+import kotlinx.metadata.isConst
+import kotlinx.metadata.isValue
import kotlinx.metadata.jvm.JvmFieldSignature
import kotlinx.metadata.jvm.JvmMethodSignature
import kotlinx.metadata.jvm.KotlinClassMetadata
@@ -73,6 +71,7 @@ import kotlinx.metadata.jvm.getterSignature
import kotlinx.metadata.jvm.setterSignature
import kotlinx.metadata.jvm.signature
import kotlinx.metadata.jvm.syntheticMethodForAnnotations
+import kotlinx.metadata.kind
@KotlinPoetMetadataPreview
public class ReflectiveClassInspector private constructor(
@@ -107,8 +106,8 @@ public class ReflectiveClassInspector private constructor(
val metadata = clazz.getAnnotation(Metadata::class.java)
return when (val kotlinClassMetadata = metadata.readKotlinClassMetadata()) {
- is KotlinClassMetadata.Class -> kotlinClassMetadata.toKmClass()
- is KotlinClassMetadata.FileFacade -> kotlinClassMetadata.toKmPackage()
+ is KotlinClassMetadata.Class -> kotlinClassMetadata.kmClass
+ is KotlinClassMetadata.FileFacade -> kotlinClassMetadata.kmPackage
else -> TODO("Not implemented yet: ${kotlinClassMetadata.javaClass.simpleName}")
}
}
@@ -122,7 +121,7 @@ public class ReflectiveClassInspector private constructor(
private fun Class<*>.lookupField(fieldSignature: JvmFieldSignature): Field? {
return try {
- val signatureString = fieldSignature.asString()
+ val signatureString = fieldSignature.toString()
fieldCache.getOrPut(this to signatureString) {
declaredFields
.asSequence()
@@ -137,7 +136,7 @@ public class ReflectiveClassInspector private constructor(
private fun Class<*>.lookupMethod(
methodSignature: JvmMethodSignature,
): Method? {
- val signatureString = methodSignature.asString()
+ val signatureString = methodSignature.toString()
return methodCache.getOrPut(this to signatureString) {
declaredMethods
.asSequence()
@@ -149,7 +148,7 @@ public class ReflectiveClassInspector private constructor(
private fun Class<*>.lookupConstructor(
constructorSignature: JvmMethodSignature,
): Constructor<*>? {
- val signatureString = constructorSignature.asString()
+ val signatureString = constructorSignature.toString()
return constructorCache.getOrPut(this to signatureString) {
declaredConstructors
.asSequence()
@@ -267,7 +266,7 @@ public class ReflectiveClassInspector private constructor(
}
private fun JvmMethodSignature.isOverriddenIn(clazz: Class<*>): Boolean {
- val signatureString = asString()
+ val signatureString = toString()
val classPackage = clazz.`package`.name
val interfaceMethods = clazz.interfaces.asSequence()
.flatMap { it.methods.asSequence() }
@@ -299,7 +298,7 @@ public class ReflectiveClassInspector private constructor(
val targetClass = lookupClass(className) ?: error("No class found for: $className.")
val isCompanionObject: Boolean = when (declarationContainer) {
is KmClass -> {
- declarationContainer.isCompanionObject
+ declarationContainer.kind == ClassKind.COMPANION_OBJECT
}
is KmPackage -> {
false
@@ -319,8 +318,7 @@ public class ReflectiveClassInspector private constructor(
val propertyData = declarationContainer.properties
.asSequence()
- .filter { it.isDeclaration }
- .filterNot { it.isSynthesized }
+ .filter { it.kind.isDeclaration }
.associateWithTo(TreeMap(KM_PROPERTY_COMPARATOR)) { property ->
val isJvmField = ClassInspectorUtil.computeIsJvmField(
property = property,
@@ -393,7 +391,7 @@ public class ReflectiveClassInspector private constructor(
method?.methodData(
clazz = targetClass,
signature = getterSignature,
- hasAnnotations = property.getterFlags.hasAnnotations,
+ hasAnnotations = property.getter.hasAnnotations,
jvmInformationMethod = classIfCompanion.takeIf { it != targetClass }
?.lookupMethod(getterSignature) ?: method,
)
@@ -405,7 +403,7 @@ public class ReflectiveClassInspector private constructor(
method?.methodData(
clazz = targetClass,
signature = setterSignature,
- hasAnnotations = property.setterFlags.hasAnnotations,
+ hasAnnotations = property.setter?.hasAnnotations ?: false,
jvmInformationMethod = classIfCompanion.takeIf { it != targetClass }
?.lookupMethod(setterSignature) ?: method,
knownIsOverride = getterData?.isOverride,
@@ -414,7 +412,7 @@ public class ReflectiveClassInspector private constructor(
}
val annotations = mutableListOf<AnnotationSpec>()
- if (property.flags.hasAnnotations) {
+ if (property.hasAnnotations) {
property.syntheticMethodForAnnotations?.let { annotationsHolderSignature ->
targetClass.lookupMethod(annotationsHolderSignature)?.let { method ->
annotations += method.annotationSpecs()
@@ -441,7 +439,7 @@ public class ReflectiveClassInspector private constructor(
method?.methodData(
clazz = targetClass,
signature = signature,
- hasAnnotations = kmFunction.flags.hasAnnotations,
+ hasAnnotations = kmFunction.hasAnnotations,
jvmInformationMethod = classIfCompanion.takeIf { it != targetClass }?.lookupMethod(signature)
?: method,
)
@@ -453,7 +451,7 @@ public class ReflectiveClassInspector private constructor(
when (declarationContainer) {
is KmClass -> {
- val classAnnotations = if (declarationContainer.flags.hasAnnotations) {
+ val classAnnotations = if (declarationContainer.hasAnnotations) {
ClassInspectorUtil.createAnnotations {
addAll(targetClass.annotations.map { AnnotationSpec.get(it, includeDefaultValues = true) })
}
@@ -462,7 +460,7 @@ public class ReflectiveClassInspector private constructor(
}
val constructorData = declarationContainer.constructors
.associateWithTo(TreeMap(KM_CONSTRUCTOR_COMPARATOR)) { kmConstructor ->
- if (declarationContainer.isAnnotation || declarationContainer.isValue) {
+ if (declarationContainer.kind == ClassKind.ANNOTATION_CLASS || declarationContainer.isValue) {
//
// Annotations are interfaces in reflection, but kotlin metadata will still report a
// constructor signature
@@ -476,7 +474,7 @@ public class ReflectiveClassInspector private constructor(
val constructor = targetClass.lookupConstructor(signature)
?: error("No constructor $signature found in $targetClass.")
ConstructorData(
- annotations = if (kmConstructor.flags.hasAnnotations) {
+ annotations = if (kmConstructor.hasAnnotations) {
constructor.annotationSpecs()
} else {
emptyList()
diff --git a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/specs/KmTypes.kt b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/specs/KmTypes.kt
index cd12479c..23e793d0 100644
--- a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/specs/KmTypes.kt
+++ b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/specs/KmTypes.kt
@@ -26,10 +26,7 @@ import com.squareup.kotlinpoet.TypeVariableName
import com.squareup.kotlinpoet.WildcardTypeName
import com.squareup.kotlinpoet.metadata.KotlinPoetMetadataPreview
import com.squareup.kotlinpoet.metadata.classinspectors.ClassInspectorUtil
-import com.squareup.kotlinpoet.metadata.isNullable
import com.squareup.kotlinpoet.metadata.isPrimary
-import com.squareup.kotlinpoet.metadata.isReified
-import com.squareup.kotlinpoet.metadata.isSuspend
import com.squareup.kotlinpoet.tags.TypeAliasTag
import kotlinx.metadata.KmClass
import kotlinx.metadata.KmClassifier
@@ -47,6 +44,9 @@ import kotlinx.metadata.KmVariance
import kotlinx.metadata.KmVariance.IN
import kotlinx.metadata.KmVariance.INVARIANT
import kotlinx.metadata.KmVariance.OUT
+import kotlinx.metadata.isNullable
+import kotlinx.metadata.isReified
+import kotlinx.metadata.isSuspend
import kotlinx.metadata.jvm.annotations
import kotlinx.metadata.jvm.signature
@@ -251,7 +251,7 @@ internal val KM_FUNCTION_COMPARATOR = Comparator<KmFunction> { o1, o2 ->
val signature1 = o1.signature
val signature2 = o2.signature
if (signature1 != null && signature2 != null) {
- result = signature1.asString().compareTo(signature2.asString())
+ result = signature1.toString().compareTo(signature2.toString())
if (result != 0) return@Comparator result
}
@@ -265,7 +265,7 @@ internal val KM_CONSTRUCTOR_COMPARATOR = Comparator<KmConstructor> { o1, o2 ->
val signature1 = o1.signature
val signature2 = o2.signature
if (signature1 != null && signature2 != null) {
- val result = signature1.asString().compareTo(signature2.asString())
+ val result = signature1.toString().compareTo(signature2.toString())
if (result != 0) return@Comparator result
}
diff --git a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/specs/KotlinPoetMetadataSpecs.kt b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/specs/KotlinPoetMetadataSpecs.kt
index 6aaa87ce..88c7b25b 100644
--- a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/specs/KotlinPoetMetadataSpecs.kt
+++ b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/specs/KotlinPoetMetadataSpecs.kt
@@ -37,15 +37,12 @@ import com.squareup.kotlinpoet.KModifier.FINAL
import com.squareup.kotlinpoet.KModifier.INFIX
import com.squareup.kotlinpoet.KModifier.INLINE
import com.squareup.kotlinpoet.KModifier.INNER
-import com.squareup.kotlinpoet.KModifier.INTERNAL
import com.squareup.kotlinpoet.KModifier.LATEINIT
import com.squareup.kotlinpoet.KModifier.NOINLINE
import com.squareup.kotlinpoet.KModifier.OPEN
import com.squareup.kotlinpoet.KModifier.OPERATOR
import com.squareup.kotlinpoet.KModifier.PRIVATE
-import com.squareup.kotlinpoet.KModifier.PROTECTED
import com.squareup.kotlinpoet.KModifier.PUBLIC
-import com.squareup.kotlinpoet.KModifier.SEALED
import com.squareup.kotlinpoet.KModifier.SUSPEND
import com.squareup.kotlinpoet.KModifier.TAILREC
import com.squareup.kotlinpoet.KModifier.VALUE
@@ -58,58 +55,21 @@ import com.squareup.kotlinpoet.TypeSpec
import com.squareup.kotlinpoet.UNIT
import com.squareup.kotlinpoet.asClassName
import com.squareup.kotlinpoet.metadata.KotlinPoetMetadataPreview
-import com.squareup.kotlinpoet.metadata.PropertyAccessorFlag
-import com.squareup.kotlinpoet.metadata.PropertyAccessorFlag.IS_EXTERNAL
-import com.squareup.kotlinpoet.metadata.PropertyAccessorFlag.IS_INLINE
-import com.squareup.kotlinpoet.metadata.PropertyAccessorFlag.IS_NOT_DEFAULT
import com.squareup.kotlinpoet.metadata.classinspectors.ClassInspectorUtil
import com.squareup.kotlinpoet.metadata.classinspectors.ClassInspectorUtil.createAnnotations
import com.squareup.kotlinpoet.metadata.classinspectors.ClassInspectorUtil.createClassName
import com.squareup.kotlinpoet.metadata.classinspectors.ClassInspectorUtil.toTreeSet
-import com.squareup.kotlinpoet.metadata.declaresDefaultValue
-import com.squareup.kotlinpoet.metadata.hasAnnotations
-import com.squareup.kotlinpoet.metadata.hasGetter
-import com.squareup.kotlinpoet.metadata.hasSetter
-import com.squareup.kotlinpoet.metadata.isAbstract
import com.squareup.kotlinpoet.metadata.isAnnotation
import com.squareup.kotlinpoet.metadata.isClass
import com.squareup.kotlinpoet.metadata.isCompanionObject
-import com.squareup.kotlinpoet.metadata.isConst
-import com.squareup.kotlinpoet.metadata.isCrossInline
-import com.squareup.kotlinpoet.metadata.isData
import com.squareup.kotlinpoet.metadata.isDeclaration
-import com.squareup.kotlinpoet.metadata.isDelegated
-import com.squareup.kotlinpoet.metadata.isDelegation
import com.squareup.kotlinpoet.metadata.isEnum
-import com.squareup.kotlinpoet.metadata.isEnumEntry
-import com.squareup.kotlinpoet.metadata.isExpect
-import com.squareup.kotlinpoet.metadata.isExternal
-import com.squareup.kotlinpoet.metadata.isFinal
-import com.squareup.kotlinpoet.metadata.isFun
-import com.squareup.kotlinpoet.metadata.isInfix
-import com.squareup.kotlinpoet.metadata.isInline
-import com.squareup.kotlinpoet.metadata.isInner
import com.squareup.kotlinpoet.metadata.isInterface
-import com.squareup.kotlinpoet.metadata.isInternal
-import com.squareup.kotlinpoet.metadata.isLateinit
-import com.squareup.kotlinpoet.metadata.isNoInline
import com.squareup.kotlinpoet.metadata.isObject
-import com.squareup.kotlinpoet.metadata.isOpen
-import com.squareup.kotlinpoet.metadata.isOperator
import com.squareup.kotlinpoet.metadata.isPrimary
-import com.squareup.kotlinpoet.metadata.isPrivate
-import com.squareup.kotlinpoet.metadata.isProtected
-import com.squareup.kotlinpoet.metadata.isPublic
-import com.squareup.kotlinpoet.metadata.isReified
-import com.squareup.kotlinpoet.metadata.isSealed
-import com.squareup.kotlinpoet.metadata.isSuspend
-import com.squareup.kotlinpoet.metadata.isSynthesized
-import com.squareup.kotlinpoet.metadata.isTailRec
import com.squareup.kotlinpoet.metadata.isVal
-import com.squareup.kotlinpoet.metadata.isValue
-import com.squareup.kotlinpoet.metadata.isVar
-import com.squareup.kotlinpoet.metadata.propertyAccessorFlags
import com.squareup.kotlinpoet.metadata.specs.JvmMethodModifier.DEFAULT
+import com.squareup.kotlinpoet.metadata.toKModifier
import com.squareup.kotlinpoet.metadata.toKmClass
import com.squareup.kotlinpoet.tag
import java.util.Locale
@@ -118,21 +78,49 @@ import javax.lang.model.element.ElementKind
import javax.lang.model.element.PackageElement
import javax.lang.model.element.TypeElement
import kotlin.reflect.KClass
-import kotlinx.metadata.Flags
+import kotlinx.metadata.ClassKind
import kotlinx.metadata.KmClass
import kotlinx.metadata.KmClassifier
import kotlinx.metadata.KmConstructor
import kotlinx.metadata.KmFunction
import kotlinx.metadata.KmPackage
import kotlinx.metadata.KmProperty
+import kotlinx.metadata.KmPropertyAccessorAttributes
import kotlinx.metadata.KmType
import kotlinx.metadata.KmTypeAlias
import kotlinx.metadata.KmValueParameter
+import kotlinx.metadata.Modality
+import kotlinx.metadata.Visibility
+import kotlinx.metadata.declaresDefaultValue
+import kotlinx.metadata.hasAnnotations
+import kotlinx.metadata.hasGetter
+import kotlinx.metadata.hasSetter
+import kotlinx.metadata.isConst
+import kotlinx.metadata.isCrossinline
+import kotlinx.metadata.isData
+import kotlinx.metadata.isDelegated
+import kotlinx.metadata.isExpect
+import kotlinx.metadata.isExternal
+import kotlinx.metadata.isFunInterface
+import kotlinx.metadata.isInfix
+import kotlinx.metadata.isInline
+import kotlinx.metadata.isInner
+import kotlinx.metadata.isLateinit
+import kotlinx.metadata.isNoinline
+import kotlinx.metadata.isOperator
+import kotlinx.metadata.isReified
+import kotlinx.metadata.isSuspend
+import kotlinx.metadata.isTailrec
+import kotlinx.metadata.isValue
+import kotlinx.metadata.isVar
import kotlinx.metadata.jvm.JvmMethodSignature
import kotlinx.metadata.jvm.getterSignature
-import kotlinx.metadata.jvm.jvmInternalName
import kotlinx.metadata.jvm.setterSignature
import kotlinx.metadata.jvm.signature
+import kotlinx.metadata.jvm.toJvmInternalName
+import kotlinx.metadata.kind
+import kotlinx.metadata.modality
+import kotlinx.metadata.visibility
/** @return a [TypeSpec] ABI representation of this [KClass]. */
@KotlinPoetMetadataPreview
@@ -262,7 +250,7 @@ private fun KmClass.toTypeSpec(
parentClassName: ClassName?,
): TypeSpec {
val classTypeParamsResolver = typeParameters.toTypeParameterResolver()
- val jvmInternalName = name.jvmInternalName
+ val jvmInternalName = name.toJvmInternalName()
val simpleName = className.simpleName
val classData = classInspector?.containerData(className, parentClassName)
check(classData is ClassData?) {
@@ -276,13 +264,14 @@ private fun KmClass.toTypeSpec(
isExpect -> TypeSpec.classBuilder(simpleName).addModifiers(EXPECT)
isObject -> TypeSpec.objectBuilder(simpleName)
isInterface -> {
- if (classData?.declarationContainer?.isFun == true) {
+ if (classData?.declarationContainer?.isFunInterface == true) {
TypeSpec.funInterfaceBuilder(simpleName)
} else {
TypeSpec.interfaceBuilder(simpleName)
}
}
- isEnumEntry -> TypeSpec.anonymousClassBuilder()
+
+ kind == ClassKind.ENUM_ENTRY -> TypeSpec.anonymousClassBuilder()
else -> TypeSpec.classBuilder(simpleName)
}
@@ -292,7 +281,7 @@ private fun KmClass.toTypeSpec(
}
?.let(builder::addAnnotations)
- if (isEnum) {
+ if (kind == ClassKind.ENUM_CLASS) {
enumEntries.forEach { entryName ->
val typeSpec = if (classInspector != null) {
val entry = classInspector.enumEntry(className, entryName)
@@ -315,14 +304,13 @@ private fun KmClass.toTypeSpec(
}
}
- if (!isEnumEntry) {
- visibilityFrom(flags) { builder.addModifiers(it) }
- builder.addModifiers(
- *flags.modalities
- .filterNot { it == FINAL } // Default
- .filterNot { isInterface && it == ABSTRACT } // Abstract is a default on interfaces
- .toTypedArray(),
- )
+ if (kind != ClassKind.ENUM_ENTRY) {
+ visibilityFrom(visibility) { builder.addModifiers(it) }
+ modality
+ .takeUnless { it == Modality.FINAL } // Default
+ ?.takeUnless { kind == ClassKind.INTERFACE && it == Modality.ABSTRACT } // Abstract is a default on interfaces
+ ?.let(Modality::toKModifier)
+ ?.let { builder.addModifiers(it) }
if (isData) {
builder.addModifiers(DATA)
}
@@ -389,8 +377,7 @@ private fun KmClass.toTypeSpec(
builder.addProperties(
properties
.asSequence()
- .filter { it.isDeclaration }
- .filterNot { it.isSynthesized }
+ .filter { it.kind.isDeclaration }
.map { it to classData?.properties?.get(it) }
.map { (property, propertyData) ->
property.toPropertySpec(
@@ -421,9 +408,7 @@ private fun KmClass.toTypeSpec(
builder.addFunctions(
functions
.asSequence()
- .filter { it.isDeclaration }
- .filterNot { it.isDelegation }
- .filterNot { it.isSynthesized }
+ .filter { it.kind.isDeclaration }
.map { it to classData?.methods?.get(it) }
.map { (func, methodData) ->
func.toFunSpec(classTypeParamsResolver, classInspector, classData, methodData)
@@ -433,11 +418,11 @@ private fun KmClass.toTypeSpec(
fun isKotlinDefaultInterfaceMethod(): Boolean {
classInspector?.let { handler ->
func.signature?.let { signature ->
- val suffix = signature.desc.removePrefix("(")
+ val suffix = signature.descriptor.removePrefix("(")
return handler.methodExists(
className.nestedClass("DefaultImpls"),
signature.copy(
- desc = "(L$jvmInternalName;$suffix",
+ descriptor = "(L$jvmInternalName;$suffix",
),
)
}
@@ -506,7 +491,7 @@ private fun KmConstructor.toFunSpec(
return FunSpec.constructorBuilder()
.apply {
addAnnotations(constructorData?.allAnnotations.orEmpty())
- visibilityFrom(flags) { addModifiers(it) }
+ visibilityFrom(visibility) { addModifiers(it) }
addParameters(
this@toFunSpec.valueParameters.mapIndexed { index, param ->
param.toParameterSpec(
@@ -518,7 +503,7 @@ private fun KmConstructor.toFunSpec(
)
},
)
- if (!isPrimary) {
+ if (!this@toFunSpec.isPrimary) {
// TODO How do we know when to add callSuperConstructor()?
}
}
@@ -565,14 +550,14 @@ private fun KmFunction.toFunSpec(
return FunSpec.builder(name)
.apply {
addAnnotations(annotations)
- visibilityFrom(flags) { addModifiers(it) }
+ visibilityFrom(visibility) { addModifiers(it) }
val isOverride = methodData?.isOverride == true
- addModifiers(
- flags.modalities
- .filterNot { it == FINAL && !isOverride } // Final is the default
- .filterNot { it == OPEN && isOverride } // Overrides are implicitly open
- .filterNot { it == OPEN && isInInterface }, // interface methods are implicitly open
- )
+ modality
+ .takeUnless { it == Modality.FINAL && !isOverride } // Final is the default
+ ?.takeUnless { it == Modality.OPEN && isOverride } // Overrides are implicitly open
+ ?.takeUnless { it == Modality.OPEN && isInInterface } // interface methods are implicitly open
+ ?.let(Modality::toKModifier)
+ ?.let { addModifiers(it) }
if (valueParameters.isNotEmpty()) {
addParameters(
valueParameters.mapIndexed { index, param ->
@@ -599,7 +584,7 @@ private fun KmFunction.toFunSpec(
if (isInline) {
addModifiers(INLINE)
}
- if (isTailRec) {
+ if (isTailrec) {
addModifiers(TAILREC)
}
if (isExternal) {
@@ -614,7 +599,7 @@ private fun KmFunction.toFunSpec(
val returnTypeName = this@toFunSpec.returnType.toTypeName(typeParamsResolver)
if (returnTypeName != UNIT) {
returns(returnTypeName)
- if (!flags.isAbstract) {
+ if (modality != Modality.ABSTRACT) {
addStatement(NOT_IMPLEMENTED)
}
}
@@ -636,10 +621,10 @@ private fun KmValueParameter.toParameterSpec(
if (varargElementType != null) {
addModifiers(VARARG)
}
- if (isCrossInline) {
+ if (isCrossinline) {
addModifiers(CROSSINLINE)
}
- if (isNoInline) {
+ if (isNoinline) {
addModifiers(NOINLINE)
}
if (declaresDefaultValue) {
@@ -666,8 +651,7 @@ private fun KmProperty.toPropertySpec(
if (hasGetter) {
getterSignature?.let { getterSignature ->
if (!containerData.isInterface &&
- !flags.isOpen &&
- !flags.isAbstract
+ modality != Modality.OPEN && modality != Modality.ABSTRACT
) {
// Infer if JvmName was used
// We skip interface types or open/abstract properties because they can't have @JvmName.
@@ -696,8 +680,7 @@ private fun KmProperty.toPropertySpec(
!containerData.declarationContainer.isAnnotation &&
!containerData.declarationContainer.isInterface &&
classInspector?.supportsNonRuntimeRetainedAnnotations == false &&
- !flags.isOpen &&
- !flags.isAbstract
+ modality != Modality.OPEN && modality != Modality.ABSTRACT
) {
// Infer if JvmName was used
// We skip annotation types for this because they can't have vars.
@@ -734,14 +717,14 @@ private fun KmProperty.toPropertySpec(
}
.toTreeSet()
addAnnotations(finalAnnotations)
- visibilityFrom(flags) { addModifiers(it) }
- addModifiers(
- flags.modalities
- .filterNot { it == FINAL && !isOverride } // Final is the default
- .filterNot { it == OPEN && isOverride } // Overrides are implicitly open
- .filterNot { it == OPEN && isInInterface } // Interface properties implicitly open
- .filterNot { it == ABSTRACT && isInInterface }, // Interface properties implicitly abstract
- )
+ visibilityFrom(visibility) { addModifiers(it) }
+ modality
+ .takeUnless { it == Modality.FINAL && !isOverride } // Final is the default
+ ?.takeUnless { it == Modality.OPEN && isOverride } // Overrides are implicitly open
+ ?.takeUnless { it == Modality.OPEN && isInInterface } // Interface properties implicitly open
+ ?.takeUnless { it == Modality.ABSTRACT && isInInterface } // Interface properties implicitly abstract
+ ?.let(Modality::toKModifier)
+ ?.let { addModifiers(it) }
if (isOverride) {
addModifiers(KModifier.OVERRIDE)
}
@@ -784,7 +767,7 @@ private fun KmProperty.toPropertySpec(
constant != null -> initializer(constant)
isConstructorParam -> initializer(name)
returnTypeName.isNullable -> initializer("null")
- flags.isAbstract || isInInterface -> {
+ modality == Modality.ABSTRACT || isInInterface -> {
// No-op, don't emit an initializer for abstract or interface properties
}
else -> initializer(NOT_IMPLEMENTED)
@@ -794,16 +777,16 @@ private fun KmProperty.toPropertySpec(
// since the delegate handles it
// vals with initialized constants have a getter in bytecode but not a body in kotlin source
val modifierSet = modifiers.toSet()
- if (hasGetter && !isDelegated && !flags.isAbstract) {
+ if (hasGetter && !isDelegated && modality != Modality.ABSTRACT) {
propertyAccessor(
modifierSet,
- getterFlags,
+ getter,
FunSpec.getterBuilder().addStatement(NOT_IMPLEMENTED),
isOverride,
)?.let(::getter)
}
- if (hasSetter && !isDelegated && !flags.isAbstract) {
- propertyAccessor(modifierSet, setterFlags, FunSpec.setterBuilder(), isOverride)?.let(::setter)
+ if (hasSetter && !isDelegated && modality != Modality.ABSTRACT) {
+ propertyAccessor(modifierSet, setter!!, FunSpec.setterBuilder(), isOverride)?.let(::setter)
}
}
.tag(this)
@@ -813,26 +796,34 @@ private fun KmProperty.toPropertySpec(
@KotlinPoetMetadataPreview
private fun propertyAccessor(
propertyModifiers: Set<KModifier>,
- flags: Flags,
+ attrs: KmPropertyAccessorAttributes,
functionBuilder: Builder,
isOverride: Boolean,
): FunSpec? {
- val visibility = flags.visibility
+ val visibility = attrs.visibility.toKModifier()
if (visibility == PUBLIC || visibility !in propertyModifiers) {
// This is redundant and just a stub
// For annotations on this accessor, we declare them on the property with site target instead
return null
}
- val modalities = flags.modalities
- .filterNot { it == FINAL && !isOverride }
- .filterNot { it == OPEN && isOverride }
- val propertyAccessorFlags = flags.propertyAccessorFlags
- return if (modalities.isNotEmpty() || propertyAccessorFlags.isNotEmpty()) {
+ val modality = attrs.modality
+ .takeUnless { it == Modality.FINAL && !isOverride }
+ .takeUnless { it == Modality.OPEN && isOverride }
+
+ val localModifiers = buildList {
+ if (attrs.isExternal) {
+ add(EXTERNAL)
+ }
+ if (attrs.isInline) {
+ add(INLINE)
+ }
+ }
+ return if (modality != null || localModifiers.isNotEmpty()) {
functionBuilder
.apply {
addModifiers(visibility)
- addModifiers(modalities)
- addModifiers(*propertyAccessorFlags.toKModifiersArray())
+ modality?.let { addModifiers(it.toKModifier()) }
+ addModifiers(localModifiers)
}
.build()
} else {
@@ -840,25 +831,15 @@ private fun propertyAccessor(
}
}
-private fun Set<PropertyAccessorFlag>.toKModifiersArray(): Array<KModifier> {
- return mapNotNull {
- when (it) {
- IS_EXTERNAL -> EXTERNAL
- IS_INLINE -> INLINE
- IS_NOT_DEFAULT -> null // Gracefully skip over these
- }
- }.toTypedArray()
-}
-
@KotlinPoetMetadataPreview
private fun KmTypeAlias.toTypeAliasSpec(): TypeAliasSpec {
val typeParamResolver = typeParameters.toTypeParameterResolver()
return TypeAliasSpec.builder(name, underlyingType.toTypeName(typeParamResolver))
.apply {
- visibilityFrom(flags) {
+ visibilityFrom(visibility) {
addModifiers(it)
}
- if (flags.hasAnnotations) {
+ if (hasAnnotations) {
val annotationSpecs = this@toTypeAliasSpec.annotations
.map { it.toAnnotationSpec() }
addAnnotations(annotationSpecs)
@@ -888,21 +869,8 @@ private val JAVA_ANNOTATION_ANNOTATIONS = setOf(
)
@KotlinPoetMetadataPreview
-private val Flags.visibility: KModifier
- get() = when {
- isInternal -> INTERNAL
- isPrivate -> PRIVATE
- isProtected -> PROTECTED
- isPublic -> PUBLIC
- else -> {
- // IS_PRIVATE_TO_THIS or IS_LOCAL, so just default to public
- PUBLIC
- }
- }
-
-@KotlinPoetMetadataPreview
-private fun visibilityFrom(flags: Flags, body: (KModifier) -> Unit) {
- val modifierVisibility = flags.visibility
+private fun visibilityFrom(visibility: Visibility, body: (KModifier) -> Unit) {
+ val modifierVisibility = visibility.toKModifier()
if (modifierVisibility != PUBLIC) {
body(modifierVisibility)
}
@@ -912,23 +880,6 @@ private fun String.safeCapitalize(locale: Locale): String {
return replaceFirstChar { if (it.isLowerCase()) it.titlecase(locale) else it.toString() }
}
-@KotlinPoetMetadataPreview
-private val Flags.modalities: Set<KModifier>
- get() = setOf {
- if (isFinal) {
- add(FINAL)
- }
- if (isOpen) {
- add(OPEN)
- }
- if (isAbstract) {
- add(ABSTRACT)
- }
- if (isSealed) {
- add(SEALED)
- }
- }
-
private inline fun <E> setOf(body: MutableSet<E>.() -> Unit): Set<E> {
return mutableSetOf<E>().apply(body).toSet()
}
diff --git a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/specs/kmAnnotations.kt b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/specs/kmAnnotations.kt
index f6b44670..671147f7 100644
--- a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/specs/kmAnnotations.kt
+++ b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/specs/kmAnnotations.kt
@@ -15,8 +15,10 @@
*/
package com.squareup.kotlinpoet.metadata.specs
+import com.squareup.kotlinpoet.ARRAY
import com.squareup.kotlinpoet.AnnotationSpec
import com.squareup.kotlinpoet.CodeBlock
+import com.squareup.kotlinpoet.buildCodeBlock
import com.squareup.kotlinpoet.joinToCode
import com.squareup.kotlinpoet.metadata.KotlinPoetMetadataPreview
import com.squareup.kotlinpoet.metadata.classinspectors.ClassInspectorUtil.createClassName
@@ -75,5 +77,10 @@ internal fun KmAnnotationArgument.toCodeBlock(): CodeBlock {
is EnumValue -> CodeBlock.of("%T.%L", createClassName(enumClassName), enumEntryName)
is AnnotationValue -> CodeBlock.of("%L", annotation.toAnnotationSpec())
is ArrayValue -> elements.map { it.toCodeBlock() }.joinToCode(", ", "[", "]")
+ is KmAnnotationArgument.ArrayKClassValue -> buildCodeBlock {
+ repeat(arrayDimensionCount) { add("%T<", ARRAY) }
+ add("%T::class", createClassName(className))
+ repeat(arrayDimensionCount) { add(">") }
+ }
}
}
diff --git a/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/util.kt b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/util.kt
new file mode 100644
index 00000000..ab30c8ee
--- /dev/null
+++ b/interop/kotlinx-metadata/src/main/kotlin/com/squareup/kotlinpoet/metadata/util.kt
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2019 Square, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.squareup.kotlinpoet.metadata
+
+import com.squareup.kotlinpoet.KModifier
+import kotlinx.metadata.ClassKind
+import kotlinx.metadata.KmClass
+import kotlinx.metadata.KmConstructor
+import kotlinx.metadata.KmProperty
+import kotlinx.metadata.MemberKind
+import kotlinx.metadata.Modality
+import kotlinx.metadata.Visibility
+import kotlinx.metadata.isSecondary
+import kotlinx.metadata.isVar
+import kotlinx.metadata.kind
+
+internal val KmClass.isObject: Boolean
+ get() = kind == ClassKind.OBJECT
+
+internal val KmClass.isCompanionObject: Boolean
+ get() = kind == ClassKind.COMPANION_OBJECT
+
+internal val KmClass.isClass: Boolean
+ get() = kind == ClassKind.CLASS
+
+internal val KmClass.isAnnotation: Boolean
+ get() = kind == ClassKind.ANNOTATION_CLASS
+
+internal val KmClass.isEnum: Boolean
+ get() = kind == ClassKind.ENUM_CLASS
+
+internal val KmClass.isInterface: Boolean
+ get() = kind == ClassKind.INTERFACE
+
+internal val KmConstructor.isPrimary: Boolean
+ get() = !isSecondary
+
+internal val KmProperty.isVal: Boolean
+ get() = !isVar
+
+internal fun Modality.toKModifier(): KModifier = when (this) {
+ Modality.FINAL -> KModifier.FINAL
+ Modality.OPEN -> KModifier.OPEN
+ Modality.ABSTRACT -> KModifier.ABSTRACT
+ Modality.SEALED -> KModifier.SEALED
+}
+
+internal fun Visibility.toKModifier(): KModifier = when (this) {
+ Visibility.INTERNAL -> KModifier.INTERNAL
+ Visibility.PRIVATE -> KModifier.PRIVATE
+ Visibility.PROTECTED -> KModifier.PROTECTED
+ Visibility.PUBLIC -> KModifier.PUBLIC
+ Visibility.PRIVATE_TO_THIS,
+ Visibility.LOCAL,
+ -> {
+ // Default to public
+ KModifier.PUBLIC
+ }
+}
+
+internal val MemberKind.isDeclaration: Boolean get() = this == MemberKind.DECLARATION
diff --git a/interop/kotlinx-metadata/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/KmAnnotationsTest.kt b/interop/kotlinx-metadata/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/KmAnnotationsTest.kt
index c7928b4e..a2ad9d18 100644
--- a/interop/kotlinx-metadata/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/KmAnnotationsTest.kt
+++ b/interop/kotlinx-metadata/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/KmAnnotationsTest.kt
@@ -209,7 +209,7 @@ class KmAnnotationsTest {
@Test fun kClassValue() {
val annotation = KmAnnotation(
"test/KClassValueAnnotation",
- mapOf("value" to KClassValue("test/OtherClass", 0)),
+ mapOf("value" to KClassValue("test/OtherClass")),
)
assertThat(annotation.toAnnotationSpec().toString()).isEqualTo(
"""
diff --git a/interop/kotlinx-metadata/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/KotlinPoetMetadataSpecsTest.kt b/interop/kotlinx-metadata/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/KotlinPoetMetadataSpecsTest.kt
index 62b912a5..2dd54bbf 100644
--- a/interop/kotlinx-metadata/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/KotlinPoetMetadataSpecsTest.kt
+++ b/interop/kotlinx-metadata/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/KotlinPoetMetadataSpecsTest.kt
@@ -15,7 +15,6 @@
*/
@file:OptIn(KotlinPoetMetadataPreview::class)
@file:Suppress(
- "DEPRECATION",
"NOTHING_TO_INLINE",
"RedundantSuspendModifier",
"RedundantUnitReturnType",
@@ -369,21 +368,6 @@ class KotlinPoetMetadataSpecsTest : MultiClassInspectorTest() {
}
@Test
- fun inlineClass() {
- val typeSpec = InlineClass::class.toTypeSpecWithTestHandler()
-
- //language=kotlin
- assertThat(typeSpec.trimmedToString()).isEqualTo(
- """
- @kotlin.jvm.JvmInline
- public value class InlineClass(
- public val `value`: kotlin.String,
- )
- """.trimIndent(),
- )
- }
-
- @Test
fun valueClass() {
val typeSpec = ValueClass::class.toTypeSpecWithTestHandler()
@@ -2216,8 +2200,6 @@ private fun TypeSpec.trimmedToString(): String {
return toString().trim()
}
-inline class InlineClass(val value: String)
-
@JvmInline
value class ValueClass(val value: String)
diff --git a/interop/kotlinx-metadata/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/MultiClassInspectorTest.kt b/interop/kotlinx-metadata/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/MultiClassInspectorTest.kt
index cb7c21d6..6bb9192a 100644
--- a/interop/kotlinx-metadata/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/MultiClassInspectorTest.kt
+++ b/interop/kotlinx-metadata/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/MultiClassInspectorTest.kt
@@ -113,7 +113,7 @@ abstract class MultiClassInspectorTest {
protected fun KClass<*>.toFileSpecWithTestHandler(): FileSpec {
val classInspector = classInspectorType.create(this@MultiClassInspectorTest)
return java.annotations.filterIsInstance<Metadata>().first().toKotlinClassMetadata<FileFacade>()
- .toKmPackage()
+ .kmPackage
.toFileSpec(classInspector, asClassName())
}
}