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
+}