Implement PrimitiveTypes for Turbine
Bug: 307225665
Test: ./gradlew
Change-Id: If950c9acde2efecacca5e7f2fab5043a52755a0d
diff --git a/metalava-model-testsuite/src/main/java/com/android/tools/metalava/model/testsuite/BootstrapSourceModelProviderTest.kt b/metalava-model-testsuite/src/main/java/com/android/tools/metalava/model/testsuite/BootstrapSourceModelProviderTest.kt
index 7911b3b..2244d57 100644
--- a/metalava-model-testsuite/src/main/java/com/android/tools/metalava/model/testsuite/BootstrapSourceModelProviderTest.kt
+++ b/metalava-model-testsuite/src/main/java/com/android/tools/metalava/model/testsuite/BootstrapSourceModelProviderTest.kt
@@ -16,7 +16,9 @@
package com.android.tools.metalava.model.testsuite
+import com.android.tools.metalava.model.PrimitiveTypeItem
import com.android.tools.metalava.testing.java
+import com.google.common.truth.Truth.assertThat
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import org.junit.Test
@@ -503,4 +505,23 @@
assertEquals(listOf(itf2Mtd1, itf1Mtd1), cls3Mtd1.superMethods())
}
}
+
+ @Test
+ fun `160 - check field type`() {
+ runSourceCodebaseTest(
+ java(
+ """
+ package test.pkg;
+
+ public class Test {
+ public int field;
+ }
+ """
+ ),
+ ) { codebase ->
+ val fieldTypeItem = codebase.assertClass("test.pkg.Test").assertField("field").type()
+ assertThat(fieldTypeItem).isInstanceOf(PrimitiveTypeItem::class.java)
+ assertEquals(PrimitiveTypeItem.Primitive.INT, (fieldTypeItem as PrimitiveTypeItem).kind)
+ }
+ }
}
diff --git a/metalava-model-turbine/src/main/java/com/android/tools/metalava/model/turbine/TurbineCodebaseInitialiser.kt b/metalava-model-turbine/src/main/java/com/android/tools/metalava/model/turbine/TurbineCodebaseInitialiser.kt
index 047dc7e..c0c89ef 100644
--- a/metalava-model-turbine/src/main/java/com/android/tools/metalava/model/turbine/TurbineCodebaseInitialiser.kt
+++ b/metalava-model-turbine/src/main/java/com/android/tools/metalava/model/turbine/TurbineCodebaseInitialiser.kt
@@ -22,6 +22,7 @@
import com.android.tools.metalava.model.DefaultAnnotationArrayAttributeValue
import com.android.tools.metalava.model.DefaultAnnotationAttribute
import com.android.tools.metalava.model.DefaultAnnotationSingleAttributeValue
+import com.android.tools.metalava.model.PrimitiveTypeItem.Primitive
import com.google.common.collect.ImmutableList
import com.google.common.collect.ImmutableMap
import com.google.turbine.binder.Binder
@@ -41,8 +42,12 @@
import com.google.turbine.model.Const.ArrayInitValue
import com.google.turbine.model.Const.Kind
import com.google.turbine.model.Const.Value
+import com.google.turbine.model.TurbineConstantTypeKind as PrimKind
import com.google.turbine.tree.Tree.CompUnit
import com.google.turbine.type.AnnoInfo
+import com.google.turbine.type.Type
+import com.google.turbine.type.Type.PrimTy
+import com.google.turbine.type.Type.TyKind
import java.io.File
import java.util.Optional
import javax.lang.model.SourceVersion
@@ -277,6 +282,37 @@
}
}
+ private fun createType(type: Type): TurbineTypeItem {
+ return when (type.tyKind()) {
+ TyKind.PRIM_TY -> {
+ type as PrimTy
+ val annotations = createAnnotations(type.annos())
+ val modifiers = TurbineTypeModifiers(annotations)
+ when (type.primkind()) {
+ PrimKind.BOOLEAN ->
+ TurbinePrimitiveTypeItem(codebase, modifiers, Primitive.BOOLEAN)
+ PrimKind.BYTE -> TurbinePrimitiveTypeItem(codebase, modifiers, Primitive.BYTE)
+ PrimKind.CHAR -> TurbinePrimitiveTypeItem(codebase, modifiers, Primitive.CHAR)
+ PrimKind.DOUBLE ->
+ TurbinePrimitiveTypeItem(codebase, modifiers, Primitive.DOUBLE)
+ PrimKind.FLOAT -> TurbinePrimitiveTypeItem(codebase, modifiers, Primitive.FLOAT)
+ PrimKind.INT -> TurbinePrimitiveTypeItem(codebase, modifiers, Primitive.INT)
+ PrimKind.LONG -> TurbinePrimitiveTypeItem(codebase, modifiers, Primitive.LONG)
+ PrimKind.SHORT -> TurbinePrimitiveTypeItem(codebase, modifiers, Primitive.SHORT)
+ else ->
+ throw IllegalStateException("Invalid primitive type in API surface: $type")
+ }
+ }
+ else -> {
+ return TurbinePrimitiveTypeItem(
+ codebase,
+ TurbineTypeModifiers(emptyList()),
+ Primitive.VOID
+ )
+ }
+ }
+ }
+
/** This method sets up the inner class hierarchy. */
private fun setInnerClasses(
classItem: TurbineClassItem,
@@ -297,10 +333,12 @@
val annotations = createAnnotations(field.annotations()).toList()
val fieldModifierItem =
TurbineModifierItem.create(codebase, field.access(), annotations)
+ val type = createType(field.type())
TurbineFieldItem(
codebase,
field.name(),
classItem,
+ type,
fieldModifierItem,
)
}
diff --git a/metalava-model-turbine/src/main/java/com/android/tools/metalava/model/turbine/TurbineFieldItem.kt b/metalava-model-turbine/src/main/java/com/android/tools/metalava/model/turbine/TurbineFieldItem.kt
index 0b4532d..9de01cb 100644
--- a/metalava-model-turbine/src/main/java/com/android/tools/metalava/model/turbine/TurbineFieldItem.kt
+++ b/metalava-model-turbine/src/main/java/com/android/tools/metalava/model/turbine/TurbineFieldItem.kt
@@ -25,6 +25,7 @@
override val codebase: Codebase,
private val name: String,
private val containingClass: TurbineClassItem,
+ private val type: TurbineTypeItem,
override val modifiers: TurbineModifierItem,
) : TurbineItem(codebase, modifiers), FieldItem {
@@ -47,9 +48,7 @@
override fun hashCode(): Int = name.hashCode()
- override fun type(): TypeItem {
- TODO("b/295800205")
- }
+ override fun type(): TypeItem = type
override fun duplicate(targetContainingClass: ClassItem): FieldItem {
TODO("b/295800205")
diff --git a/metalava-model-turbine/src/main/java/com/android/tools/metalava/model/turbine/TurbineTypeItem.kt b/metalava-model-turbine/src/main/java/com/android/tools/metalava/model/turbine/TurbineTypeItem.kt
new file mode 100644
index 0000000..fe743bc
--- /dev/null
+++ b/metalava-model-turbine/src/main/java/com/android/tools/metalava/model/turbine/TurbineTypeItem.kt
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * 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
+ *
+ * http://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.android.tools.metalava.model.turbine
+
+import com.android.tools.metalava.model.ClassItem
+import com.android.tools.metalava.model.Codebase
+import com.android.tools.metalava.model.Item
+import com.android.tools.metalava.model.PrimitiveTypeItem
+import com.android.tools.metalava.model.PrimitiveTypeItem.Primitive
+import com.android.tools.metalava.model.TypeItem
+import com.android.tools.metalava.model.TypeModifiers
+import java.util.function.Predicate
+
+sealed class TurbineTypeItem(
+ open val codebase: Codebase,
+ override val modifiers: TypeModifiers,
+) : TypeItem {
+
+ override fun asClass(): TurbineClassItem? = TODO("b/295800205")
+
+ override fun convertType(replacementMap: Map<String, String>?, owner: Item?): TypeItem =
+ TODO("b/295800205")
+
+ override fun markRecent() = TODO("b/295800205")
+
+ override fun scrubAnnotations() {
+ TODO("b/295800205")
+ }
+
+ override fun toErasedTypeString(context: Item?): String {
+ TODO("b/295800205")
+ }
+
+ override fun toTypeString(
+ outerAnnotations: Boolean,
+ innerAnnotations: Boolean,
+ erased: Boolean,
+ kotlinStyleNulls: Boolean,
+ context: Item?,
+ filter: Predicate<Item>?,
+ ): String = TODO("b/295800205")
+
+ override fun typeArgumentClasses(): List<ClassItem> = TODO("b/295800205")
+}
+
+class TurbinePrimitiveTypeItem(
+ override val codebase: Codebase,
+ override val modifiers: TypeModifiers,
+ override val kind: Primitive,
+) : PrimitiveTypeItem, TurbineTypeItem(codebase, modifiers) {}
diff --git a/metalava-model-turbine/src/main/java/com/android/tools/metalava/model/turbine/TurbineTypeModifiers.kt b/metalava-model-turbine/src/main/java/com/android/tools/metalava/model/turbine/TurbineTypeModifiers.kt
new file mode 100644
index 0000000..3112518
--- /dev/null
+++ b/metalava-model-turbine/src/main/java/com/android/tools/metalava/model/turbine/TurbineTypeModifiers.kt
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * 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
+ *
+ * http://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.android.tools.metalava.model.turbine
+
+import com.android.tools.metalava.model.AnnotationItem
+import com.android.tools.metalava.model.TypeModifiers
+
+/** Modifiers for a [TurbineTypeItem]. */
+internal class TurbineTypeModifiers(private val annotations: List<AnnotationItem>) : TypeModifiers {
+ override fun annotations(): List<AnnotationItem> = annotations
+}