Migrate Room Codebase to XProcessing

This CL replaces room to use cross processing APIs rather
than javax.model APIs.

I've diffed the build outputs of old and new versions and
they are almost the same except in the new version we always
read the correct kotlin argument names.
https://paste.googleplex.com/4560953880346624

I've run the stress test and it also completed all 50 properly.

There is still room for improvement in XProcessing APIs which
might become more obvious while looking at this diff but more
changes will make this diff more complicated hence I've opted
in to keep XProcessing APIs as similar as possible to the current
Room code patterns.

Bug: 160322705
Test: existing tests

Change-Id: Ie4480a43fdff0f8f32dd0ea08c4088ac9f209dd3
diff --git a/room/compiler-xprocessing/build.gradle b/room/compiler-xprocessing/build.gradle
index eecb06f..8a89de4 100644
--- a/room/compiler-xprocessing/build.gradle
+++ b/room/compiler-xprocessing/build.gradle
@@ -49,7 +49,7 @@
 }
 androidx {
     name = "AndroidX Room XProcessor"
-    publish = Publish.NONE
+    publish = Publish.SNAPSHOT_AND_RELEASE
     toolingProject = true
     mavenGroup = LibraryGroups.ROOM
     inceptionYear = "2020"
diff --git a/room/compiler-xprocessing/src/main/java/androidx/room/processing/XElement.kt b/room/compiler-xprocessing/src/main/java/androidx/room/processing/XElement.kt
index b20621f..840f9a8 100644
--- a/room/compiler-xprocessing/src/main/java/androidx/room/processing/XElement.kt
+++ b/room/compiler-xprocessing/src/main/java/androidx/room/processing/XElement.kt
@@ -110,7 +110,7 @@
      * of it will be returned where fields can be read. Otherwise, `null` value is returned.
      *
      * @see [hasAnnotation]
-     * @see [hasAnnotationInPackage]
+     * @see [hasAnnotationWithPackage]
      */
     fun <T : Annotation> toAnnotationBox(annotation: KClass<T>): XAnnotationBox<T>?
 
@@ -118,7 +118,7 @@
      * Returns `true` if this element has an annotation that is declared in the given package.
      */
     // a very sad method but helps avoid abstraction annotation
-    fun hasAnnotationInPackage(pkg: String): Boolean
+    fun hasAnnotationWithPackage(pkg: String): Boolean
 
     /**
      * Returns `true` if this element is annotated with the given [annotation].
diff --git a/room/compiler-xprocessing/src/main/java/androidx/room/processing/javac/JavacElement.kt b/room/compiler-xprocessing/src/main/java/androidx/room/processing/javac/JavacElement.kt
index f4fe020..034e48b 100644
--- a/room/compiler-xprocessing/src/main/java/androidx/room/processing/javac/JavacElement.kt
+++ b/room/compiler-xprocessing/src/main/java/androidx/room/processing/javac/JavacElement.kt
@@ -120,7 +120,7 @@
         return element.kind.name.toLowerCase(Locale.US)
     }
 
-    override fun hasAnnotationInPackage(pkg: String): Boolean {
+    override fun hasAnnotationWithPackage(pkg: String): Boolean {
         return element.annotationMirrors.any {
             MoreElements.getPackage(it.annotationType.asElement()).toString() == pkg
         }
diff --git a/room/compiler-xprocessing/src/test/java/androidx/room/processing/XElementTest.kt b/room/compiler-xprocessing/src/test/java/androidx/room/processing/XElementTest.kt
index b792401..6146905 100644
--- a/room/compiler-xprocessing/src/test/java/androidx/room/processing/XElementTest.kt
+++ b/room/compiler-xprocessing/src/test/java/androidx/room/processing/XElementTest.kt
@@ -209,7 +209,7 @@
                 assertThat(method.hasAnnotation(Test::class)).isTrue()
                 assertThat(method.hasAnnotation(Override::class)).isFalse()
                 assertThat(
-                    method.hasAnnotationInPackage(
+                    method.hasAnnotationWithPackage(
                         "org.junit"
                     )
                 ).isTrue()
@@ -219,17 +219,17 @@
                 assertThat(field.hasAnnotation(Test::class)).isFalse()
             }
             assertThat(
-                element.hasAnnotationInPackage(
+                element.hasAnnotationWithPackage(
                     "org.junit.runner"
                 )
             ).isTrue()
             assertThat(
-                element.hasAnnotationInPackage(
+                element.hasAnnotationWithPackage(
                     "org.junit"
                 )
             ).isFalse()
             assertThat(
-                element.hasAnnotationInPackage(
+                element.hasAnnotationWithPackage(
                     "foo.bar"
                 )
             ).isFalse()
diff --git a/room/compiler/build.gradle b/room/compiler/build.gradle
index 6aed8258..e4354f6 100644
--- a/room/compiler/build.gradle
+++ b/room/compiler/build.gradle
@@ -105,6 +105,7 @@
 dependencies {
     implementation(project(":room:room-common"))
     implementation(project(":room:room-migration"))
+    implementation(project(":room:room-compiler-xprocessing"))
     implementation(KOTLIN_STDLIB)
     implementation(AUTO_COMMON)
     implementation(AUTO_VALUE_ANNOTATIONS)
diff --git a/room/compiler/src/main/kotlin/androidx/room/DatabaseProcessingStep.kt b/room/compiler/src/main/kotlin/androidx/room/DatabaseProcessingStep.kt
index 44406d6..1f54d69 100644
--- a/room/compiler/src/main/kotlin/androidx/room/DatabaseProcessingStep.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/DatabaseProcessingStep.kt
@@ -16,7 +16,9 @@
 
 package androidx.room
 
-import androidx.room.ext.asTypeElement
+import androidx.room.processing.XProcessingEnv
+import androidx.room.processing.XProcessingStep
+import androidx.room.processing.XTypeElement
 import androidx.room.processor.Context
 import androidx.room.processor.DatabaseProcessor
 import androidx.room.processor.MissingTypeException
@@ -25,20 +27,17 @@
 import androidx.room.vo.Warning
 import androidx.room.writer.DaoWriter
 import androidx.room.writer.DatabaseWriter
-import com.google.auto.common.BasicAnnotationProcessor
-import com.google.common.collect.SetMultimap
 import java.io.File
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.element.Element
+import kotlin.reflect.KClass
 
-class DatabaseProcessingStep(val processingEnv: ProcessingEnvironment) :
-    BasicAnnotationProcessor.ProcessingStep {
+class DatabaseProcessingStep : XProcessingStep {
     override fun process(
-        elementsByAnnotation: SetMultimap<Class<out Annotation>, Element>
-    ): MutableSet<Element> {
-        val context = Context(processingEnv)
-        val rejectedElements = mutableSetOf<Element>()
-        val databases = elementsByAnnotation[Database::class.java]
+        env: XProcessingEnv,
+        elementsByAnnotation: Map<KClass<out Annotation>, List<XTypeElement>>
+    ): Set<XTypeElement> {
+        val context = Context(env)
+        val rejectedElements = mutableSetOf<XTypeElement>()
+        val databases = elementsByAnnotation[Database::class]
             ?.mapNotNull {
                 try {
                     DatabaseProcessor(
@@ -80,7 +79,7 @@
                     if (!schemaOutFolder.exists()) {
                         schemaOutFolder.mkdirs()
                     }
-                    val qName = db.element.qualifiedName.toString()
+                    val qName = db.element.qualifiedName
                     val dbSchemaFolder = File(schemaOutFolder, qName)
                     if (!dbSchemaFolder.exists()) {
                         dbSchemaFolder.mkdirs()
@@ -97,8 +96,8 @@
         return rejectedElements
     }
 
-    override fun annotations(): MutableSet<out Class<out Annotation>> {
-        return mutableSetOf(Database::class.java)
+    override fun annotations(): Set<KClass<out Annotation>> {
+        return mutableSetOf(Database::class)
     }
 
     /**
diff --git a/room/compiler/src/main/kotlin/androidx/room/RoomProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/RoomProcessor.kt
index 89a6db0..aefbcf1 100644
--- a/room/compiler/src/main/kotlin/androidx/room/RoomProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/RoomProcessor.kt
@@ -16,6 +16,7 @@
 
 package androidx.room
 
+import androidx.room.processing.XProcessingEnv
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.util.SimpleJavaVersion
@@ -38,19 +39,22 @@
     private var jdkVersionHasBugReported = false
 
     override fun initSteps(): MutableIterable<ProcessingStep>? {
-        return mutableListOf(DatabaseProcessingStep(processingEnv))
+        return mutableListOf(
+            DatabaseProcessingStep().asAutoCommonProcessor(processingEnv)
+        )
     }
 
     override fun getSupportedOptions(): MutableSet<String> {
         val supportedOptions = Context.ARG_OPTIONS.toMutableSet()
-
-        if (Context.BooleanProcessorOptions.INCREMENTAL.getValue(processingEnv)) {
+        // x processing is a cheap wrapper so it is fine to re-create.
+        val xProcessing = XProcessingEnv.create(processingEnv)
+        if (Context.BooleanProcessorOptions.INCREMENTAL.getValue(xProcessing)) {
             if (methodParametersVisibleInClassFiles()) {
                 // Room can be incremental
                 supportedOptions.add(ISOLATING_ANNOTATION_PROCESSORS_INDICATOR)
             } else {
                 if (!jdkVersionHasBugReported) {
-                    Context(processingEnv).logger.w(
+                    Context(xProcessing).logger.w(
                         Warning.JDK_VERSION_HAS_BUG, ProcessorErrors.JDK_VERSION_HAS_BUG
                     )
                     jdkVersionHasBugReported = true
diff --git a/room/compiler/src/main/kotlin/androidx/room/ext/element_ext.kt b/room/compiler/src/main/kotlin/androidx/room/ext/element_ext.kt
deleted file mode 100644
index 806079c..0000000
--- a/room/compiler/src/main/kotlin/androidx/room/ext/element_ext.kt
+++ /dev/null
@@ -1,530 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-@file:Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
-
-package androidx.room.ext
-
-import asDeclaredType
-import asTypeElement
-import com.google.auto.common.AnnotationMirrors
-import com.google.auto.common.MoreElements
-import com.google.auto.common.MoreTypes
-import isAssignableFrom
-import isDeclared
-import isNotNone
-import isSameType
-import java.lang.reflect.Proxy
-import java.util.Locale
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.element.AnnotationMirror
-import javax.lang.model.element.AnnotationValue
-import javax.lang.model.element.Element
-import javax.lang.model.element.ElementKind
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.Modifier
-import javax.lang.model.element.TypeElement
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.ExecutableType
-import javax.lang.model.type.TypeMirror
-import javax.lang.model.type.WildcardType
-import javax.lang.model.util.ElementFilter
-import javax.lang.model.util.SimpleAnnotationValueVisitor6
-import javax.lang.model.util.SimpleTypeVisitor7
-import javax.lang.model.util.Types
-import kotlin.contracts.contract
-import kotlin.reflect.KClass
-
-private fun Element.hasModifier(modifier: Modifier): Boolean {
-    return this.modifiers.contains(modifier)
-}
-
-fun Element.isPublic() = hasModifier(Modifier.PUBLIC)
-
-fun Element.isAbstract() = hasModifier(Modifier.ABSTRACT)
-
-fun Element.isPrivate() = hasModifier(Modifier.PRIVATE)
-
-fun Element.isStatic() = hasModifier(Modifier.STATIC)
-
-fun Element.isTransient() = hasModifier(Modifier.TRANSIENT)
-
-fun Element.isFinal() = hasModifier(Modifier.FINAL)
-
-// we handle kotlin and java defaults differently
-fun ExecutableElement.isJavaDefault() = hasModifier(Modifier.DEFAULT)
-
-// checks if this executable element can be overridden but does not check if the enclosing element
-// can be overridden
-fun ExecutableElement.isOverrideableIgnoringContainer(): Boolean = !isPrivate() && !isFinal()
-
-fun Element.hasAnnotation(klass: KClass<out Annotation>): Boolean {
-    return MoreElements.isAnnotationPresent(this, klass.java)
-}
-
-fun Element.hasAnnotation(clazz: Class<out Annotation>): Boolean {
-    return MoreElements.isAnnotationPresent(this, clazz)
-}
-
-fun Element.hasAnyOf(vararg klass: KClass<out Annotation>): Boolean {
-    return klass.any { MoreElements.isAnnotationPresent(this, it.java) }
-}
-
-fun Element.isNonNull() =
-        asType().kind.isPrimitive ||
-                hasAnnotation(androidx.annotation.NonNull::class) ||
-                hasAnnotation(org.jetbrains.annotations.NotNull::class)
-
-fun Element.isEntityElement() = this.hasAnnotation(androidx.room.Entity::class)
-
-fun TypeElement.getConstructors(): List<ExecutableElement> {
-    return ElementFilter.constructorsIn(enclosedElements)
-}
-
-/**
- * gets all members including super privates. does not handle duplicate field names!!!
- */
-// TODO handle conflicts with super: b/35568142
-fun TypeElement.getAllFieldsIncludingPrivateSupers(processingEnvironment: ProcessingEnvironment):
-        Set<VariableElement> {
-    val myMembers = processingEnvironment.elementUtils.getAllMembers(this)
-            .filter { it.kind == ElementKind.FIELD }
-            .filter { it is VariableElement }
-            .map { it as VariableElement }
-            .toSet()
-    if (superclass.isNotNone()) {
-        return myMembers + superclass.asTypeElement()
-                .getAllFieldsIncludingPrivateSupers(processingEnvironment)
-    } else {
-        return myMembers
-    }
-}
-
-interface ClassGetter {
-    fun getAsTypeMirror(methodName: String): TypeMirror?
-    fun getAsTypeMirrorList(methodName: String): List<TypeMirror>
-    fun <T : Annotation> getAsAnnotationBox(methodName: String): AnnotationBox<T>
-    fun <T : Annotation> getAsAnnotationBoxArray(methodName: String): Array<AnnotationBox<T>>
-}
-
-/**
- * Class that helps to read values from annotations. Simple types as string, int, lists can
- * be read from [value]. If you need to read classes or another annotations from annotation use
- * [getAsTypeMirror], [getAsAnnotationBox] and [getAsAnnotationBoxArray] correspondingly.
- */
-class AnnotationBox<T : Annotation>(private val obj: Any) : ClassGetter by (obj as ClassGetter) {
-    @Suppress("UNCHECKED_CAST")
-    val value: T = obj as T
-}
-
-private fun <T : Annotation> AnnotationMirror.box(cl: Class<T>): AnnotationBox<T> {
-    if (!cl.isAnnotation) {
-        throw IllegalArgumentException("$cl is not annotation")
-    }
-    val map = cl.declaredMethods.associate { method ->
-        val value = AnnotationMirrors.getAnnotationValue(this, method.name)
-        val returnType = method.returnType
-        val defaultValue = method.defaultValue
-        val result: Any? = when {
-            returnType == Boolean::class.java -> value.getAsBoolean(defaultValue as Boolean)
-            returnType == String::class.java -> value.getAsString(defaultValue as String?)
-            returnType == Array<String>::class.java -> value.getAsStringList().toTypedArray()
-            returnType == emptyArray<Class<*>>()::class.java -> value.toListOfClassTypes()
-            returnType == IntArray::class.java -> value.getAsIntList().toIntArray()
-            returnType == Class::class.java -> {
-                try {
-                    value.toClassType()
-                } catch (notPresent: TypeNotPresentException) {
-                    null
-                }
-            }
-            returnType == Int::class.java -> value.getAsInt(defaultValue as Int?)
-            returnType.isAnnotation -> {
-                @Suppress("UNCHECKED_CAST")
-                AnnotationClassVisitor(returnType as Class<out Annotation>).visit(value)
-            }
-            returnType.isArray && returnType.componentType.isAnnotation -> {
-                @Suppress("UNCHECKED_CAST")
-                ListVisitor(returnType.componentType as Class<out Annotation>).visit(value)
-            }
-            returnType.isEnum -> {
-                @Suppress("UNCHECKED_CAST")
-                value.getAsEnum(returnType as Class<out Enum<*>>)
-            }
-            else -> throw UnsupportedOperationException("$returnType isn't supported")
-        }
-        method.name to result
-    }
-    return AnnotationBox(Proxy.newProxyInstance(ClassGetter::class.java.classLoader,
-            arrayOf(cl, ClassGetter::class.java)) { _, method, args ->
-        when (method.name) {
-            ClassGetter::getAsTypeMirror.name -> map[args[0]]
-            ClassGetter::getAsTypeMirrorList.name -> map[args[0]]
-            "getAsAnnotationBox" -> map[args[0]]
-            "getAsAnnotationBoxArray" -> map[args[0]]
-            else -> map[method.name]
-        }
-    })
-}
-
-fun <T : Annotation> Element.toAnnotationBox(cl: KClass<T>) =
-        MoreElements.getAnnotationMirror(this, cl.java).orNull()?.box(cl.java)
-
-@Suppress("DEPRECATION")
-private class ListVisitor<T : Annotation>(private val annotationClass: Class<T>) :
-    SimpleAnnotationValueVisitor6<Array<AnnotationBox<T>>, Void?>() {
-    override fun visitArray(
-        values: MutableList<out AnnotationValue>?,
-        void: Void?
-    ): Array<AnnotationBox<T>> {
-        val visitor = AnnotationClassVisitor(annotationClass)
-        return values?.mapNotNull { visitor.visit(it) }?.toTypedArray() ?: emptyArray()
-    }
-}
-
-@Suppress("DEPRECATION")
-private class AnnotationClassVisitor<T : Annotation>(private val annotationClass: Class<T>) :
-    SimpleAnnotationValueVisitor6<AnnotationBox<T>?, Void?>() {
-    override fun visitAnnotation(a: AnnotationMirror?, v: Void?) = a?.box(annotationClass)
-}
-
-// code below taken from dagger2
-// compiler/src/main/java/dagger/internal/codegen/ConfigurationAnnotations.java
-@Suppress("DEPRECATION")
-private val TO_LIST_OF_TYPES = object :
-    SimpleAnnotationValueVisitor6<List<TypeMirror>, Void?>() {
-    override fun visitArray(values: MutableList<out AnnotationValue>?, p: Void?): List<TypeMirror> {
-        return values?.mapNotNull {
-            val tmp = TO_TYPE.visit(it)
-            tmp
-        } ?: emptyList()
-    }
-
-    override fun defaultAction(o: Any?, p: Void?): List<TypeMirror>? {
-        return emptyList()
-    }
-}
-
-@Suppress("DEPRECATION")
-private val TO_TYPE = object : SimpleAnnotationValueVisitor6<TypeMirror, Void>() {
-
-    override fun visitType(t: TypeMirror, p: Void?): TypeMirror {
-        return t
-    }
-
-    override fun defaultAction(o: Any?, p: Void?): TypeMirror {
-        throw TypeNotPresentException(o!!.toString(), null)
-    }
-}
-
-private fun AnnotationValue.toListOfClassTypes(): List<TypeMirror> {
-    return TO_LIST_OF_TYPES.visit(this)
-}
-
-private fun AnnotationValue.toClassType(): TypeMirror? {
-    return TO_TYPE.visit(this)
-}
-
-fun TypeMirror.isCollection(): Boolean {
-    return MoreTypes.isType(this) &&
-            (MoreTypes.isTypeOf(java.util.List::class.java, this) ||
-                    MoreTypes.isTypeOf(java.util.Set::class.java, this))
-}
-
-@Suppress("DEPRECATION")
-private val ANNOTATION_VALUE_TO_INT_VISITOR = object : SimpleAnnotationValueVisitor6<Int?, Void>() {
-    override fun visitInt(i: Int, p: Void?): Int? {
-        return i
-    }
-}
-
-@Suppress("DEPRECATION")
-private val ANNOTATION_VALUE_TO_BOOLEAN_VISITOR = object :
-    SimpleAnnotationValueVisitor6<Boolean?, Void>() {
-    override fun visitBoolean(b: Boolean, p: Void?): Boolean? {
-        return b
-    }
-}
-
-@Suppress("DEPRECATION")
-private val ANNOTATION_VALUE_TO_STRING_VISITOR = object :
-    SimpleAnnotationValueVisitor6<String?, Void>() {
-    override fun visitString(s: String?, p: Void?): String? {
-        return s
-    }
-}
-
-@Suppress("DEPRECATION")
-private val ANNOTATION_VALUE_STRING_ARR_VISITOR = object :
-    SimpleAnnotationValueVisitor6<List<String>, Void>() {
-    override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<String> {
-        return vals?.mapNotNull {
-            ANNOTATION_VALUE_TO_STRING_VISITOR.visit(it)
-        } ?: emptyList()
-    }
-}
-
-@Suppress("DEPRECATION")
-private val ANNOTATION_VALUE_INT_ARR_VISITOR = object :
-    SimpleAnnotationValueVisitor6<List<Int>, Void>() {
-    override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Int> {
-        return vals?.mapNotNull {
-            ANNOTATION_VALUE_TO_INT_VISITOR.visit(it)
-        } ?: emptyList()
-    }
-}
-
-private fun AnnotationValue.getAsInt(def: Int? = null): Int? {
-    return ANNOTATION_VALUE_TO_INT_VISITOR.visit(this) ?: def
-}
-
-private fun AnnotationValue.getAsIntList(): List<Int> {
-    return ANNOTATION_VALUE_INT_ARR_VISITOR.visit(this)
-}
-
-private fun AnnotationValue.getAsString(def: String? = null): String? {
-    return ANNOTATION_VALUE_TO_STRING_VISITOR.visit(this) ?: def
-}
-
-private fun AnnotationValue.getAsBoolean(def: Boolean): Boolean {
-    return ANNOTATION_VALUE_TO_BOOLEAN_VISITOR.visit(this) ?: def
-}
-
-private fun AnnotationValue.getAsStringList(): List<String> {
-    return ANNOTATION_VALUE_STRING_ARR_VISITOR.visit(this)
-}
-
-@Suppress("UNCHECKED_CAST", "DEPRECATION")
-private fun <T : Enum<*>> AnnotationValue.getAsEnum(enumClass: Class<T>): T {
-    return object : SimpleAnnotationValueVisitor6<T, Void>() {
-        override fun visitEnumConstant(value: VariableElement?, p: Void?): T {
-            return enumClass.getDeclaredMethod("valueOf", String::class.java)
-                    .invoke(null, value!!.simpleName.toString()) as T
-        }
-    }.visit(this)
-}
-
-// a variant of Types.isAssignable that ignores variance.
-fun TypeMirror.isAssignableFromWithoutVariance(
-    typeUtils: Types,
-    from: TypeMirror
-) = typeUtils.isAssignableWithoutVariance(from = from, to = this)
-
-private fun Types.isAssignableWithoutVariance(from: TypeMirror, to: TypeMirror): Boolean {
-    val assignable = to.isAssignableFrom(this, from)
-    if (assignable) {
-        return true
-    }
-    if (!from.isDeclared() || !to.isDeclared()) {
-        return false
-    }
-    val declaredFrom = MoreTypes.asDeclared(from)
-    val declaredTo = MoreTypes.asDeclared(to)
-    val fromTypeArgs = declaredFrom.typeArguments
-    val toTypeArgs = declaredTo.typeArguments
-    // no type arguments, we don't need extra checks
-    if (fromTypeArgs.isEmpty() || fromTypeArgs.size != toTypeArgs.size) {
-        return false
-    }
-    // check erasure version first, if it does not match, no reason to proceed
-    if (!erasure(to).isAssignableFrom(this, erasure(from))) {
-        return false
-    }
-    // convert from args to their upper bounds if it exists
-    val fromExtendsBounds = fromTypeArgs.map {
-        it.extendsBound()
-    }
-    // if there are no upper bound conversions, return.
-    if (fromExtendsBounds.all { it == null }) {
-        return false
-    }
-    // try to move the types of the from to their upper bounds. It does not matter for the "to"
-    // because Types.isAssignable handles it as it is valid java
-    return (0 until fromTypeArgs.size).all { index ->
-        isAssignableWithoutVariance(
-                from = fromExtendsBounds[index] ?: fromTypeArgs[index],
-                to = toTypeArgs[index])
-    }
-}
-
-// converts ? in Set< ? extends Foo> to Foo
-fun TypeMirror.extendsBound(): TypeMirror? {
-    return this.accept(object : SimpleTypeVisitor7<TypeMirror?, Void?>() {
-        override fun visitWildcard(type: WildcardType, ignored: Void?): TypeMirror? {
-            return type.extendsBound ?: type.superBound
-        }
-    }, null)
-}
-
-/**
- * If the type mirror is in form of ? extends Foo, it returns Foo; otherwise, returns the TypeMirror
- * itself.
- */
-fun TypeMirror.extendsBoundOrSelf(): TypeMirror {
-    return extendsBound() ?: this
-}
-
-/**
- * Suffix of the Kotlin synthetic class created interface method implementations.
- */
-const val DEFAULT_IMPLS_CLASS_NAME = "DefaultImpls"
-
-/**
- * Finds the default implementation method corresponding to this Kotlin interface method.
- */
-fun ExecutableElement.findKotlinDefaultImpl(typeUtils: Types): ExecutableElement? {
-    fun paramsMatch(ourParams: List<VariableElement>, theirParams: List<VariableElement>): Boolean {
-        if (ourParams.size != theirParams.size - 1) {
-            return false
-        }
-        ourParams.forEachIndexed { i, variableElement ->
-            // Plus 1 to their index because their first param is a self object.
-            if (!theirParams[i + 1].type.isSameType(typeUtils, variableElement.type)) {
-                return false
-            }
-        }
-        return true
-    }
-
-    val parent = this.enclosingElement as TypeElement
-    val innerClass: TypeElement = parent.enclosedElements.find {
-        it.isType() && it.simpleName.contentEquals(DEFAULT_IMPLS_CLASS_NAME)
-    } as? TypeElement ?: return null
-    return innerClass.getDeclaredMethods().find {
-        it.name == this.name && paramsMatch(this.parameters, it.parameters)
-    }
-}
-
-/**
- * Finds the Kotlin's suspend function return type by inspecting the type param of the Continuation
- * parameter of the function. This method assumes the executable type is a suspend function.
- * @see KotlinMetadataElement.isSuspendFunction
- */
-fun ExecutableType.getSuspendFunctionReturnType(): TypeMirror {
-    // the continuation parameter is always the last parameter of a suspend function and it only has
-    // one type parameter, e.g Continuation<? super T>
-    val typeParam = MoreTypes.asDeclared(parameterTypes.last()).typeArguments.first()
-    return typeParam.extendsBoundOrSelf() // reduce the type param
-}
-
-fun Element.getPackage() = MoreElements.getPackage(this).qualifiedName.toString()
-
-fun Element.asTypeElement() = MoreElements.asType(this)
-
-fun Element.asVariableElement() = MoreElements.asVariable(this)
-
-fun Element.asExecutableElement() = MoreElements.asExecutable(this)
-
-fun Element.isType(): Boolean {
-    contract {
-        returns(true) implies (this@isType is TypeElement)
-    }
-    return MoreElements.isType(this)
-}
-
-fun Element.isMethod(): Boolean {
-    contract {
-        returns(true) implies (this@isMethod is ExecutableElement)
-    }
-    return kind == ElementKind.METHOD
-}
-
-fun Element.isConstructor(): Boolean {
-    contract {
-        returns(true) implies (this@isConstructor is ExecutableElement)
-    }
-    return kind == ElementKind.CONSTRUCTOR
-}
-
-fun Element.isField(): Boolean {
-    contract {
-        returns(true) implies (this@isField is VariableElement)
-    }
-    return kind == ElementKind.FIELD
-}
-
-fun Element.isInterface(): Boolean {
-    contract {
-        returns(true) implies (this@isInterface is TypeElement)
-    }
-    return kind == ElementKind.INTERFACE
-}
-
-fun Element.asDeclaredType() = asType().asDeclaredType()
-
-/**
- * methods declared in this type
- *  includes all instance/static methods in this
- */
-fun TypeElement.getDeclaredMethods() = ElementFilter.methodsIn(
-    enclosedElements
-)
-
-/**
- * Methods declared in this type and its parents
- *  includes all instance/static methods in this
- *  includes all instance/static methods in parent CLASS if they are accessible from this (e.g. not
- *  private).
- *  does not include static methods in parent interfaces
- */
-fun TypeElement.getAllMethods(
-    processingEnv: ProcessingEnvironment
-) = ElementFilter.methodsIn(
-    processingEnv.elementUtils.getAllMembers(this)
-)
-
-/**
- * Instance methods declared in this and supers
- *  include non private instance methods
- *  also includes non-private instance methods from supers
- */
-fun TypeElement.getAllNonPrivateInstanceMethods(
-    processingEnvironment: ProcessingEnvironment
-) = MoreElements.getLocalAndInheritedMethods(
-    this,
-    processingEnvironment.typeUtils,
-    processingEnvironment.elementUtils)
-
-fun VariableElement.asMemberOf(
-    types: Types,
-    container: DeclaredType?
-) = MoreTypes.asMemberOf(types, container, this)
-
-fun ExecutableElement.asMemberOf(
-    types: Types,
-    container: DeclaredType?
-) = MoreTypes.asExecutable(types.asMemberOf(container, this))
-
-/**
- * Returns the string representation of the element kind.
- */
-fun Element.kindName() = kind.name.toLowerCase(Locale.US)
-
-// instead of using asType on Element, we should use a specific Element subclass's  .type
-// it is not enforce-able until migrating to the abstraction but still a step in the right direction
-// of safety
-val VariableElement.type: TypeMirror
-    get() = asType()
-
-val TypeElement.type: DeclaredType
-    get() = MoreTypes.asDeclared(asType())
-
-val ExecutableElement.executableType: ExecutableType
-    get() = MoreTypes.asExecutable(asType())
-
-val Element.name: String
-    get() = simpleName.toString()
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/ext/javapoet_ext.kt b/room/compiler/src/main/kotlin/androidx/room/ext/javapoet_ext.kt
index 6e24603..3e00d9e 100644
--- a/room/compiler/src/main/kotlin/androidx/room/ext/javapoet_ext.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/ext/javapoet_ext.kt
@@ -24,7 +24,6 @@
 import com.squareup.javapoet.TypeSpec
 import java.util.concurrent.Callable
 import javax.lang.model.element.Modifier
-import javax.lang.model.type.TypeMirror
 import kotlin.reflect.KClass
 
 val L = "\$L"
@@ -32,9 +31,10 @@
 val N = "\$N"
 val S = "\$S"
 
-fun KClass<*>.typeName() = ClassName.get(this.java)
-fun KClass<*>.arrayTypeName() = ArrayTypeName.of(typeName())
-fun TypeMirror.typeName() = TypeName.get(this)
+val KClass<*>.typeName: ClassName
+        get() = ClassName.get(this.java)
+val KClass<*>.arrayTypeName: ArrayTypeName
+        get() = ArrayTypeName.of(typeName)
 
 object SupportDbTypeNames {
     val DB: ClassName = ClassName.get("$SQLITE_PACKAGE.db", "SupportSQLiteDatabase")
@@ -205,10 +205,10 @@
     parameterTypeName: TypeName,
     callBody: MethodSpec.Builder.() -> Unit
 ) = TypeSpec.anonymousClassBuilder("").apply {
-    superclass(ParameterizedTypeName.get(Callable::class.typeName(), parameterTypeName))
+    superclass(ParameterizedTypeName.get(Callable::class.typeName, parameterTypeName))
     addMethod(MethodSpec.methodBuilder("call").apply {
         returns(parameterTypeName)
-        addException(Exception::class.typeName())
+        addException(Exception::class.typeName)
         addModifiers(Modifier.PUBLIC)
         addAnnotation(Override::class.java)
         callBody()
@@ -223,7 +223,7 @@
 ) = TypeSpec.anonymousClassBuilder("").apply {
     superclass(
         ParameterizedTypeName.get(
-            Function1::class.typeName(),
+            Function1::class.typeName,
             parameterTypeName,
             returnTypeName
         )
diff --git a/room/compiler/src/main/kotlin/androidx/room/ext/processing_env_ext.kt b/room/compiler/src/main/kotlin/androidx/room/ext/processing_env_ext.kt
deleted file mode 100644
index c9e7812..0000000
--- a/room/compiler/src/main/kotlin/androidx/room/ext/processing_env_ext.kt
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright 2020 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 androidx.room.ext
-
-import com.google.auto.common.GeneratedAnnotations
-import com.squareup.javapoet.TypeName
-import java.util.Locale
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.ArrayType
-import javax.lang.model.type.TypeKind
-import javax.lang.model.type.TypeMirror
-import kotlin.reflect.KClass
-
-/**
- * Query a type element by KClass and return null if it does not exist
- */
-fun ProcessingEnvironment.findTypeElement(
-    klass: KClass<*>
-): TypeElement? = findTypeElement(klass.java.canonicalName!!)
-
-/**
- * Query a type element by TypeName and return null if it does not exist
- */
-fun ProcessingEnvironment.findTypeElement(
-    typeName: TypeName
-): TypeElement? = findTypeElement(typeName.toString())
-
-/**
- * Query a type element by qualified name and return null if it does not exist
- */
-fun ProcessingEnvironment.findTypeElement(
-    qName: String
-): TypeElement? = elementUtils.getTypeElement(qName)
-
-/**
- * Query a type element by KClass and throw if it does not exist
- */
-fun ProcessingEnvironment.requireTypeElement(
-    klass: KClass<*>
-): TypeElement = requireTypeElement(klass.java.canonicalName!!)
-
-/**
- * Query a type element by TypeName and throw if it does not exist
- */
-fun ProcessingEnvironment.requireTypeElement(
-    typeName: TypeName
-): TypeElement = requireTypeElement(typeName.toString())
-
-/**
- * Query a type element by qualified name and throw if it does not exist
- */
-fun ProcessingEnvironment.requireTypeElement(
-    qName: String
-): TypeElement = checkNotNull(elementUtils.getTypeElement(qName)) {
-    // we do not throw MissingTypeException here as this should be called only if the type should
-    // be there
-    "Couldn't find required type $qName"
-}
-
-/**
- * Query a TypeMirror by KClass and throw if it does not exist
- */
-fun ProcessingEnvironment.requireTypeMirror(
-    klass: KClass<*>
-): TypeMirror = requireTypeMirror(klass.java.canonicalName!!)
-
-/**
- * Query a TypeMirror by TypeName and throw if it does not exist
- */
-fun ProcessingEnvironment.requireTypeMirror(
-    typeName: TypeName
-): TypeMirror = requireTypeMirror(typeName.toString())
-
-/**
- * Query a TypeMirror by qualified name and throw if it does not exist
- */
-fun ProcessingEnvironment.requireTypeMirror(
-    qName: String
-): TypeMirror = checkNotNull(findTypeMirror(qName)) {
-    "couldn't find required type mirror $qName"
-}
-
-/**
- * Query a type mirror by KClass and return null if it does not exist
- */
-fun ProcessingEnvironment.findTypeMirror(
-    klass: KClass<*>
-): TypeMirror? = findTypeMirror(klass.java.canonicalName!!)
-
-/**
- * Query a type mirror by TypeName and return null if it does not exist
- */
-fun ProcessingEnvironment.findTypeMirror(
-    typeName: TypeName
-): TypeMirror? = findTypeMirror(typeName.toString())
-
-private val PRIMITIVE_TYPE_MAPPING = TypeKind.values().filter {
-    it.isPrimitive
-}.associateBy {
-    it.name.toLowerCase(Locale.US)
-}
-
-/**
- * Query a type mirror by qualified name and return null if it does not exist
- */
-fun ProcessingEnvironment.findTypeMirror(
-    qName: String
-): TypeMirror? {
-    // first check primitives. Even though it is less likely, it is fast to check and can avoid a
-    // call to the processor
-    PRIMITIVE_TYPE_MAPPING[qName]?.let {
-        return typeUtils.getPrimitiveType(it)
-    }
-    return findTypeElement(qName)?.type
-}
-
-fun ProcessingEnvironment.getGeneratedAnnotation(): TypeElement? {
-    val element = GeneratedAnnotations.generatedAnnotation(elementUtils, sourceVersion)
-    return if (element.isPresent) {
-        element.get()
-    } else {
-        null
-    }
-}
-
-fun ProcessingEnvironment.getArrayType(typeName: TypeName): ArrayType {
-    return typeUtils.getArrayType(requireTypeMirror(typeName))
-}
diff --git a/room/compiler/src/main/kotlin/androidx/room/ext/type_mirror_ext.kt b/room/compiler/src/main/kotlin/androidx/room/ext/type_mirror_ext.kt
deleted file mode 100644
index a28f674..0000000
--- a/room/compiler/src/main/kotlin/androidx/room/ext/type_mirror_ext.kt
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-import androidx.room.ext.type
-import com.google.auto.common.MoreTypes
-import javax.lang.model.element.Element
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.ArrayType
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.PrimitiveType
-import javax.lang.model.type.TypeKind
-import javax.lang.model.type.TypeKind.ARRAY
-import javax.lang.model.type.TypeKind.BOOLEAN
-import javax.lang.model.type.TypeKind.BYTE
-import javax.lang.model.type.TypeKind.CHAR
-import javax.lang.model.type.TypeKind.DECLARED
-import javax.lang.model.type.TypeKind.DOUBLE
-import javax.lang.model.type.TypeKind.FLOAT
-import javax.lang.model.type.TypeKind.INT
-import javax.lang.model.type.TypeKind.LONG
-import javax.lang.model.type.TypeKind.SHORT
-import javax.lang.model.type.TypeMirror
-import javax.lang.model.util.Types
-import kotlin.contracts.ExperimentalContracts
-import kotlin.contracts.contract
-import kotlin.reflect.KClass
-
-fun TypeMirror.defaultValue(): String {
-    return when (this.kind) {
-        BOOLEAN -> "false"
-        BYTE, SHORT, INT, LONG, CHAR, FLOAT, DOUBLE -> "0"
-        else -> "null"
-    }
-}
-
-fun TypeMirror.box(typeUtils: Types) = if (this.kind.isPrimitive) {
-    typeUtils.boxedClass(this as PrimitiveType).type
-} else {
-    this
-}
-fun TypeMirror.asTypeElement(): TypeElement = MoreTypes.asTypeElement(this)
-
-fun TypeMirror.asElement(): Element = MoreTypes.asElement(this)
-
-fun TypeMirror.isPrimitiveInt() = kind == TypeKind.INT
-
-fun TypeMirror.isPrimitive() = kind.isPrimitive
-
-fun TypeMirror.isBoxedInt() =
-    MoreTypes.isType(this) && MoreTypes.isTypeOf(java.lang.Integer::class.java, this)
-
-fun TypeMirror.isInt() = isPrimitiveInt() || isBoxedInt()
-
-fun TypeMirror.isPrimitiveLong() = kind == TypeKind.LONG
-
-fun TypeMirror.isBoxedLong() =
-    MoreTypes.isType(this) && MoreTypes.isTypeOf(java.lang.Long::class.java, this)
-
-fun TypeMirror.isLong() = isPrimitiveLong() || isBoxedLong()
-
-fun TypeMirror.isList() =
-    MoreTypes.isType(this) && MoreTypes.isTypeOf(List::class.java, this)
-
-fun TypeMirror.isVoid() = kind == TypeKind.VOID
-
-fun TypeMirror.isNotVoid() = !isVoid()
-
-fun TypeMirror.isError() = kind == TypeKind.ERROR
-
-fun TypeMirror.isNotError() = !isError()
-
-fun TypeMirror.isNone() = kind == TypeKind.NONE
-
-fun TypeMirror.isNotNone() = !isNone()
-
-fun TypeMirror.isByte() = kind == BYTE
-
-fun TypeMirror.isNotByte() = !isByte()
-
-@OptIn(ExperimentalContracts::class)
-fun TypeMirror.isDeclared(): Boolean {
-    contract {
-        returns(true) implies (this@isDeclared is DeclaredType)
-    }
-    return kind == DECLARED
-}
-
-fun TypeMirror.isVoidObject() =
-    MoreTypes.isType(this) && MoreTypes.isTypeOf(Void::class.java, this)
-
-fun TypeMirror.isKotlinUnit() =
-    MoreTypes.isType(this) && MoreTypes.isTypeOf(Unit::class.java, this)
-
-fun TypeMirror.isAssignableFrom(typeUtils: Types, other: TypeMirror): Boolean {
-    return typeUtils.isAssignable(other, this)
-}
-
-fun TypeMirror.asDeclaredType() = MoreTypes.asDeclared(this)
-
-fun TypeMirror.isType() = MoreTypes.isType(this)
-
-fun TypeMirror.isTypeOf(klass: KClass<*>) = MoreTypes.isTypeOf(
-    klass.java,
-    this
-)
-
-fun TypeMirror.isArray(): Boolean {
-    contract {
-        returns(true) implies (this@isArray is ArrayType)
-    }
-    return kind == ARRAY
-}
-
-fun TypeMirror.asArray() = MoreTypes.asArray(this)
-
-fun TypeMirror.asPrimitive() = MoreTypes.asPrimitiveType(this)
-
-fun TypeMirror.isSameType(utils: Types, other: TypeMirror) = utils.isSameType(this, other)
-
-fun TypeMirror.erasure(utils: Types) = utils.erasure(this)
diff --git a/room/compiler/src/main/kotlin/androidx/room/ext/xelement_ext.kt b/room/compiler/src/main/kotlin/androidx/room/ext/xelement_ext.kt
new file mode 100644
index 0000000..ff3928b
--- /dev/null
+++ b/room/compiler/src/main/kotlin/androidx/room/ext/xelement_ext.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2020 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 androidx.room.ext
+
+import androidx.room.processing.XElement
+import androidx.room.processing.XTypeElement
+import kotlin.contracts.contract
+
+fun XElement.isEntityElement(): Boolean {
+    contract {
+        returns(true) implies (this@isEntityElement is XTypeElement)
+    }
+    return this.hasAnnotation(androidx.room.Entity::class)
+}
+
+/**
+ * Suffix of the Kotlin synthetic class created interface method implementations.
+ */
+const val DEFAULT_IMPLS_CLASS_NAME = "DefaultImpls"
diff --git a/room/compiler/src/main/kotlin/androidx/room/kotlin/JvmDescriptorUtils.kt b/room/compiler/src/main/kotlin/androidx/room/kotlin/JvmDescriptorUtils.kt
deleted file mode 100644
index 09cf3f2..0000000
--- a/room/compiler/src/main/kotlin/androidx/room/kotlin/JvmDescriptorUtils.kt
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright 2019 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 androidx.room.kotlin
-
-import androidx.room.ext.executableType
-import androidx.room.ext.type
-import javax.lang.model.element.Element
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.NestingKind
-import javax.lang.model.element.QualifiedNameable
-import javax.lang.model.element.TypeElement
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.ArrayType
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.ErrorType
-import javax.lang.model.type.ExecutableType
-import javax.lang.model.type.IntersectionType
-import javax.lang.model.type.NoType
-import javax.lang.model.type.NullType
-import javax.lang.model.type.PrimitiveType
-import javax.lang.model.type.TypeKind
-import javax.lang.model.type.TypeMirror
-import javax.lang.model.type.TypeVariable
-import javax.lang.model.type.UnionType
-import javax.lang.model.type.WildcardType
-import javax.lang.model.util.AbstractTypeVisitor8
-
-/**
- * Returns the method descriptor of this [ExecutableElement].
- *
- * For reference, see the [JVM specification, section 4.3.2](https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.3.2)
- */
-fun VariableElement.descriptor() = "$simpleName:${type.descriptor()}"
-
-/**
- * Returns the method descriptor of this [ExecutableElement].
- *
- * For reference, see the [JVM specification, section 4.3.3](https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.3.3)
- */
-fun ExecutableElement.descriptor() = "$simpleName${executableType.descriptor()}"
-
-/**
- * Returns the name of this [TypeElement] in its "internal form".
- *
- * For reference, see the [JVM specification, section 4.2](https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.2).
- */
-internal val Element.internalName: String
-    get() = when (this) {
-        is TypeElement ->
-            when (nestingKind) {
-                NestingKind.TOP_LEVEL ->
-                    qualifiedName.toString().replace('.', '/')
-                NestingKind.MEMBER ->
-                    enclosingElement.internalName + "$" + simpleName
-                NestingKind.LOCAL, NestingKind.ANONYMOUS ->
-                    error("Unsupported nesting $nestingKind")
-                else ->
-                    error("Unsupported, nestingKind == null")
-            }
-        is QualifiedNameable -> qualifiedName.toString().replace('.', '/')
-        else -> simpleName.toString()
-    }
-
-internal val NoType.descriptor: String
-    get() = "V"
-
-internal val DeclaredType.descriptor: String
-    get() = "L" + asElement().internalName + ";"
-
-internal val PrimitiveType.descriptor: String
-    get() = when (this.kind) {
-        TypeKind.BYTE -> "B"
-        TypeKind.CHAR -> "C"
-        TypeKind.DOUBLE -> "D"
-        TypeKind.FLOAT -> "F"
-        TypeKind.INT -> "I"
-        TypeKind.LONG -> "J"
-        TypeKind.SHORT -> "S"
-        TypeKind.BOOLEAN -> "Z"
-        else -> error("Unknown primitive type $this")
-    }
-
-fun TypeMirror.descriptor(): String = accept(JvmDescriptorTypeVisitor, Unit)
-
-internal fun WildcardType.descriptor(): String = ""
-
-// The erasure of a type variable is the erasure of its leftmost bound. - JVM Spec Sec 4.6
-internal fun TypeVariable.descriptor(): String = this.upperBound.descriptor()
-
-// For a type variable with multiple bounds: "the erasure of a type variable is determined by
-// the first type in its bound" - JVM Spec Sec 4.4
-internal fun IntersectionType.descriptor(): String =
-    this.bounds[0].descriptor()
-
-internal fun ArrayType.descriptor(): String =
-    "[" + componentType.descriptor()
-
-internal fun ExecutableType.descriptor(): String {
-    val parameterDescriptors =
-        parameterTypes.joinToString(separator = "") { it.descriptor() }
-    val returnDescriptor = returnType.descriptor()
-    return "($parameterDescriptors)$returnDescriptor"
-}
-
-/**
- * When applied over a type, it returns either:
- * + a "field descriptor", for example: `Ljava/lang/Object;`
- * + a "method descriptor", for example: `(Ljava/lang/Object;)Z`
- *
- * The easiest way to use this is through [TypeMirror.descriptor]
- *
- * For reference, see the [JVM specification, section 4.3](http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.3).
- */
-@Suppress("DEPRECATION")
-internal object JvmDescriptorTypeVisitor : AbstractTypeVisitor8<String, Unit>() {
-
-    override fun visitNoType(t: NoType, u: Unit): String = t.descriptor
-
-    override fun visitDeclared(t: DeclaredType, u: Unit): String = t.descriptor
-
-    override fun visitPrimitive(t: PrimitiveType, u: Unit): String = t.descriptor
-
-    override fun visitArray(t: ArrayType, u: Unit): String = t.descriptor()
-
-    override fun visitWildcard(t: WildcardType, u: Unit): String = t.descriptor()
-
-    override fun visitExecutable(t: ExecutableType, u: Unit): String = t.descriptor()
-
-    override fun visitTypeVariable(t: TypeVariable, u: Unit): String = t.descriptor()
-
-    override fun visitNull(t: NullType, u: Unit): String = visitUnknown(t, u)
-
-    override fun visitError(t: ErrorType, u: Unit): String = visitUnknown(t, u)
-
-    override fun visitIntersection(t: IntersectionType, u: Unit) = t.descriptor()
-
-    override fun visitUnion(t: UnionType, u: Unit) = visitUnknown(t, u)
-
-    override fun visitUnknown(t: TypeMirror, u: Unit): String = error("Unsupported type $t")
-}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/kotlin/KotlinClassMetadataUtils.kt b/room/compiler/src/main/kotlin/androidx/room/kotlin/KotlinClassMetadataUtils.kt
deleted file mode 100644
index 955c5f1..0000000
--- a/room/compiler/src/main/kotlin/androidx/room/kotlin/KotlinClassMetadataUtils.kt
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright 2019 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 androidx.room.kotlin
-
-import kotlinx.metadata.ClassName
-import kotlinx.metadata.Flag
-import kotlinx.metadata.Flags
-import kotlinx.metadata.KmClassVisitor
-import kotlinx.metadata.KmConstructorExtensionVisitor
-import kotlinx.metadata.KmConstructorVisitor
-import kotlinx.metadata.KmExtensionType
-import kotlinx.metadata.KmFunctionExtensionVisitor
-import kotlinx.metadata.KmFunctionVisitor
-import kotlinx.metadata.KmValueParameterVisitor
-import kotlinx.metadata.jvm.JvmConstructorExtensionVisitor
-import kotlinx.metadata.jvm.JvmFunctionExtensionVisitor
-import kotlinx.metadata.jvm.JvmMethodSignature
-import kotlinx.metadata.jvm.KotlinClassMetadata
-
-/**
- * Represents the kotlin metadata of a function
- */
-data class KmFunction(
-    val descriptor: String,
-    private val flags: Flags,
-    val parameters: List<KmValueParameter>
-) {
-    fun isSuspend() = Flag.Function.IS_SUSPEND(flags)
-}
-
-/**
- * Represents the kotlin metadata of a constructor
- */
-data class KmConstructor(
-    val descriptor: String,
-    private val flags: Flags,
-    val parameters: List<KmValueParameter>
-) {
-    fun isPrimary() = Flag.Constructor.IS_PRIMARY(flags)
-}
-
-/**
- * Represents the kotlin metadata of a parameter
- */
-data class KmValueParameter(val name: String, private val flags: Flags)
-
-internal fun KotlinClassMetadata.Class.readFunctions(): List<KmFunction> =
-    mutableListOf<KmFunction>().apply { accept(FunctionReader(this)) }
-
-private class FunctionReader(val result: MutableList<KmFunction>) : KmClassVisitor() {
-    override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? {
-        return object : KmFunctionVisitor() {
-
-            lateinit var descriptor: String
-            val parameters = mutableListOf<KmValueParameter>()
-
-            override fun visitValueParameter(
-                flags: Flags,
-                name: String
-            ): KmValueParameterVisitor? {
-                parameters.add(KmValueParameter(name, flags))
-                return super.visitValueParameter(flags, name)
-            }
-
-            override fun visitExtensions(type: KmExtensionType): KmFunctionExtensionVisitor? {
-                if (type != JvmFunctionExtensionVisitor.TYPE) {
-                    error("Unsupported extension type: $type")
-                }
-                return object : JvmFunctionExtensionVisitor() {
-                    override fun visit(signature: JvmMethodSignature?) {
-                        descriptor = signature!!.asString()
-                    }
-                }
-            }
-
-            override fun visitEnd() {
-                result.add(KmFunction(descriptor, flags, parameters))
-            }
-        }
-    }
-}
-
-internal fun KotlinClassMetadata.Class.readConstructors(): List<KmConstructor> =
-    mutableListOf<KmConstructor>().apply { accept(ConstructorReader(this)) }
-
-private class ConstructorReader(val result: MutableList<KmConstructor>) : KmClassVisitor() {
-    override fun visitConstructor(flags: Flags): KmConstructorVisitor? {
-        return object : KmConstructorVisitor() {
-
-            lateinit var descriptor: String
-            val parameters = mutableListOf<KmValueParameter>()
-
-            override fun visitValueParameter(
-                flags: Flags,
-                name: String
-            ): KmValueParameterVisitor? {
-                parameters.add(KmValueParameter(name, flags))
-                return super.visitValueParameter(flags, name)
-            }
-
-            override fun visitExtensions(type: KmExtensionType): KmConstructorExtensionVisitor? {
-                if (type != JvmConstructorExtensionVisitor.TYPE) {
-                    error("Unsupported extension type: $type")
-                }
-                return object : JvmConstructorExtensionVisitor() {
-                    override fun visit(signature: JvmMethodSignature?) {
-                        descriptor = signature!!.asString()
-                    }
-                }
-            }
-
-            override fun visitEnd() {
-                result.add(KmConstructor(descriptor, flags, parameters))
-            }
-        }
-    }
-}
-
-internal fun KotlinClassMetadata.Class.isObject(): Boolean = ObjectReader().let {
-    this@isObject.accept(it)
-    it.isObject
-}
-
-private class ObjectReader() : KmClassVisitor() {
-    var isObject: Boolean = false
-    override fun visit(flags: Flags, name: ClassName) {
-        isObject = Flag.Class.IS_OBJECT(flags)
-    }
-}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/kotlin/KotlinMetadataElement.kt b/room/compiler/src/main/kotlin/androidx/room/kotlin/KotlinMetadataElement.kt
deleted file mode 100644
index 6d121bc..0000000
--- a/room/compiler/src/main/kotlin/androidx/room/kotlin/KotlinMetadataElement.kt
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2019 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 androidx.room.kotlin
-
-import androidx.room.processor.Context
-import kotlinx.metadata.jvm.KotlinClassHeader
-import kotlinx.metadata.jvm.KotlinClassMetadata
-import javax.lang.model.element.Element
-import javax.lang.model.element.ExecutableElement
-
-/**
- * Utility class for processors that wants to run kotlin specific code.
- */
-class KotlinMetadataElement(
-    val context: Context,
-    val element: Element,
-    private val classMetadata: KotlinClassMetadata.Class
-) {
-
-    private val functionList: List<KmFunction> by lazy { classMetadata.readFunctions() }
-    private val constructorList: List<KmConstructor> by lazy { classMetadata.readConstructors() }
-
-    private val ExecutableElement.descriptor: String
-        get() = descriptor()
-
-    /**
-     * Returns the parameter names of the function or constructor if all have names embedded in the
-     * metadata.
-     */
-    fun getParameterNames(method: ExecutableElement): List<String>? {
-        val methodSignature = method.descriptor
-        val paramList =
-            functionList.firstOrNull { it.descriptor == methodSignature }?.parameters
-                ?: constructorList.firstOrNull { it.descriptor == methodSignature }?.parameters
-        return paramList?.map { it.name }
-    }
-
-    /**
-     * Finds the primary constructor descriptor of the class.
-     */
-    fun findPrimaryConstructorSignature() = constructorList.first { it.isPrimary() }.descriptor
-
-    /**
-     * Checks if a method is a suspend function.
-     */
-    fun isSuspendFunction(method: ExecutableElement) = functionList.firstOrNull {
-        it.descriptor == method.descriptor
-    }?.isSuspend() ?: false
-
-    fun isObject(): Boolean = classMetadata.isObject()
-
-    companion object {
-
-        /**
-         * Creates a [KotlinMetadataElement] for the given element if it contains Kotlin metadata,
-         * otherwise this method returns null.
-         *
-         * Usually the [element] passed must represent a class. For example, if kotlin metadata is
-         * desired for a method, then the containing method should be used as parameter.
-         */
-        fun createFor(context: Context, element: Element): KotlinMetadataElement? {
-            val metadata = getMetadataAnnotation(element)?.run {
-                KotlinClassHeader(
-                    kind = kind,
-                    metadataVersion = metadataVersion,
-                    bytecodeVersion = bytecodeVersion,
-                    data1 = data1,
-                    data2 = data2,
-                    extraString = extraString,
-                    packageName = packageName,
-                    extraInt = extraInt
-                ).let {
-                    // TODO: Support more metadata kind (file facade, synthetic class, etc...)
-                    KotlinClassMetadata.read(it) as? KotlinClassMetadata.Class
-                }
-            }
-            return if (metadata != null) {
-                KotlinMetadataElement(context, element, metadata)
-            } else {
-                null
-            }
-        }
-
-        /**
-         * Search for Kotlin's Metadata annotation across the element's hierarchy.
-         */
-        private fun getMetadataAnnotation(element: Element?): Metadata? =
-            if (element != null) {
-                element.getAnnotation(Metadata::class.java)
-                    ?: getMetadataAnnotation(element.enclosingElement)
-            } else {
-                null
-            }
-    }
-}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/log/RLog.kt b/room/compiler/src/main/kotlin/androidx/room/log/RLog.kt
index 6df6342..c1433aa 100644
--- a/room/compiler/src/main/kotlin/androidx/room/log/RLog.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/log/RLog.kt
@@ -18,22 +18,19 @@
 
 package androidx.room.log
 
+import androidx.room.processing.XElement
+import androidx.room.processing.XMessager
 import androidx.room.processor.Context
 import androidx.room.vo.Warning
-import java.io.StringWriter
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.element.Element
-import javax.lang.model.element.ElementKind
-import javax.lang.model.util.Elements
 import javax.tools.Diagnostic
 import javax.tools.Diagnostic.Kind.ERROR
 import javax.tools.Diagnostic.Kind.NOTE
 import javax.tools.Diagnostic.Kind.WARNING
 
 class RLog(
-    val messager: Messager,
+    val messager: XMessager,
     val suppressedWarnings: Set<Warning>,
-    val defaultElement: Element?
+    val defaultElement: XElement?
 ) {
     private fun String.safeFormat(vararg args: Any): String {
         try {
@@ -45,7 +42,7 @@
         }
     }
 
-    fun d(element: Element, msg: String, vararg args: Any) {
+    fun d(element: XElement, msg: String, vararg args: Any) {
         messager.printMessage(NOTE, msg.safeFormat(args), element)
     }
 
@@ -53,7 +50,7 @@
         messager.printMessage(NOTE, msg.safeFormat(args))
     }
 
-    fun e(element: Element, msg: String, vararg args: Any) {
+    fun e(element: XElement, msg: String, vararg args: Any) {
         messager.printMessage(ERROR, msg.safeFormat(args), element)
     }
 
@@ -61,12 +58,14 @@
         messager.printMessage(ERROR, msg.safeFormat(args), defaultElement)
     }
 
-    fun w(warning: Warning, element: Element? = null, msg: String, vararg args: Any) {
+    fun w(warning: Warning, element: XElement? = null, msg: String, vararg args: Any) {
         if (suppressedWarnings.contains(warning)) {
             return
         }
-        messager.printMessage(WARNING, msg.safeFormat(args),
-                element ?: defaultElement)
+        messager.printMessage(
+            WARNING, msg.safeFormat(args),
+            element ?: defaultElement
+        )
     }
 
     fun w(warning: Warning, msg: String, vararg args: Any) {
@@ -76,32 +75,15 @@
         messager.printMessage(WARNING, msg.safeFormat(args), defaultElement)
     }
 
-    interface Messager {
-        fun printMessage(kind: Diagnostic.Kind, msg: String, element: Element? = null)
-    }
-
-    class ProcessingEnvMessager(val processingEnv: ProcessingEnvironment) : Messager {
-        override fun printMessage(kind: Diagnostic.Kind, msg: String, element: Element?) {
-            processingEnv.messager.printMessage(
-                    kind,
-                    if (element != null && element.isFromCompiledClass()) {
-                        msg.appendElement(processingEnv.elementUtils, element)
-                    } else {
-                        msg
-                    },
-                    element)
-        }
-    }
-
-    class CollectingMessager : Messager {
-        private val messages = mutableMapOf<Diagnostic.Kind, MutableList<Pair<String, Element?>>> ()
-        override fun printMessage(kind: Diagnostic.Kind, msg: String, element: Element?) {
+    class CollectingMessager : XMessager {
+        private val messages = mutableMapOf<Diagnostic.Kind, MutableList<Pair<String, XElement?>>>()
+        override fun printMessage(kind: Diagnostic.Kind, msg: String, element: XElement?) {
             messages.getOrPut(kind, {
                 arrayListOf()
             }).add(Pair(msg, element))
         }
 
-        fun hasErrors() = messages.containsKey(Diagnostic.Kind.ERROR)
+        fun hasErrors() = messages.containsKey(ERROR)
 
         fun writeTo(context: Context) {
             val printMessage = context.logger.messager::printMessage
@@ -113,51 +95,4 @@
             }
         }
     }
-
-    companion object {
-
-        /**
-         * Indicates whether an element comes from a compiled class.
-         *
-         * If this method fails to identify if the element comes from a compiled class it will
-         * default to returning false. Note that this is a poor-man's method of identifying if the
-         * java source of the element is available without depending on compiler tools.
-         */
-        private fun Element.isFromCompiledClass(): Boolean {
-            fun getClassFileString(symbol: Any): String =
-                    try {
-                        symbol.javaClass.getDeclaredField("classfile").get(symbol).toString()
-                    } catch (ex: NoSuchFieldException) {
-                        getClassFileString(
-                                symbol.javaClass.superclass.getDeclaredField("owner").get(symbol))
-                    }
-
-            return try {
-                getClassFileString(this).let {
-                    it.contains(".jar") || it.contains(".class")
-                }
-            } catch (ex: Throwable) {
-                false
-            }
-        }
-
-        private fun String.appendElement(elementUtils: Elements, element: Element): String {
-            return StringBuilder(this).apply {
-                append(" - ")
-                when (element.kind) {
-                    ElementKind.CLASS, ElementKind.INTERFACE, ElementKind.CONSTRUCTOR ->
-                        append(element)
-                    ElementKind.FIELD, ElementKind.METHOD, ElementKind.PARAMETER ->
-                        append("$element in ${element.enclosingElement}")
-                    else -> {
-                        // Not sure how to nicely print the element, delegate to utils then.
-                        append("In:\n")
-                        append(StringWriter().apply {
-                            elementUtils.printElements(this, element)
-                        }.toString())
-                    }
-                }
-            }.toString()
-        }
-    }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/parser/ParsedQuery.kt b/room/compiler/src/main/kotlin/androidx/room/parser/ParsedQuery.kt
index 04b95e9..1b402da 100644
--- a/room/compiler/src/main/kotlin/androidx/room/parser/ParsedQuery.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/parser/ParsedQuery.kt
@@ -30,9 +30,9 @@
 
 data class Section(val text: String, val type: SectionType) {
     companion object {
-        fun text(text: String) = Section(text, SectionType.TEXT)
-        fun newline() = Section("", SectionType.NEWLINE)
-        fun bindVar(text: String) = Section(text, SectionType.BIND_VAR)
+        fun text(text: String) = Section(text, TEXT)
+        fun newline() = Section("", NEWLINE)
+        fun bindVar(text: String) = Section(text, BIND_VAR)
     }
 }
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/parser/SqlParser.kt b/room/compiler/src/main/kotlin/androidx/room/parser/SqlParser.kt
index 82dc4e6..494dfd6 100644
--- a/room/compiler/src/main/kotlin/androidx/room/parser/SqlParser.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/parser/SqlParser.kt
@@ -17,14 +17,11 @@
 package androidx.room.parser
 
 import androidx.room.ColumnInfo
-import androidx.room.ext.getArrayType
-import androidx.room.ext.requireTypeMirror
-import box
+import androidx.room.processing.XProcessingEnv
+import androidx.room.processing.XType
 import com.squareup.javapoet.TypeName
 import org.antlr.v4.runtime.tree.ParseTree
 import org.antlr.v4.runtime.tree.TerminalNode
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.type.TypeMirror
 
 @Suppress("FunctionName")
 class QueryVisitor(
@@ -191,9 +188,9 @@
     REAL,
     BLOB;
 
-    fun getTypeMirrors(env: ProcessingEnvironment): List<TypeMirror>? {
+    fun getTypeMirrors(env: XProcessingEnv): List<XType>? {
         return when (this) {
-            TEXT -> listOf(env.requireTypeMirror("java.lang.String"))
+            TEXT -> listOf(env.requireType("java.lang.String"))
             INTEGER -> withBoxedTypes(
                 env, TypeName.INT, TypeName.BYTE, TypeName.CHAR,
                 TypeName.LONG, TypeName.SHORT
@@ -206,11 +203,11 @@
         }
     }
 
-    private fun withBoxedTypes(env: ProcessingEnvironment, vararg primitives: TypeName):
-            List<TypeMirror> {
+    private fun withBoxedTypes(env: XProcessingEnv, vararg primitives: TypeName):
+            List<XType> {
         return primitives.flatMap {
-            val primitiveType = env.requireTypeMirror(it)
-            listOf(primitiveType, primitiveType.box(env.typeUtils))
+            val primitiveType = env.requireType(it)
+            listOf(primitiveType, primitiveType.boxed())
         }
     }
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/preconditions/Checks.kt b/room/compiler/src/main/kotlin/androidx/room/preconditions/Checks.kt
index 2b496f2..9d65c60 100644
--- a/room/compiler/src/main/kotlin/androidx/room/preconditions/Checks.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/preconditions/Checks.kt
@@ -16,12 +16,11 @@
 
 package androidx.room.preconditions
 
-import androidx.room.ext.hasAnnotation
 import androidx.room.log.RLog
+import androidx.room.processing.XElement
 import com.squareup.javapoet.ParameterizedTypeName
 import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeVariableName
-import javax.lang.model.element.Element
 import kotlin.reflect.KClass
 
 /**
@@ -33,7 +32,7 @@
  */
 class Checks(private val logger: RLog) {
 
-    fun check(predicate: Boolean, element: Element, errorMsg: String, vararg args: Any): Boolean {
+    fun check(predicate: Boolean, element: XElement, errorMsg: String, vararg args: Any): Boolean {
         if (!predicate) {
             logger.e(element, errorMsg, args)
         }
@@ -41,7 +40,7 @@
     }
 
     fun hasAnnotation(
-        element: Element,
+        element: XElement,
         annotation: KClass<out Annotation>,
         errorMsg: String,
         vararg args: Any
@@ -56,7 +55,7 @@
 
     fun notUnbound(
         typeName: TypeName,
-        element: Element,
+        element: XElement,
         errorMsg: String,
         vararg args: Any
     ): Boolean {
@@ -70,7 +69,7 @@
         return !failed
     }
 
-    fun notBlank(value: String?, element: Element, msg: String, vararg args: Any): Boolean {
+    fun notBlank(value: String?, element: XElement, msg: String, vararg args: Any): Boolean {
         return check(value != null && value.isNotBlank(), element, msg, args)
     }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/Context.kt b/room/compiler/src/main/kotlin/androidx/room/processor/Context.kt
index 408b149..b9649db 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/Context.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/Context.kt
@@ -17,24 +17,22 @@
 package androidx.room.processor
 
 import androidx.room.RewriteQueriesToDropUnusedColumns
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.requireTypeMirror
 import androidx.room.log.RLog
 import androidx.room.parser.expansion.ProjectionExpander
 import androidx.room.parser.optimization.RemoveUnusedColumnQueryRewriter
 import androidx.room.preconditions.Checks
+import androidx.room.processing.XElement
+import androidx.room.processing.XProcessingEnv
+import androidx.room.processing.XType
 import androidx.room.processor.cache.Cache
 import androidx.room.solver.TypeAdapterStore
 import androidx.room.verifier.DatabaseVerifier
 import androidx.room.vo.Warning
 import java.io.File
 import java.util.LinkedHashSet
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.element.Element
-import javax.lang.model.type.TypeMirror
 
 class Context private constructor(
-    val processingEnv: ProcessingEnvironment,
+    val processingEnv: XProcessingEnv,
     val logger: RLog,
     private val typeConverters: CustomConverterProcessor.ProcessResult,
     private val inheritedAdapterStore: TypeAdapterStore?,
@@ -42,7 +40,7 @@
     private val canRewriteQueriesToDropUnusedColumns: Boolean
 ) {
     val checker: Checks = Checks(logger)
-    val COMMON_TYPES: Context.CommonTypes = Context.CommonTypes(processingEnv)
+    val COMMON_TYPES = CommonTypes(processingEnv)
 
     val typeAdapterStore by lazy {
         if (inheritedAdapterStore != null) {
@@ -87,23 +85,23 @@
         this.databaseVerifier = databaseVerifier
     }
 
-    constructor(processingEnv: ProcessingEnvironment) : this(
+    constructor(processingEnv: XProcessingEnv) : this(
             processingEnv = processingEnv,
-            logger = RLog(RLog.ProcessingEnvMessager(processingEnv), emptySet(), null),
+            logger = RLog(processingEnv.messager, emptySet(), null),
             typeConverters = CustomConverterProcessor.ProcessResult.EMPTY,
             inheritedAdapterStore = null,
             cache = Cache(null, LinkedHashSet(), emptySet()),
             canRewriteQueriesToDropUnusedColumns = false)
 
-    class CommonTypes(val processingEnv: ProcessingEnvironment) {
-        val VOID: TypeMirror by lazy {
-            processingEnv.requireTypeMirror("java.lang.Void")
+    class CommonTypes(val processingEnv: XProcessingEnv) {
+        val VOID: XType by lazy {
+            processingEnv.requireType("java.lang.Void")
         }
-        val STRING: TypeMirror by lazy {
-            processingEnv.requireTypeMirror("java.lang.String")
+        val STRING: XType by lazy {
+            processingEnv.requireType("java.lang.String")
         }
-        val COLLECTION: TypeMirror by lazy {
-            processingEnv.requireTypeMirror("java.util.Collection")
+        val COLLECTION: XType by lazy {
+            processingEnv.requireType("java.util.Collection")
         }
     }
 
@@ -129,7 +127,7 @@
         return Pair(result, collector)
     }
 
-    fun fork(element: Element, forceSuppressedWarnings: Set<Warning> = emptySet()): Context {
+    fun fork(element: XElement, forceSuppressedWarnings: Set<Warning> = emptySet()): Context {
         val suppressedWarnings = SuppressWarningProcessor.getSuppressedWarnings(element)
         val processConvertersResult = CustomConverterProcessor.findConverters(this, element)
         val canReUseAdapterStore = processConvertersResult.classes.isEmpty()
@@ -155,7 +153,7 @@
         return subContext
     }
 
-    private fun Element.hasRemoveUnusedColumnsAnnotation(): Boolean {
+    private fun XElement.hasRemoveUnusedColumnsAnnotation(): Boolean {
         return hasAnnotation(RewriteQueriesToDropUnusedColumns::class).also { annotated ->
             if (annotated && BooleanProcessorOptions.EXPAND_PROJECTION.getValue(processingEnv)) {
                 logger.w(
@@ -176,10 +174,10 @@
         EXPAND_PROJECTION("room.expandProjection", false);
 
         /**
-         * Returns the value of this option passed through the [ProcessingEnvironment]. If the value
+         * Returns the value of this option passed through the [XProcessingEnv]. If the value
          * is null or blank, it returns the default value instead.
          */
-        fun getValue(processingEnv: ProcessingEnvironment): Boolean {
+        fun getValue(processingEnv: XProcessingEnv): Boolean {
             val value = processingEnv.options[argName]
             return if (value.isNullOrBlank()) {
                 defaultValue
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/CustomConverterProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/CustomConverterProcessor.kt
index f0b3434..8a509c5 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/CustomConverterProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/CustomConverterProcessor.kt
@@ -18,16 +18,11 @@
 
 import androidx.room.TypeConverter
 import androidx.room.TypeConverters
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asMemberOf
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.getConstructors
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.isPublic
-import androidx.room.ext.isStatic
-import androidx.room.ext.toAnnotationBox
-import androidx.room.ext.typeName
-import androidx.room.kotlin.KotlinMetadataElement
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XElement
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
 import androidx.room.processor.ProcessorErrors.TYPE_CONVERTER_BAD_RETURN_TYPE
 import androidx.room.processor.ProcessorErrors.TYPE_CONVERTER_EMPTY_CLASS
 import androidx.room.processor.ProcessorErrors.TYPE_CONVERTER_MISSING_NOARG_CONSTRUCTOR
@@ -36,30 +31,20 @@
 import androidx.room.processor.ProcessorErrors.TYPE_CONVERTER_UNBOUND_GENERIC
 import androidx.room.solver.types.CustomTypeConverterWrapper
 import androidx.room.vo.CustomTypeConverter
-import asTypeElement
-import isError
-import isNone
-import isType
-import isVoid
 import java.util.LinkedHashSet
-import javax.lang.model.element.Element
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 /**
  * Processes classes that are referenced in TypeConverters annotations.
  */
-class CustomConverterProcessor(val context: Context, val element: TypeElement) {
+class CustomConverterProcessor(val context: Context, val element: XTypeElement) {
     companion object {
-        private fun TypeMirror.isInvalidReturnType() =
+        private fun XType.isInvalidReturnType() =
             isError() || isVoid() || isNone()
 
-        fun findConverters(context: Context, element: Element): ProcessResult {
+        fun findConverters(context: Context, element: XElement): ProcessResult {
             val annotation = element.toAnnotationBox(TypeConverters::class)
             return annotation?.let {
-                val classes = it.getAsTypeMirrorList("value")
+                val classes = it.getAsTypeList("value")
                     .filter { it.isType() }
                     .mapTo(LinkedHashSet()) { it }
                 val converters = classes.flatMap {
@@ -72,7 +57,7 @@
 
         private fun reportDuplicates(context: Context, converters: List<CustomTypeConverter>) {
             converters
-                .groupBy { it.from.typeName() to it.to.typeName() }
+                .groupBy { it.from.typeName to it.to.typeName }
                 .filterValues { it.size > 1 }
                 .values.forEach {
                     it.forEach { converter ->
@@ -87,7 +72,7 @@
 
     fun process(): List<CustomTypeConverter> {
         // using element utils instead of MoreElements to include statics.
-        val methods = element.getAllMethods(context.processingEnv)
+        val methods = element.getAllMethods()
         val declaredType = element.asDeclaredType()
         val converterMethods = methods.filter {
             it.hasAnnotation(TypeConverter::class)
@@ -95,8 +80,7 @@
         context.checker.check(converterMethods.isNotEmpty(), element, TYPE_CONVERTER_EMPTY_CLASS)
         val allStatic = converterMethods.all { it.isStatic() }
         val constructors = element.getConstructors()
-        val kotlinMetadata = KotlinMetadataElement.createFor(context, element)
-        val isKotlinObjectDeclaration = kotlinMetadata?.isObject() == true
+        val isKotlinObjectDeclaration = element.isKotlinObject()
         context.checker.check(
             isKotlinObjectDeclaration || allStatic || constructors.isEmpty() ||
                     constructors.any {
@@ -113,12 +97,11 @@
     }
 
     private fun processMethod(
-        container: DeclaredType,
-        methodElement: ExecutableElement,
+        container: XDeclaredType,
+        methodElement: XMethodElement,
         isContainerKotlinObject: Boolean
     ): CustomTypeConverter? {
-        val typeUtils = context.processingEnv.typeUtils
-        val asMember = methodElement.asMemberOf(typeUtils, container)
+        val asMember = methodElement.asMemberOf(container)
         val returnType = asMember.returnType
         val invalidReturnType = returnType.isInvalidReturnType()
         context.checker.check(
@@ -128,7 +111,7 @@
             context.logger.e(methodElement, TYPE_CONVERTER_BAD_RETURN_TYPE)
             return null
         }
-        val returnTypeName = returnType.typeName()
+        val returnTypeName = returnType.typeName
         context.checker.notUnbound(
             returnTypeName, methodElement,
             TYPE_CONVERTER_UNBOUND_GENERIC
@@ -139,9 +122,9 @@
             return null
         }
         val param = params.map {
-            it.asMemberOf(typeUtils, container)
+            it.asMemberOf(container)
         }.first()
-        context.checker.notUnbound(param.typeName(), params[0], TYPE_CONVERTER_UNBOUND_GENERIC)
+        context.checker.notUnbound(param.typeName, params[0], TYPE_CONVERTER_UNBOUND_GENERIC)
         return CustomTypeConverter(
             enclosingClass = container,
             isEnclosingClassKotlinObject = isContainerKotlinObject,
@@ -155,13 +138,13 @@
      * Order of classes is important hence they are a LinkedHashSet not a set.
      */
     open class ProcessResult(
-        val classes: LinkedHashSet<TypeMirror>,
+        val classes: LinkedHashSet<XType>,
         val converters: List<CustomTypeConverterWrapper>
     ) {
         object EMPTY : ProcessResult(LinkedHashSet(), emptyList())
 
         operator fun plus(other: ProcessResult): ProcessResult {
-            val newClasses = LinkedHashSet<TypeMirror>()
+            val newClasses = LinkedHashSet<XType>()
             newClasses.addAll(classes)
             newClasses.addAll(other.classes)
             return ProcessResult(newClasses, converters + other.converters)
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/DaoProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/DaoProcessor.kt
index 0badc78..db6bf1a 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/DaoProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/DaoProcessor.kt
@@ -23,27 +23,17 @@
 import androidx.room.SkipQueryVerification
 import androidx.room.Transaction
 import androidx.room.Update
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.findKotlinDefaultImpl
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.getConstructors
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.isAbstract
-import androidx.room.ext.isInterface
-import androidx.room.ext.type
-import androidx.room.ext.typeName
+import androidx.room.processing.XConstructorElement
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XTypeElement
 import androidx.room.verifier.DatabaseVerifier
 import androidx.room.vo.Dao
 import androidx.room.vo.KotlinDefaultMethodDelegate
-import isAssignableFrom
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
 
 class DaoProcessor(
     baseContext: Context,
-    val element: TypeElement,
-    val dbType: DeclaredType,
+    val element: XTypeElement,
+    val dbType: XDeclaredType,
     val dbVerifier: DatabaseVerifier?
 ) {
     val context = baseContext.fork(element)
@@ -60,11 +50,11 @@
                 element, ProcessorErrors.DAO_MUST_BE_AN_ABSTRACT_CLASS_OR_AN_INTERFACE)
 
         val declaredType = element.asDeclaredType()
-        val allMethods = element.getAllMethods(context.processingEnv)
+        val allMethods = element.getAllMethods()
         val methods = allMethods
             .filter {
                 it.isAbstract() &&
-                        it.findKotlinDefaultImpl(context.processingEnv.typeUtils) == null
+                        it.findKotlinDefaultImpl() == null
             }.groupBy { method ->
                 context.checker.check(
                         PROCESSED_ANNOTATIONS.count { method.hasAnnotation(it) } == 1, method,
@@ -144,7 +134,7 @@
             allMethods.filterNot {
                 allProcessedMethods.contains(it)
             }.mapNotNull { method ->
-                method.findKotlinDefaultImpl(context.processingEnv.typeUtils)?.let { delegate ->
+                method.findKotlinDefaultImpl()?.let { delegate ->
                     KotlinDefaultMethodDelegate(
                         element = method,
                         delegateElement = delegate
@@ -156,13 +146,12 @@
         }
 
         val constructors = element.getConstructors()
-        val typeUtils = context.processingEnv.typeUtils
         val goodConstructor = constructors.firstOrNull {
             it.parameters.size == 1 &&
-                    it.parameters[0].type.isAssignableFrom(typeUtils, dbType)
+                    it.parameters[0].type.isAssignableFrom(dbType)
         }
         val constructorParamType = if (goodConstructor != null) {
-            goodConstructor.parameters[0].type.typeName()
+            goodConstructor.parameters[0].type.typeName
         } else {
             validateEmptyConstructor(constructors)
             null
@@ -171,7 +160,7 @@
         context.checker.check(methods[Any::class] == null, element,
                 ProcessorErrors.ABSTRACT_METHOD_IN_DAO_MISSING_ANY_ANNOTATION)
 
-        val type = declaredType.typeName()
+        val type = declaredType.typeName
         context.checker.notUnbound(type, element,
                 ProcessorErrors.CANNOT_USE_UNBOUND_GENERICS_IN_DAO_CLASSES)
 
@@ -187,7 +176,7 @@
                 constructorParamType = constructorParamType)
     }
 
-    private fun validateEmptyConstructor(constructors: List<ExecutableElement>) {
+    private fun validateEmptyConstructor(constructors: List<XConstructorElement>) {
         if (constructors.isNotEmpty() && constructors.all { it.parameters.isNotEmpty() }) {
             context.logger.e(element, ProcessorErrors.daoMustHaveMatchingConstructor(
                     element.toString(), dbType.toString()))
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
index 562c8a3..20a502e 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
@@ -17,20 +17,12 @@
 package androidx.room.processor
 
 import androidx.room.SkipQueryVerification
-import androidx.room.ext.AnnotationBox
 import androidx.room.ext.RoomTypeNames
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asExecutableElement
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.isAbstract
-import androidx.room.ext.isType
-import androidx.room.ext.name
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.toAnnotationBox
-import androidx.room.ext.type
-import androidx.room.ext.typeName
+import androidx.room.processing.XAnnotationBox
+import androidx.room.processing.XElement
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
+import androidx.room.processing.isType
 import androidx.room.verifier.DatabaseVerificationErrors
 import androidx.room.verifier.DatabaseVerifier
 import androidx.room.vo.Dao
@@ -41,19 +33,14 @@
 import androidx.room.vo.FtsEntity
 import androidx.room.vo.columnNames
 import androidx.room.vo.findFieldByColumnName
-import asTypeElement
 import com.squareup.javapoet.TypeName
-import isAssignableFrom
 import java.util.Locale
-import javax.lang.model.element.Element
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.TypeMirror
 
-class DatabaseProcessor(baseContext: Context, val element: TypeElement) {
+class DatabaseProcessor(baseContext: Context, val element: XTypeElement) {
     val context = baseContext.fork(element)
 
-    val roomDatabaseType: TypeMirror by lazy {
-        context.processingEnv.requireTypeMirror(
+    val roomDatabaseType: XType by lazy {
+        context.processingEnv.requireType(
                 RoomTypeNames.ROOM_DB.packageName() + "." + RoomTypeNames.ROOM_DB.simpleName())
     }
 
@@ -73,11 +60,7 @@
         validateForeignKeys(element, entities)
         validateExternalContentFts(element, entities)
 
-        val typeUtils = context.processingEnv.typeUtils
-        val extendsRoomDb = roomDatabaseType.isAssignableFrom(
-            typeUtils,
-            element.type
-        )
+        val extendsRoomDb = roomDatabaseType.isAssignableFrom(element.type)
         context.checker.check(extendsRoomDb, element, ProcessorErrors.DB_MUST_EXTEND_ROOM_DB)
 
         val views = resolveDatabaseViews(viewsMap.values.toList())
@@ -94,15 +77,15 @@
         validateUniqueTableAndViewNames(element, entities, views)
 
         val declaredType = element.asDeclaredType()
-        val daoMethods = element.getAllMethods(context.processingEnv).filter {
+        val daoMethods = element.getAllMethods().filter {
             it.isAbstract()
         }.filterNot {
             // remove methods that belong to room
             val containing = it.enclosingElement
             containing.isType() &&
-                    containing.type.typeName() == RoomTypeNames.ROOM_DB
+                    containing.asDeclaredType().typeName == RoomTypeNames.ROOM_DB
         }.map {
-            val executable = it.asExecutableElement()
+            val executable = it.asMethodElement()
             // TODO when we add support for non Dao return types (e.g. database), this code needs
             // to change
             val daoType = executable.returnType.asTypeElement()
@@ -128,7 +111,7 @@
         return database
     }
 
-    private fun validateForeignKeys(element: TypeElement, entities: List<Entity>) {
+    private fun validateForeignKeys(element: XTypeElement, entities: List<Entity>) {
         val byTableName = entities.associateBy { it.tableName }
         entities.forEach { entity ->
             entity.foreignKeys.forEach foreignKeyLoop@{ foreignKey ->
@@ -136,7 +119,8 @@
                 if (parent == null) {
                     context.logger.e(element, ProcessorErrors
                             .foreignKeyMissingParentEntityInDatabase(foreignKey.parentTable,
-                                    entity.element.qualifiedName.toString()))
+                                entity.element.qualifiedName
+                            ))
                     return@foreignKeyLoop
                 }
                 val parentFields = foreignKey.parentColumns.mapNotNull { columnName ->
@@ -144,7 +128,7 @@
                     if (parentField == null) {
                         context.logger.e(entity.element,
                                 ProcessorErrors.foreignKeyParentColumnDoesNotExist(
-                                        parentEntity = parent.element.qualifiedName.toString(),
+                                        parentEntity = parent.element.qualifiedName,
                                         missingColumn = columnName,
                                         allColumns = parent.columnNames))
                     }
@@ -157,8 +141,8 @@
                 if (!parent.isUnique(foreignKey.parentColumns)) {
                     context.logger.e(parent.element, ProcessorErrors
                             .foreignKeyMissingIndexInParent(
-                                    parentEntity = parent.element.qualifiedName.toString(),
-                                    childEntity = entity.element.qualifiedName.toString(),
+                                    parentEntity = parent.element.qualifiedName,
+                                    childEntity = entity.element.qualifiedName,
                                     parentColumns = foreignKey.parentColumns,
                                     childColumns = foreignKey.childFields
                                             .map { it.columnName }))
@@ -168,7 +152,7 @@
         }
     }
 
-    private fun validateUniqueIndices(element: TypeElement, entities: List<Entity>) {
+    private fun validateUniqueIndices(element: XTypeElement, entities: List<Entity>) {
         entities
                 .flatMap { entity ->
                     // associate each index with its entity
@@ -187,7 +171,7 @@
     }
 
     private fun validateUniqueDaoClasses(
-        dbElement: TypeElement,
+        dbElement: XTypeElement,
         daoMethods: List<DaoMethod>,
         entities: List<Entity>
     ) {
@@ -205,7 +189,7 @@
                     }
                 }
         val check = fun(
-            element: Element,
+            element: XElement,
             dao: Dao,
             typeName: TypeName?
         ) {
@@ -213,7 +197,7 @@
                 if (!entityTypeNames.contains(typeName)) {
                     context.logger.e(element,
                             ProcessorErrors.shortcutEntityIsNotInDatabase(
-                                    database = dbElement.qualifiedName.toString(),
+                                    database = dbElement.qualifiedName,
                                     dao = dao.typeName.toString(),
                                     entity = typeName.toString()
                             ))
@@ -235,7 +219,7 @@
     }
 
     private fun validateUniqueTableAndViewNames(
-        dbElement: TypeElement,
+        dbElement: XTypeElement,
         entities: List<Entity>,
         views: List<DatabaseView>
     ) {
@@ -260,7 +244,7 @@
                 }
     }
 
-    private fun validateExternalContentFts(dbElement: TypeElement, entities: List<Entity>) {
+    private fun validateExternalContentFts(dbElement: XTypeElement, entities: List<Entity>) {
         // Validate FTS external content entities are present in the same database.
         entities.filterIsInstance(FtsEntity::class.java)
                 .filterNot {
@@ -270,16 +254,17 @@
                 .forEach {
                     context.logger.e(dbElement,
                             ProcessorErrors.missingExternalContentEntity(
-                                    it.element.qualifiedName.toString(),
-                                    it.ftsOptions.contentEntity!!.element.qualifiedName.toString()))
+                                it.element.qualifiedName,
+                                it.ftsOptions.contentEntity!!.element.qualifiedName
+                            ))
                 }
     }
 
     private fun processEntities(
-        dbAnnotation: AnnotationBox<androidx.room.Database>,
-        element: TypeElement
+        dbAnnotation: XAnnotationBox<androidx.room.Database>,
+        element: XTypeElement
     ): List<Entity> {
-        val entityList = dbAnnotation.getAsTypeMirrorList("entities")
+        val entityList = dbAnnotation.getAsTypeList("entities")
         context.checker.check(entityList.isNotEmpty(), element,
                 ProcessorErrors.DATABASE_ANNOTATION_MUST_HAVE_LIST_OF_ENTITIES)
         return entityList.map {
@@ -288,9 +273,9 @@
     }
 
     private fun processDatabaseViews(
-        dbAnnotation: AnnotationBox<androidx.room.Database>
-    ): Map<TypeElement, DatabaseView> {
-        val viewList = dbAnnotation.getAsTypeMirrorList("views")
+        dbAnnotation: XAnnotationBox<androidx.room.Database>
+    ): Map<XTypeElement, DatabaseView> {
+        val viewList = dbAnnotation.getAsTypeList("views")
         return viewList.map {
             val viewElement = it.asTypeElement()
             viewElement to DatabaseViewProcessor(context, viewElement).process()
@@ -298,7 +283,7 @@
     }
 
     private fun verifyDatabaseViews(
-        map: Map<TypeElement, DatabaseView>,
+        map: Map<XTypeElement, DatabaseView>,
         dbVerifier: DatabaseVerifier
     ) {
         for ((viewElement, view) in map) {
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseViewProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseViewProcessor.kt
index 9fbc3c9..a18cb90 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseViewProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseViewProcessor.kt
@@ -16,17 +16,15 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.name
-import androidx.room.ext.toAnnotationBox
 import androidx.room.parser.ParsedQuery
 import androidx.room.parser.QueryType
 import androidx.room.parser.SqlParser
+import androidx.room.processing.XTypeElement
 import androidx.room.vo.DatabaseView
-import javax.lang.model.element.TypeElement
 
 class DatabaseViewProcessor(
     baseContext: Context,
-    val element: TypeElement,
+    val element: XTypeElement,
     private val referenceStack: LinkedHashSet<String> = LinkedHashSet()
 ) : EntityOrViewProcessor {
 
@@ -79,7 +77,7 @@
 
     companion object {
         fun extractViewName(
-            element: TypeElement,
+            element: XTypeElement,
             annotation: androidx.room.DatabaseView
         ): String {
             return if (annotation.viewName == "") {
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/DeletionMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/DeletionMethodProcessor.kt
index 89968fa..592345c 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/DeletionMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/DeletionMethodProcessor.kt
@@ -16,15 +16,14 @@
 package androidx.room.processor
 
 import androidx.room.Delete
-import androidx.room.ext.name
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
 import androidx.room.vo.DeletionMethod
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
 
 class DeletionMethodProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val executableElement: ExecutableElement
+    val containing: XDeclaredType,
+    val executableElement: XMethodElement
 ) {
     val context = baseContext.fork(executableElement)
 
@@ -44,7 +43,7 @@
         )
 
         val (entities, params) = delegate.extractParams(
-            targetEntityType = annotation?.getAsTypeMirror("entity"),
+            targetEntityType = annotation?.getAsType("entity"),
             missingParamError = ProcessorErrors.DELETION_MISSING_PARAMS,
             onValidatePartialEntity = { _, _ -> }
         )
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/EntityOrViewProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/EntityOrViewProcessor.kt
index 20e9590..002e5029 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/EntityOrViewProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/EntityOrViewProcessor.kt
@@ -18,13 +18,10 @@
 
 import androidx.room.DatabaseView
 import androidx.room.Entity
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.type
-import androidx.room.ext.typeName
+import androidx.room.processing.XTypeElement
 import androidx.room.vo.EntityOrView
 import androidx.room.vo.Fields
 import com.squareup.javapoet.TypeName
-import javax.lang.model.element.TypeElement
 
 interface EntityOrViewProcessor {
     fun process(): EntityOrView
@@ -36,7 +33,7 @@
  */
 private class NonEntityOrViewProcessor(
     val context: Context,
-    val element: TypeElement,
+    val element: XTypeElement,
     private val referenceStack: LinkedHashSet<String>
 ) : EntityOrViewProcessor {
 
@@ -54,7 +51,7 @@
             override val tableName: String
                 get() = typeName.toString()
             override val typeName: TypeName
-                get() = element.type.typeName()
+                get() = element.type.typeName
         }
     }
 }
@@ -62,7 +59,7 @@
 @Suppress("FunctionName")
 fun EntityOrViewProcessor(
     context: Context,
-    element: TypeElement,
+    element: XTypeElement,
     referenceStack: LinkedHashSet<String> = LinkedHashSet()
 ): EntityOrViewProcessor {
     return when {
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/EntityProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/EntityProcessor.kt
index 390e29b..95577a8 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/EntityProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/EntityProcessor.kt
@@ -20,19 +20,17 @@
 import androidx.room.ForeignKey
 import androidx.room.Fts3
 import androidx.room.Fts4
-import androidx.room.ext.AnnotationBox
-import androidx.room.ext.hasAnyOf
-import androidx.room.ext.name
+import androidx.room.processing.XAnnotationBox
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
 import androidx.room.vo.ForeignKeyAction
 import androidx.room.vo.Index
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.TypeMirror
 
 interface EntityProcessor : EntityOrViewProcessor {
     override fun process(): androidx.room.vo.Entity
 
     companion object {
-        fun extractTableName(element: TypeElement, annotation: Entity): String {
+        fun extractTableName(element: XTypeElement, annotation: Entity): String {
             return if (annotation.tableName == "") {
                 element.name
             } else {
@@ -40,7 +38,10 @@
             }
         }
 
-        fun extractIndices(annotation: AnnotationBox<Entity>, tableName: String): List<IndexInput> {
+        fun extractIndices(
+            annotation: XAnnotationBox<Entity>,
+            tableName: String
+        ): List<IndexInput> {
             return annotation.getAsAnnotationBoxArray<androidx.room.Index>("indices").map {
                 val indexAnnotation = it.value
                 val nameValue = indexAnnotation.name
@@ -57,11 +58,11 @@
             return Index.DEFAULT_PREFIX + tableName + "_" + columnNames.joinToString("_")
         }
 
-        fun extractForeignKeys(annotation: AnnotationBox<Entity>): List<ForeignKeyInput> {
+        fun extractForeignKeys(annotation: XAnnotationBox<Entity>): List<ForeignKeyInput> {
             return annotation.getAsAnnotationBoxArray<ForeignKey>("foreignKeys")
                     .mapNotNull { annotationBox ->
                 val foreignKey = annotationBox.value
-                val parent = annotationBox.getAsTypeMirror("entity")
+                val parent = annotationBox.getAsType("entity")
                 if (parent != null) {
                     ForeignKeyInput(
                             parent = parent,
@@ -87,7 +88,7 @@
  * ForeignKey, before it is processed in the context of a database.
  */
 data class ForeignKeyInput(
-    val parent: TypeMirror,
+    val parent: XType,
     val parentColumns: List<String>,
     val childColumns: List<String>,
     val onDelete: ForeignKeyAction?,
@@ -97,7 +98,7 @@
 
 fun EntityProcessor(
     context: Context,
-    element: TypeElement,
+    element: XTypeElement,
     referenceStack: LinkedHashSet<String> = LinkedHashSet()
 ): EntityProcessor {
     return if (element.hasAnyOf(Fts3::class, Fts4::class)) {
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt
index e13dcd5..227048f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt
@@ -17,33 +17,26 @@
 package androidx.room.processor
 
 import androidx.room.ColumnInfo
-import androidx.room.ext.asMemberOf
-import androidx.room.ext.name
-import androidx.room.ext.toAnnotationBox
-import androidx.room.ext.typeName
 import androidx.room.parser.Collate
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XVariableElement
 import androidx.room.vo.EmbeddedField
 import androidx.room.vo.Field
 import java.util.Locale
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.DeclaredType
 
 class FieldProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val element: VariableElement,
+    val containing: XDeclaredType,
+    val element: XVariableElement,
     val bindingScope: BindingScope,
     val fieldParent: EmbeddedField?, // pass only if this is processed as a child of Embedded field
     val onBindingError: (field: Field, errorMsg: String) -> Unit
 ) {
     val context = baseContext.fork(element)
     fun process(): Field {
-        val member = element.asMemberOf(
-            context.processingEnv.typeUtils,
-            containing
-        )
-        val type = member.typeName()
+        val member = element.asMemberOf(containing)
+        val type = member.typeName
         val columnInfo = element.toAnnotationBox(ColumnInfo::class)?.value
         val name = element.name
         val rawCName = if (columnInfo != null && columnInfo.name != ColumnInfo.INHERIT_FIELD_NAME) {
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/FtsTableEntityProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/FtsTableEntityProcessor.kt
index ed4b492..e35ef3e 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/FtsTableEntityProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/FtsTableEntityProcessor.kt
@@ -20,13 +20,11 @@
 import androidx.room.Fts4
 import androidx.room.FtsOptions.MatchInfo
 import androidx.room.FtsOptions.Order
-import androidx.room.ext.AnnotationBox
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.name
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.toAnnotationBox
 import androidx.room.parser.FtsVersion
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XAnnotationBox
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
 import androidx.room.processor.EntityProcessor.Companion.extractForeignKeys
 import androidx.room.processor.EntityProcessor.Companion.extractIndices
 import androidx.room.processor.EntityProcessor.Companion.extractTableName
@@ -39,23 +37,19 @@
 import androidx.room.vo.LanguageId
 import androidx.room.vo.PrimaryKey
 import androidx.room.vo.columnNames
-import asTypeElement
-import isSameType
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.TypeMirror
 
 class FtsTableEntityProcessor internal constructor(
     baseContext: Context,
-    val element: TypeElement,
+    val element: XTypeElement,
     private val referenceStack: LinkedHashSet<String> = LinkedHashSet()
 ) : EntityProcessor {
 
     val context = baseContext.fork(element)
 
-    override fun process(): androidx.room.vo.FtsEntity {
+    override fun process(): FtsEntity {
         return context.cache.entities.get(Cache.EntityKey(element)) {
             doProcess()
-        } as androidx.room.vo.FtsEntity
+        } as FtsEntity
     }
 
     private fun doProcess(): FtsEntity {
@@ -129,7 +123,7 @@
         return entity
     }
 
-    private fun getFts3Options(annotation: AnnotationBox<Fts3>) =
+    private fun getFts3Options(annotation: XAnnotationBox<Fts3>) =
         FtsOptions(
             tokenizer = annotation.value.tokenizer,
             tokenizerArgs = annotation.value.tokenizerArgs.asList(),
@@ -140,8 +134,8 @@
             prefixSizes = emptyList(),
             preferredOrder = Order.ASC)
 
-    private fun getFts4Options(annotation: AnnotationBox<Fts4>): FtsOptions {
-        val contentEntity: Entity? = getContentEntity(annotation.getAsTypeMirror("contentEntity"))
+    private fun getFts4Options(annotation: XAnnotationBox<Fts4>): FtsOptions {
+        val contentEntity: Entity? = getContentEntity(annotation.getAsType("contentEntity"))
         return FtsOptions(
                 tokenizer = annotation.value.tokenizer,
                 tokenizerArgs = annotation.value.tokenizerArgs.asList(),
@@ -153,14 +147,14 @@
                 preferredOrder = annotation.value.order)
     }
 
-    private fun getContentEntity(entityType: TypeMirror?): Entity? {
+    private fun getContentEntity(entityType: XType?): Entity? {
         if (entityType == null) {
             context.logger.e(element, ProcessorErrors.FTS_EXTERNAL_CONTENT_CANNOT_FIND_ENTITY)
             return null
         }
 
-        val defaultType = context.processingEnv.requireTypeMirror(Object::class)
-        if (entityType.isSameType(context.processingEnv.typeUtils, defaultType)) {
+        val defaultType = context.processingEnv.requireType(Object::class)
+        if (entityType.isSameType(defaultType)) {
             return null
         }
         val contentEntityElement = entityType.asTypeElement()
@@ -173,7 +167,7 @@
     }
 
     private fun findAndValidatePrimaryKey(
-        entityAnnotation: AnnotationBox<androidx.room.Entity>?,
+        entityAnnotation: XAnnotationBox<androidx.room.Entity>?,
         fields: List<Field>
     ): PrimaryKey {
         val keysFromEntityAnnotation =
@@ -231,8 +225,9 @@
             contentEntity.fields.any { contentField -> contentField.columnName == it.columnName }
         }.forEach {
             context.logger.e(it.element, ProcessorErrors.missingFtsContentField(
-                    element.qualifiedName.toString(), it.columnName,
-                    contentEntity.element.qualifiedName.toString()))
+                element.qualifiedName, it.columnName,
+                contentEntity.element.qualifiedName
+            ))
         }
     }
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/InsertionMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/InsertionMethodProcessor.kt
index 802d158..2dbaa99 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/InsertionMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/InsertionMethodProcessor.kt
@@ -21,17 +21,15 @@
 import androidx.room.Insert
 import androidx.room.OnConflictStrategy.IGNORE
 import androidx.room.OnConflictStrategy.REPLACE
-import androidx.room.ext.name
-import androidx.room.ext.typeName
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
 import androidx.room.vo.InsertionMethod
 import androidx.room.vo.findFieldByColumnName
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
 
 class InsertionMethodProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val executableElement: ExecutableElement
+    val containing: XDeclaredType,
+    val executableElement: XMethodElement
 ) {
     val context = baseContext.fork(executableElement)
     fun process(): InsertionMethod {
@@ -44,12 +42,12 @@
                 executableElement, ProcessorErrors.INVALID_ON_CONFLICT_VALUE)
 
         val returnType = delegate.extractReturnType()
-        val returnTypeName = returnType.typeName()
+        val returnTypeName = returnType.typeName
         context.checker.notUnbound(returnTypeName, executableElement,
                 ProcessorErrors.CANNOT_USE_UNBOUND_GENERICS_IN_INSERTION_METHODS)
 
         val (entities, params) = delegate.extractParams(
-            targetEntityType = annotation?.getAsTypeMirror("entity"),
+            targetEntityType = annotation?.getAsType("entity"),
             missingParamError = ProcessorErrors.INSERTION_DOES_NOT_HAVE_ANY_PARAMETERS_TO_INSERT,
             onValidatePartialEntity = { entity, pojo ->
                 val missingPrimaryKeys = entity.primaryKey.fields.any {
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/MethodProcessorDelegate.kt b/room/compiler/src/main/kotlin/androidx/room/processor/MethodProcessorDelegate.kt
index c1daa46..cebb293 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/MethodProcessorDelegate.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/MethodProcessorDelegate.kt
@@ -21,14 +21,11 @@
 import androidx.room.ext.N
 import androidx.room.ext.RoomCoroutinesTypeNames
 import androidx.room.ext.T
-import androidx.room.ext.asMemberOf
-import androidx.room.ext.findTypeElement
-import androidx.room.ext.getSuspendFunctionReturnType
-import androidx.room.ext.name
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.type
-import androidx.room.kotlin.KotlinMetadataElement
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
+import androidx.room.processing.XVariableElement
 import androidx.room.solver.prepared.binder.CallablePreparedQueryResultBinder.Companion.createPreparedBinder
 import androidx.room.solver.prepared.binder.PreparedQueryResultBinder
 import androidx.room.solver.query.result.CoroutineResultBinder
@@ -44,52 +41,44 @@
 import androidx.room.vo.QueryParameter
 import androidx.room.vo.ShortcutQueryParameter
 import androidx.room.vo.TransactionMethod
-import erasure
-import isSameType
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 /**
  *  Delegate class with common functionality for DAO method processors.
  */
 abstract class MethodProcessorDelegate(
     val context: Context,
-    val containing: DeclaredType,
-    val executableElement: ExecutableElement,
-    protected val classMetadata: KotlinMetadataElement?
+    val containing: XDeclaredType,
+    val executableElement: XMethodElement
 ) {
 
-    abstract fun extractReturnType(): TypeMirror
+    abstract fun extractReturnType(): XType
 
-    abstract fun extractParams(): List<VariableElement>
+    abstract fun extractParams(): List<XVariableElement>
 
     fun extractQueryParams(): List<QueryParameter> {
-        val kotlinParameterNames = classMetadata?.getParameterNames(executableElement)
-        return extractParams().mapIndexed { index, variableElement ->
+        return extractParams().map { variableElement ->
             QueryParameterProcessor(
                 baseContext = context,
                 containing = containing,
                 element = variableElement,
-                sqlName = kotlinParameterNames?.getOrNull(index)
+                sqlName = variableElement.name
             ).process()
         }
     }
 
-    abstract fun findResultBinder(returnType: TypeMirror, query: ParsedQuery): QueryResultBinder
+    abstract fun findResultBinder(returnType: XType, query: ParsedQuery): QueryResultBinder
 
     abstract fun findPreparedResultBinder(
-        returnType: TypeMirror,
+        returnType: XType,
         query: ParsedQuery
     ): PreparedQueryResultBinder
 
     abstract fun findInsertMethodBinder(
-        returnType: TypeMirror,
+        returnType: XType,
         params: List<ShortcutQueryParameter>
     ): InsertMethodBinder
 
-    abstract fun findDeleteOrUpdateMethodBinder(returnType: TypeMirror): DeleteOrUpdateMethodBinder
+    abstract fun findDeleteOrUpdateMethodBinder(returnType: XType): DeleteOrUpdateMethodBinder
 
     abstract fun findTransactionMethodBinder(
         callType: TransactionMethod.CallType
@@ -98,12 +87,10 @@
     companion object {
         fun createFor(
             context: Context,
-            containing: DeclaredType,
-            executableElement: ExecutableElement
+            containing: XDeclaredType,
+            executableElement: XMethodElement
         ): MethodProcessorDelegate {
-            val kotlinMetadata =
-                KotlinMetadataElement.createFor(context, executableElement.enclosingElement)
-            return if (kotlinMetadata?.isSuspendFunction(executableElement) == true) {
+            return if (executableElement.isSuspendFunction()) {
                 val hasCoroutineArtifact = context.processingEnv
                     .findTypeElement(RoomCoroutinesTypeNames.COROUTINES_ROOM.toString()) != null
                 if (!hasCoroutineArtifact) {
@@ -112,15 +99,13 @@
                 SuspendMethodProcessorDelegate(
                     context,
                     containing,
-                    executableElement,
-                    kotlinMetadata
+                    executableElement
                 )
             } else {
                 DefaultMethodProcessorDelegate(
                     context,
                     containing,
-                    executableElement,
-                    kotlinMetadata
+                    executableElement
                 )
             }
         }
@@ -132,35 +117,31 @@
  */
 class DefaultMethodProcessorDelegate(
     context: Context,
-    containing: DeclaredType,
-    executableElement: ExecutableElement,
-    classMetadata: KotlinMetadataElement?
-) : MethodProcessorDelegate(context, containing, executableElement, classMetadata) {
+    containing: XDeclaredType,
+    executableElement: XMethodElement
+) : MethodProcessorDelegate(context, containing, executableElement) {
 
-    override fun extractReturnType(): TypeMirror {
-        val asMember = executableElement.asMemberOf(
-            context.processingEnv.typeUtils,
-            containing
-        )
+    override fun extractReturnType(): XType {
+        val asMember = executableElement.asMemberOf(containing)
         return asMember.returnType
     }
 
     override fun extractParams() = executableElement.parameters
 
-    override fun findResultBinder(returnType: TypeMirror, query: ParsedQuery) =
+    override fun findResultBinder(returnType: XType, query: ParsedQuery) =
         context.typeAdapterStore.findQueryResultBinder(returnType, query)
 
     override fun findPreparedResultBinder(
-        returnType: TypeMirror,
+        returnType: XType,
         query: ParsedQuery
     ) = context.typeAdapterStore.findPreparedQueryResultBinder(returnType, query)
 
     override fun findInsertMethodBinder(
-        returnType: TypeMirror,
+        returnType: XType,
         params: List<ShortcutQueryParameter>
     ) = context.typeAdapterStore.findInsertMethodBinder(returnType, params)
 
-    override fun findDeleteOrUpdateMethodBinder(returnType: TypeMirror) =
+    override fun findDeleteOrUpdateMethodBinder(returnType: XType) =
         context.typeAdapterStore.findDeleteOrUpdateMethodBinder(returnType)
 
     override fun findTransactionMethodBinder(callType: TransactionMethod.CallType) =
@@ -173,32 +154,29 @@
  */
 class SuspendMethodProcessorDelegate(
     context: Context,
-    containing: DeclaredType,
-    executableElement: ExecutableElement,
-    kotlinMetadata: KotlinMetadataElement
-) : MethodProcessorDelegate(context, containing, executableElement, kotlinMetadata) {
+    containing: XDeclaredType,
+    executableElement: XMethodElement
+) : MethodProcessorDelegate(context, containing, executableElement) {
 
-    private val continuationParam: VariableElement by lazy {
-        val typesUtil = context.processingEnv.typeUtils
+    private val continuationParam: XVariableElement by lazy {
         val continuationType = context.processingEnv
-            .requireTypeMirror(KotlinTypeNames.CONTINUATION.toString()).erasure(typesUtil)
+            .requireType(KotlinTypeNames.CONTINUATION.toString()).erasure()
         executableElement.parameters.last {
-            it.type.erasure(typesUtil).isSameType(typesUtil, continuationType)
+            it.type.erasure().isSameType(continuationType)
         }
     }
 
-    override fun extractReturnType(): TypeMirror {
-        val asMember = executableElement.asMemberOf(
-            context.processingEnv.typeUtils,
-            containing
-        )
+    override fun extractReturnType(): XType {
+        val asMember = executableElement.asMemberOf(containing)
         return asMember.getSuspendFunctionReturnType()
     }
 
     override fun extractParams() =
-        executableElement.parameters.filterNot { it == continuationParam }
+        executableElement.parameters.filterNot {
+            it == continuationParam
+        }
 
-    override fun findResultBinder(returnType: TypeMirror, query: ParsedQuery) =
+    override fun findResultBinder(returnType: XType, query: ParsedQuery) =
         CoroutineResultBinder(
             typeArg = returnType,
             adapter = context.typeAdapterStore.findQueryResultAdapter(returnType, query),
@@ -206,7 +184,7 @@
         )
 
     override fun findPreparedResultBinder(
-        returnType: TypeMirror,
+        returnType: XType,
         query: ParsedQuery
     ) = createPreparedBinder(
         returnType = returnType,
@@ -223,7 +201,7 @@
     }
 
     override fun findInsertMethodBinder(
-        returnType: TypeMirror,
+        returnType: XType,
         params: List<ShortcutQueryParameter>
     ) = createInsertBinder(
         typeArg = returnType,
@@ -239,7 +217,7 @@
         )
     }
 
-    override fun findDeleteOrUpdateMethodBinder(returnType: TypeMirror) =
+    override fun findDeleteOrUpdateMethodBinder(returnType: XType) =
         createDeleteOrUpdateBinder(
             typeArg = returnType,
             adapter = context.typeAdapterStore.findDeleteOrUpdateAdapter(returnType)
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/PojoMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/PojoMethodProcessor.kt
index e2b5db7..43c708a 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/PojoMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/PojoMethodProcessor.kt
@@ -16,25 +16,20 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.asMemberOf
-import androidx.room.ext.name
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
 import androidx.room.vo.PojoMethod
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
 
 /**
  * processes an executable element as member of the owning class
  */
 class PojoMethodProcessor(
     private val context: Context,
-    private val element: ExecutableElement,
-    private val owner: DeclaredType
+    private val element: XMethodElement,
+    private val owner: XDeclaredType
 ) {
     fun process(): PojoMethod {
-        val asMember = element.asMemberOf(
-            context.processingEnv.typeUtils,
-            owner
-        )
+        val asMember = element.asMemberOf(owner)
         return PojoMethod(
                 element = element,
                 resolvedType = asMember,
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/PojoProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/PojoProcessor.kt
index 768d4e2..a1ffaa7 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/PojoProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/PojoProcessor.kt
@@ -22,30 +22,13 @@
 import androidx.room.Junction
 import androidx.room.PrimaryKey
 import androidx.room.Relation
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asMemberOf
-import androidx.room.ext.extendsBoundOrSelf
-import androidx.room.ext.findTypeElement
-import androidx.room.ext.getAllFieldsIncludingPrivateSupers
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.getAllNonPrivateInstanceMethods
-import androidx.room.ext.getConstructors
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.hasAnyOf
-import androidx.room.ext.isAbstract
-import androidx.room.ext.isAssignableFromWithoutVariance
-import androidx.room.ext.isCollection
-import androidx.room.ext.isPrivate
-import androidx.room.ext.isPublic
-import androidx.room.ext.isStatic
-import androidx.room.ext.isTransient
-import androidx.room.ext.kindName
-import androidx.room.ext.name
-import androidx.room.ext.toAnnotationBox
-import androidx.room.ext.type
-import androidx.room.ext.typeName
-import androidx.room.kotlin.KotlinMetadataElement
-import androidx.room.kotlin.descriptor
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XExecutableElement
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
+import androidx.room.processing.XVariableElement
+import androidx.room.processing.asDeclaredType
+import androidx.room.processing.isCollection
 import androidx.room.processor.ProcessorErrors.CANNOT_FIND_GETTER_FOR_FIELD
 import androidx.room.processor.ProcessorErrors.CANNOT_FIND_SETTER_FOR_FIELD
 import androidx.room.processor.ProcessorErrors.POJO_FIELD_HAS_DUPLICATE_COLUMN_NAME
@@ -64,26 +47,14 @@
 import androidx.room.vo.Warning
 import androidx.room.vo.columnNames
 import androidx.room.vo.findFieldByColumnName
-import asDeclaredType
-import asTypeElement
 import com.google.auto.value.AutoValue
-import isError
-import isNotVoid
-import isSameType
-import isTypeOf
-import isVoid
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 /**
  * Processes any class as if it is a Pojo.
  */
 class PojoProcessor private constructor(
     baseContext: Context,
-    val element: TypeElement,
+    val element: XTypeElement,
     val bindingScope: FieldProcessor.BindingScope,
     val parent: EmbeddedField?,
     val referenceStack: LinkedHashSet<String> = LinkedHashSet(),
@@ -91,8 +62,6 @@
 ) {
     val context = baseContext.fork(element)
 
-    private val kotlinMetadata = KotlinMetadataElement.createFor(context, element)
-
     companion object {
         val PROCESSED_ANNOTATIONS = listOf(ColumnInfo::class, Embedded::class, Relation::class)
 
@@ -101,7 +70,7 @@
 
         fun createFor(
             context: Context,
-            element: TypeElement,
+            element: XTypeElement,
             bindingScope: FieldProcessor.BindingScope,
             parent: EmbeddedField?,
             referenceStack: LinkedHashSet<String> = LinkedHashSet()
@@ -129,11 +98,11 @@
 
     fun process(): Pojo {
         return context.cache.pojos.get(Cache.PojoKey(element, bindingScope, parent)) {
-            referenceStack.add(element.qualifiedName.toString())
+            referenceStack.add(element.qualifiedName)
             try {
                 doProcess()
             } finally {
-                referenceStack.remove(element.qualifiedName.toString())
+                referenceStack.remove(element.qualifiedName)
             }
         }
     }
@@ -143,7 +112,7 @@
 
         val declaredType = element.asDeclaredType()
         // TODO handle conflicts with super: b/35568142
-        val allFields = element.getAllFieldsIncludingPrivateSupers(context.processingEnv)
+        val allFields = element.getAllFieldsIncludingPrivateSupers()
                 .filter {
                     !it.hasAnnotation(Ignore::class) &&
                             !it.isStatic() &&
@@ -228,7 +197,7 @@
                     }
                 }
 
-        val methods = element.getAllNonPrivateInstanceMethods(context.processingEnv)
+        val methods = element.getAllNonPrivateInstanceMethods()
             .asSequence()
             .filter {
                 !it.isAbstract() && !it.hasAnnotation(Ignore::class)
@@ -273,23 +242,6 @@
                 constructor)
     }
 
-    /**
-     * Retrieves the parameter names of a method. If the method is inherited from a dependency
-     * module, the parameter name is not available (not in java spec). For kotlin, since parameter
-     * names are part of the API, we can read them via the kotlin metadata annotation.
-     * <p>
-     * Since we are using an unofficial library to read the metadata, all access to that code
-     * is safe guarded to avoid unexpected failures. In other words, it is a best effort but
-     * better than not supporting these until JB provides a proper API.
-     */
-    private fun getParamNames(method: ExecutableElement): List<String> {
-        val paramNames = method.parameters.map { it.name }
-        if (paramNames.isEmpty()) {
-            return emptyList()
-        }
-        return kotlinMetadata?.getParameterNames(method) ?: paramNames
-    }
-
     private fun chooseConstructor(
         myFields: List<Field>,
         embedded: List<EmbeddedField>,
@@ -299,11 +251,10 @@
         val fieldMap = myFields.associateBy { it.name }
         val embeddedMap = embedded.associateBy { it.field.name }
         val relationMap = relations.associateBy { it.field.name }
-        val typeUtils = context.processingEnv.typeUtils
         // list of param names -> matched params pairs for each failed constructor
         val failedConstructors = arrayListOf<FailedConstructor>()
         val goodConstructors = constructors.map { constructor ->
-            val parameterNames = getParamNames(constructor)
+            val parameterNames = constructor.parameters.map { it.name }
             val params = constructor.parameters.mapIndexed param@{ index, param ->
                 val paramName = parameterNames[index]
                 val paramType = param.type
@@ -315,7 +266,7 @@
                         false
                     } else {
                         // see: b/69164099
-                        field.type.isAssignableFromWithoutVariance(typeUtils, paramType)
+                        field.type.isAssignableFromWithoutVariance(paramType)
                     }
                 }
 
@@ -353,7 +304,7 @@
                     }
                     else -> {
                         context.logger.e(param, ProcessorErrors.ambigiousConstructor(
-                                pojo = element.qualifiedName.toString(),
+                                pojo = element.qualifiedName,
                                 paramName = paramName,
                                 matchingFields = matchingFields.map { it.getPath() } +
                                         embeddedMatches.map { it.field.getPath() } +
@@ -389,11 +340,11 @@
                 // better than picking the no-arg constructor and forcing users to define fields as
                 // vars.
                 val primaryConstructor =
-                    kotlinMetadata?.findPrimaryConstructorSignature()?.let { signature ->
-                        goodConstructors.firstOrNull {
-                            it.element.descriptor() == signature
+                    element.findPrimaryConstructor()?.let { primary ->
+                        goodConstructors.firstOrNull { candidate ->
+                            candidate.element == primary
+                        }
                     }
-                }
                 if (primaryConstructor != null) {
                     return primaryConstructor
                 }
@@ -401,8 +352,10 @@
                 // with kotlin data classes.
                 val noArg = goodConstructors.firstOrNull { it.params.isEmpty() }
                 if (noArg != null) {
-                    context.logger.w(Warning.DEFAULT_CONSTRUCTOR, element,
-                            ProcessorErrors.TOO_MANY_POJO_CONSTRUCTORS_CHOOSING_NO_ARG)
+                    context.logger.w(
+                        Warning.DEFAULT_CONSTRUCTOR, element,
+                        ProcessorErrors.TOO_MANY_POJO_CONSTRUCTORS_CHOOSING_NO_ARG
+                    )
                     return noArg
                 }
                 goodConstructors.forEach {
@@ -415,11 +368,10 @@
     }
 
     private fun processEmbeddedField(
-        declaredType: DeclaredType,
-        variableElement: VariableElement
+        declaredType: XDeclaredType,
+        variableElement: XVariableElement
     ): EmbeddedField? {
-        val asMemberType = variableElement.asMemberOf(
-            context.processingEnv.typeUtils, declaredType)
+        val asMemberType = variableElement.asMemberOf(declaredType)
         val asTypeElement = asMemberType.asTypeElement()
 
         if (detectReferenceRecursion(asTypeElement)) {
@@ -438,7 +390,7 @@
                 field = embeddedField,
                 prefix = inheritedPrefix + fieldPrefix,
                 parent = parent)
-        subParent.pojo = PojoProcessor.createFor(
+        subParent.pojo = createFor(
                 context = context.fork(variableElement),
                 element = asTypeElement,
                 bindingScope = bindingScope,
@@ -449,8 +401,8 @@
 
     private fun processRelationField(
         myFields: List<Field>,
-        container: DeclaredType?,
-        relationElement: VariableElement
+        container: XDeclaredType?,
+        relationElement: XVariableElement
     ): androidx.room.vo.Relation? {
         val annotation = relationElement.toAnnotationBox(Relation::class)!!
 
@@ -460,16 +412,13 @@
         if (parentField == null) {
             context.logger.e(relationElement,
                     ProcessorErrors.relationCannotFindParentEntityField(
-                            entityName = element.qualifiedName.toString(),
+                            entityName = element.qualifiedName,
                             columnName = annotation.value.parentColumn,
                             availableColumns = myFields.map { it.columnName }))
             return null
         }
         // parse it as an entity.
-        val asMember = relationElement.asMemberOf(
-            context.processingEnv.typeUtils,
-            container
-        )
+        val asMember = relationElement.asMemberOf(container!!)
         if (asMember.isError()) {
             context.logger.e(ProcessorErrors.CANNOT_FIND_TYPE, element)
             return null
@@ -485,7 +434,7 @@
             return null
         }
         val typeElement = asType.asTypeElement()
-        val entityClassInput = annotation.getAsTypeMirror("entity")
+        val entityClassInput = annotation.getAsType("entity")
 
         // do we need to decide on the entity?
         val inferEntity = (entityClassInput == null || entityClassInput.isTypeOf(Any::class))
@@ -514,8 +463,8 @@
 
         // do we have a join entity?
         val junctionAnnotation = annotation.getAsAnnotationBox<Junction>("associateBy")
-        val junctionClassInput = junctionAnnotation.getAsTypeMirror("value")
-        val junctionElement: TypeElement? = if (junctionClassInput != null &&
+        val junctionClassInput = junctionAnnotation.getAsType("value")
+        val junctionElement: XTypeElement? = if (junctionClassInput != null &&
                 !junctionClassInput.isTypeOf(Any::class)) {
             junctionClassInput.asTypeElement()
         } else {
@@ -591,10 +540,7 @@
         val field = Field(
                 element = relationElement,
                 name = relationElement.name,
-                type = relationElement.asMemberOf(
-                    context.processingEnv.typeUtils,
-                    container
-                ),
+                type = relationElement.asMemberOf(container),
                 affinity = null,
                 parent = parent)
 
@@ -621,7 +567,7 @@
     private fun validateRelationshipProjection(
         projectionInput: Array<String>,
         entity: EntityOrView,
-        relationElement: VariableElement
+        relationElement: XVariableElement
     ) {
         val missingColumns = projectionInput.toList() - entity.columnNames
         if (missingColumns.isNotEmpty()) {
@@ -642,12 +588,12 @@
      */
     private fun createRelationshipProjection(
         inferEntity: Boolean,
-        typeArg: TypeMirror,
+        typeArg: XType,
         entity: EntityOrView,
         entityField: Field,
-        typeArgElement: TypeElement
+        typeArgElement: XTypeElement
     ): List<String> {
-        return if (inferEntity || typeArg.typeName() == entity.typeName) {
+        return if (inferEntity || typeArg.typeName == entity.typeName) {
             entity.columnNames
         } else {
             val columnAdapter = context.typeAdapterStore.findCursorValueReader(typeArg, null)
@@ -656,7 +602,7 @@
                 listOf(entityField.name)
             } else {
                 // last resort, it needs to be a pojo
-                val pojo = PojoProcessor.createFor(
+                val pojo = createFor(
                         context = context,
                         element = typeArgElement,
                         bindingScope = FieldProcessor.BindingScope.READ_FROM_CURSOR,
@@ -667,8 +613,8 @@
         }
     }
 
-    private fun detectReferenceRecursion(typeElement: TypeElement): Boolean {
-        if (referenceStack.contains(typeElement.qualifiedName.toString())) {
+    private fun detectReferenceRecursion(typeElement: XTypeElement): Boolean {
+        if (referenceStack.contains(typeElement.qualifiedName)) {
             context.logger.e(
                     typeElement,
                     ProcessorErrors
@@ -679,8 +625,8 @@
         return false
     }
 
-    private fun computeReferenceRecursionString(typeElement: TypeElement): String {
-        val recursiveTailTypeName = typeElement.qualifiedName.toString()
+    private fun computeReferenceRecursionString(typeElement: XTypeElement): String {
+        val recursiveTailTypeName = typeElement.qualifiedName
 
         val referenceRecursionList = mutableListOf<String>()
         with(referenceRecursionList) {
@@ -724,7 +670,7 @@
         context.checker.check(
             success || bindingScope == FieldProcessor.BindingScope.READ_FROM_CURSOR,
             field.element, CANNOT_FIND_GETTER_FOR_FIELD)
-        if (success && !field.getter.type.isSameType(context.processingEnv.typeUtils, field.type)) {
+        if (success && !field.getter.type.isSameType(field.type)) {
             // getter's parameter type is not exactly the same as the field type.
             // put a warning and update the value statement binder.
             context.logger.w(
@@ -732,8 +678,8 @@
                 element = field.element,
                 msg = ProcessorErrors.mismatchedGetter(
                     fieldName = field.name,
-                    ownerType = element.type.typeName(),
-                    getterType = field.getter.type.typeName(),
+                    ownerType = element.type.typeName,
+                    getterType = field.getter.type.typeName,
                     fieldType = field.typeName
                 ))
             field.statementBinder = context.typeAdapterStore.findStatementValueBinder(
@@ -792,7 +738,7 @@
         context.checker.check(
             success || bindingScope == FieldProcessor.BindingScope.BIND_TO_STMT,
             field.element, CANNOT_FIND_SETTER_FOR_FIELD)
-        if (success && !field.setter.type.isSameType(context.processingEnv.typeUtils, field.type)) {
+        if (success && !field.setter.type.isSameType(field.type)) {
             // setter's parameter type is not exactly the same as the field type.
             // put a warning and update the value reader adapter.
             context.logger.w(
@@ -800,8 +746,8 @@
                 element = field.element,
                 msg = ProcessorErrors.mismatchedSetter(
                     fieldName = field.name,
-                    ownerType = element.type.typeName(),
-                    setterType = field.setter.type.typeName(),
+                    ownerType = element.type.typeName,
+                    setterType = field.setter.type.typeName,
                     fieldType = field.typeName
                 ))
             field.cursorValueReader = context.typeAdapterStore.findCursorValueReader(
@@ -821,7 +767,7 @@
         field: Field,
         candidates: List<PojoMethod>,
         nameVariations: List<String>,
-        getType: (PojoMethod) -> TypeMirror,
+        getType: (PojoMethod) -> XType,
         assignFromField: () -> Unit,
         assignFromMethod: (PojoMethod) -> Unit,
         reportAmbiguity: (List<String>) -> Unit
@@ -830,12 +776,11 @@
             assignFromField()
             return true
         }
-        val types = context.processingEnv.typeUtils
 
         val matching = candidates
                 .filter {
                     // b/69164099
-                    field.type.isAssignableFromWithoutVariance(types, getType(it)) &&
+                    field.type.isAssignableFromWithoutVariance(getType(it)) &&
                             (field.nameWithVariations.contains(it.name) ||
                             nameVariations.contains(it.name))
                 }
@@ -876,13 +821,17 @@
 
     interface Delegate {
 
-        fun onPreProcess(element: TypeElement)
+        fun onPreProcess(element: XTypeElement)
 
-        fun findConstructors(element: TypeElement): List<ExecutableElement>
+        /**
+         * Constructors are XExecutableElement rather than XConstrcutorElement to account for
+         * factory methods.
+         */
+        fun findConstructors(element: XTypeElement): List<XExecutableElement>
 
         fun createPojo(
-            element: TypeElement,
-            declaredType: DeclaredType,
+            element: XTypeElement,
+            declaredType: XDeclaredType,
             fields: List<Field>,
             embeddedFields: List<EmbeddedField>,
             relations: List<androidx.room.vo.Relation>,
@@ -891,10 +840,10 @@
     }
 
     private class DefaultDelegate(private val context: Context) : Delegate {
-        override fun onPreProcess(element: TypeElement) {
+        override fun onPreProcess(element: XTypeElement) {
             // Check that certain Room annotations with @Target(METHOD) are not used in the POJO
             // since it is not annotated with AutoValue.
-            element.getAllMethods(context.processingEnv)
+            element.getAllMethods()
                 .filter { it.hasAnyOf(*TARGET_METHOD_ANNOTATIONS) }
                 .forEach { method ->
                     val annotationName = TARGET_METHOD_ANNOTATIONS
@@ -905,13 +854,13 @@
                 }
         }
 
-        override fun findConstructors(element: TypeElement) = element.getConstructors().filterNot {
+        override fun findConstructors(element: XTypeElement) = element.getConstructors().filterNot {
             it.hasAnnotation(Ignore::class) || it.isPrivate()
         }
 
         override fun createPojo(
-            element: TypeElement,
-            declaredType: DeclaredType,
+            element: XTypeElement,
+            declaredType: XDeclaredType,
             fields: List<Field>,
             embeddedFields: List<EmbeddedField>,
             relations: List<androidx.room.vo.Relation>,
@@ -928,7 +877,7 @@
     }
 
     private data class FailedConstructor(
-        val method: ExecutableElement,
+        val method: XExecutableElement,
         val params: List<String>,
         val matches: List<Constructor.Param?>
     ) {
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt
index b0f0a08..8aad153 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt
@@ -19,13 +19,12 @@
 import androidx.room.Query
 import androidx.room.SkipQueryVerification
 import androidx.room.Transaction
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.name
-import androidx.room.ext.toAnnotationBox
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
 import androidx.room.parser.QueryType
 import androidx.room.parser.SqlParser
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
 import androidx.room.solver.query.result.PojoRowAdapter
 import androidx.room.verifier.DatabaseVerificationErrors
 import androidx.room.verifier.DatabaseVerifier
@@ -34,15 +33,11 @@
 import androidx.room.vo.ReadQueryMethod
 import androidx.room.vo.Warning
 import androidx.room.vo.WriteQueryMethod
-import isNotError
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 class QueryMethodProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val executableElement: ExecutableElement,
+    val containing: XDeclaredType,
+    val executableElement: XMethodElement,
     val dbVerifier: DatabaseVerifier? = null
 ) {
     val context = baseContext.fork(executableElement)
@@ -102,8 +97,8 @@
 
 private class InternalQueryProcessor(
     val context: Context,
-    val executableElement: ExecutableElement,
-    val containing: DeclaredType,
+    val executableElement: XMethodElement,
+    val containing: XDeclaredType,
     val dbVerifier: DatabaseVerifier? = null
 ) {
     fun processQuery(input: String?): QueryMethod {
@@ -127,7 +122,7 @@
             ParsedQuery.MISSING
         }
 
-        val returnTypeName = returnType.typeName()
+        val returnTypeName = returnType.typeName
         context.checker.notUnbound(
             returnTypeName, executableElement,
             ProcessorErrors.CANNOT_USE_UNBOUND_GENERICS_IN_QUERY_METHODS
@@ -180,7 +175,7 @@
 
     private fun getPreparedQueryMethod(
         delegate: MethodProcessorDelegate,
-        returnType: TypeMirror,
+        returnType: XType,
         query: ParsedQuery
     ): WriteQueryMethod {
         val resultBinder = delegate.findPreparedResultBinder(returnType, query)
@@ -203,7 +198,7 @@
 
     private fun getQueryMethod(
         delegate: MethodProcessorDelegate,
-        returnType: TypeMirror,
+        returnType: XType,
         query: ParsedQuery
     ): QueryMethod {
         val resultBinder = delegate.findResultBinder(returnType, query)
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/QueryParameterProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/QueryParameterProcessor.kt
index 279aac3..45ecebc 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/QueryParameterProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/QueryParameterProcessor.kt
@@ -16,24 +16,19 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.asMemberOf
-import androidx.room.ext.name
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XVariableElement
 import androidx.room.vo.QueryParameter
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.DeclaredType
 
 class QueryParameterProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val element: VariableElement,
+    val containing: XDeclaredType,
+    val element: XVariableElement,
     private val sqlName: String? = null
 ) {
     val context = baseContext.fork(element)
     fun process(): QueryParameter {
-        val asMember = element.asMemberOf(
-            context.processingEnv.typeUtils,
-            containing
-        )
+        val asMember = element.asMemberOf(containing)
         val parameterAdapter = context.typeAdapterStore.findQueryParameterAdapter(asMember)
         context.checker.check(parameterAdapter != null, element,
                 ProcessorErrors.CANNOT_BIND_QUERY_PARAMETER_INTO_STMT)
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/RawQueryMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/RawQueryMethodProcessor.kt
index 6b81e0d..c177f63 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/RawQueryMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/RawQueryMethodProcessor.kt
@@ -19,27 +19,18 @@
 import androidx.room.RawQuery
 import androidx.room.Transaction
 import androidx.room.ext.SupportDbTypeNames
-import androidx.room.ext.asMemberOf
-import androidx.room.ext.hasAnnotation
 import androidx.room.ext.isEntityElement
-import androidx.room.ext.name
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.toAnnotationBox
-import androidx.room.ext.type
-import androidx.room.ext.typeName
 import androidx.room.parser.SqlParser
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XVariableElement
 import androidx.room.processor.ProcessorErrors.RAW_QUERY_STRING_PARAMETER_REMOVED
 import androidx.room.vo.RawQueryMethod
-import asTypeElement
-import isAssignableFrom
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.DeclaredType
 
 class RawQueryMethodProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val executableElement: ExecutableElement
+    val containing: XDeclaredType,
+    val executableElement: XMethodElement
 ) {
     val context = baseContext.fork(executableElement)
 
@@ -50,7 +41,7 @@
         context.checker.check(executableElement.hasAnnotation(RawQuery::class), executableElement,
                 ProcessorErrors.MISSING_RAWQUERY_ANNOTATION)
 
-        val returnTypeName = returnType.typeName()
+        val returnTypeName = returnType.typeName
         context.checker.notUnbound(returnTypeName, executableElement,
                 ProcessorErrors.CANNOT_USE_UNBOUND_GENERICS_IN_QUERY_METHODS)
         val observedTableNames = processObservedTables()
@@ -76,7 +67,7 @@
 
     private fun processObservedTables(): Set<String> {
         val annotation = executableElement.toAnnotationBox(RawQuery::class)
-        return annotation?.getAsTypeMirrorList("observedEntities")
+        return annotation?.getAsTypeList("observedEntities")
                 ?.map {
                     it.asTypeElement()
                 }
@@ -98,7 +89,7 @@
                         // if it is empty, report error as it does not make sense
                         if (tableNames.isEmpty()) {
                             context.logger.e(executableElement,
-                                    ProcessorErrors.rawQueryBadEntity(it.type.typeName()))
+                                    ProcessorErrors.rawQueryBadEntity(it.type.typeName))
                         }
                         tableNames
                     }
@@ -106,21 +97,20 @@
     }
 
     private fun findRuntimeQueryParameter(
-        extractParams: List<VariableElement>
+        extractParams: List<XVariableElement>
     ): RawQueryMethod.RuntimeQueryParameter? {
-        val types = context.processingEnv.typeUtils
-        if (extractParams.size == 1 && !executableElement.isVarArgs) {
-            val param = extractParams.first().asMemberOf(types, containing)
+        if (extractParams.size == 1 && !executableElement.isVarArgs()) {
+            val param = extractParams.first().asMemberOf(containing)
             val processingEnv = context.processingEnv
-            val supportQueryType = processingEnv.requireTypeMirror(SupportDbTypeNames.QUERY)
-            val isSupportSql = supportQueryType.isAssignableFrom(types, param)
+            val supportQueryType = processingEnv.requireType(SupportDbTypeNames.QUERY)
+            val isSupportSql = supportQueryType.isAssignableFrom(param)
             if (isSupportSql) {
                 return RawQueryMethod.RuntimeQueryParameter(
                         paramName = extractParams[0].name,
-                        type = supportQueryType.typeName())
+                        type = supportQueryType.typeName)
             }
-            val stringType = processingEnv.requireTypeMirror("java.lang.String")
-            val isString = stringType.isAssignableFrom(types, param)
+            val stringType = processingEnv.requireType("java.lang.String")
+            val isString = stringType.isAssignableFrom(param)
             if (isString) {
                 // special error since this was initially allowed but removed in 1.1 beta1
                 context.logger.e(executableElement, RAW_QUERY_STRING_PARAMETER_REMOVED)
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/ShortcutMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/ShortcutMethodProcessor.kt
index 118f4eb..66955d6 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/ShortcutMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/ShortcutMethodProcessor.kt
@@ -15,21 +15,17 @@
  */
 package androidx.room.processor
 
-import androidx.room.ext.AnnotationBox
 import androidx.room.ext.isEntityElement
-import androidx.room.ext.toAnnotationBox
+import androidx.room.processing.XAnnotationBox
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
 import androidx.room.vo.Entity
 import androidx.room.vo.Pojo
 import androidx.room.vo.ShortcutEntity
 import androidx.room.vo.ShortcutQueryParameter
 import androidx.room.vo.findFieldByColumnName
-import asTypeElement
-import isSameType
-import isTypeOf
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 import kotlin.reflect.KClass
 
 /**
@@ -37,13 +33,13 @@
  */
 class ShortcutMethodProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val executableElement: ExecutableElement
+    val containing: XDeclaredType,
+    val executableElement: XMethodElement
 ) {
     val context = baseContext.fork(executableElement)
     private val delegate = MethodProcessorDelegate.createFor(context, containing, executableElement)
 
-    fun <T : Annotation> extractAnnotation(klass: KClass<T>, errorMsg: String): AnnotationBox<T>? {
+    fun <T : Annotation> extractAnnotation(klass: KClass<T>, errorMsg: String): XAnnotationBox<T>? {
         val annotation = executableElement.toAnnotationBox(klass)
         context.checker.check(annotation != null, executableElement, errorMsg)
         return annotation
@@ -52,7 +48,7 @@
     fun extractReturnType() = delegate.extractReturnType()
 
     fun extractParams(
-        targetEntityType: TypeMirror?,
+        targetEntityType: XType?,
         missingParamError: String,
         onValidatePartialEntity: (Entity, Pojo) -> Unit
     ): Pair<Map<String, ShortcutEntity>, List<ShortcutQueryParameter>> {
@@ -93,7 +89,7 @@
         params: List<ShortcutQueryParameter>,
         onValidatePartialEntity: (Entity, Pojo) -> Unit
     ) = params.associateBy({ it.name }, { param ->
-        if (targetEntity.type.isSameType(context.processingEnv.typeUtils, param.pojoType!!)) {
+        if (targetEntity.type.isSameType(param.pojoType!!)) {
             ShortcutEntity(entity = targetEntity, partialEntity = null)
         } else {
             // Target entity and pojo param are not the same, process and validate partial entity.
@@ -130,7 +126,7 @@
             it.name to ShortcutEntity(entity = entity!!, partialEntity = null)
         }.toMap()
 
-    private inline fun processEntity(element: TypeElement, onInvalid: () -> Unit) =
+    private inline fun processEntity(element: XTypeElement, onInvalid: () -> Unit) =
         if (element.isEntityElement()) {
             EntityProcessor(
                 context = context,
@@ -141,10 +137,10 @@
         }
 
     fun findInsertMethodBinder(
-        returnType: TypeMirror,
+        returnType: XType,
         params: List<ShortcutQueryParameter>
     ) = delegate.findInsertMethodBinder(returnType, params)
 
-    fun findDeleteOrUpdateMethodBinder(returnType: TypeMirror) =
+    fun findDeleteOrUpdateMethodBinder(returnType: XType) =
         delegate.findDeleteOrUpdateMethodBinder(returnType)
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/ShortcutParameterProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/ShortcutParameterProcessor.kt
index fd6b658..310dcb8 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/ShortcutParameterProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/ShortcutParameterProcessor.kt
@@ -16,36 +16,24 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.asMemberOf
-import androidx.room.ext.extendsBound
-import androidx.room.ext.getAllNonPrivateInstanceMethods
-import androidx.room.ext.name
-import androidx.room.ext.requireTypeMirror
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
+import androidx.room.processing.XVariableElement
+import androidx.room.processing.asDeclaredType
+import androidx.room.processing.isArray
 import androidx.room.vo.ShortcutQueryParameter
-import asDeclaredType
-import asTypeElement
-import erasure
-import isAssignableFrom
-import isType
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.ArrayType
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 /**
  * Processes parameters of methods that are annotated with Insert, Update or Delete.
  */
 class ShortcutParameterProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val element: VariableElement
+    val containing: XDeclaredType,
+    val element: XVariableElement
 ) {
     val context = baseContext.fork(element)
     fun process(): ShortcutQueryParameter {
-        val asMember = element.asMemberOf(
-            context.processingEnv.typeUtils,
-            containing
-        )
+        val asMember = element.asMemberOf(containing)
         val name = element.name
         context.checker.check(!name.startsWith("_"), element,
                 ProcessorErrors.QUERY_PARAMETERS_CANNOT_START_WITH_UNDERSCORE)
@@ -61,12 +49,11 @@
     }
 
     @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
-    private fun extractPojoType(typeMirror: TypeMirror): Pair<TypeMirror?, Boolean> {
+    private fun extractPojoType(typeMirror: XType): Pair<XType?, Boolean> {
 
         val processingEnv = context.processingEnv
-        val typeUtils = context.processingEnv.typeUtils
 
-        fun verifyAndPair(pojoType: TypeMirror, isMultiple: Boolean): Pair<TypeMirror?, Boolean> {
+        fun verifyAndPair(pojoType: XType, isMultiple: Boolean): Pair<XType?, Boolean> {
             if (!pojoType.isType()) {
                 // kotlin may generate ? extends T so we should reduce it.
                 val boundedVar = pojoType.extendsBound()
@@ -77,10 +64,10 @@
             return Pair(pojoType, isMultiple)
         }
 
-        fun extractPojoTypeFromIterator(iterableType: DeclaredType): TypeMirror {
-            iterableType.asTypeElement().getAllNonPrivateInstanceMethods(processingEnv).forEach {
+        fun extractPojoTypeFromIterator(iterableType: XDeclaredType): XType {
+            iterableType.asTypeElement().getAllNonPrivateInstanceMethods().forEach {
                 if (it.name == "iterator") {
-                    return it.asMemberOf(typeUtils, iterableType)
+                    return it.asMemberOf(iterableType)
                         .returnType
                         .asDeclaredType()
                         .typeArguments
@@ -91,13 +78,13 @@
         }
 
         val iterableType = processingEnv
-                .requireTypeMirror("java.lang.Iterable").erasure(typeUtils)
-        if (iterableType.isAssignableFrom(typeUtils, typeMirror)) {
+                .requireType("java.lang.Iterable").erasure()
+        if (iterableType.isAssignableFrom(typeMirror)) {
             val declared = typeMirror.asDeclaredType()
             val pojo = extractPojoTypeFromIterator(declared)
             return verifyAndPair(pojo, true)
         }
-        if (typeMirror is ArrayType) {
+        if (typeMirror.isArray()) {
             val pojo = typeMirror.componentType
             return verifyAndPair(pojo, true)
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/SuppressWarningProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/SuppressWarningProcessor.kt
index c294886..70f2ecd 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/SuppressWarningProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/SuppressWarningProcessor.kt
@@ -16,16 +16,15 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.toAnnotationBox
+import androidx.room.processing.XElement
 import androidx.room.vo.Warning
-import javax.lang.model.element.Element
 
 /**
  * A visitor that reads SuppressWarnings annotations and keeps the ones we know about.
  */
 object SuppressWarningProcessor {
 
-    fun getSuppressedWarnings(element: Element): Set<Warning> {
+    fun getSuppressedWarnings(element: XElement): Set<Warning> {
         val annotation = element.toAnnotationBox(SuppressWarnings::class)?.value
         return if (annotation == null) {
             emptySet()
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/TableEntityProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/TableEntityProcessor.kt
index d28e888..f8ac9e7 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/TableEntityProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/TableEntityProcessor.kt
@@ -16,10 +16,10 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.name
-import androidx.room.ext.toAnnotationBox
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.parser.SqlParser
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
 import androidx.room.processor.EntityProcessor.Companion.createIndexName
 import androidx.room.processor.EntityProcessor.Companion.extractForeignKeys
 import androidx.room.processor.EntityProcessor.Companion.extractIndices
@@ -38,15 +38,10 @@
 import androidx.room.vo.Warning
 import androidx.room.vo.columnNames
 import androidx.room.vo.findFieldByColumnName
-import asTypeElement
-import isNone
-import isNotNone
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.TypeMirror
 
 class TableEntityProcessor internal constructor(
     baseContext: Context,
-    val element: TypeElement,
+    val element: XTypeElement,
     private val referenceStack: LinkedHashSet<String> = LinkedHashSet()
 ) : EntityProcessor {
     val context = baseContext.fork(element)
@@ -96,7 +91,8 @@
                         it.indexed = false
                         context.logger.w(Warning.INDEX_FROM_EMBEDDED_FIELD_IS_DROPPED, it.element,
                                 ProcessorErrors.droppedEmbeddedFieldIndex(
-                                        it.getPath(), element.qualifiedName.toString()))
+                                        it.getPath(), element.qualifiedName
+                                ))
                         null
                     } else if (it.element.enclosingElement != element && !inheritSuperIndices) {
                         it.indexed = false
@@ -114,7 +110,7 @@
                         )
                     }
                 }
-        val superIndices = loadSuperIndices(element.superclass, tableName, inheritSuperIndices)
+        val superIndices = loadSuperIndices(element.superType, tableName, inheritSuperIndices)
         val indexInputs = entityIndices + fieldIndices + superIndices
         val indices = validateAndCreateIndices(indexInputs, pojo)
 
@@ -311,7 +307,7 @@
                             Warning.PRIMARY_KEY_FROM_EMBEDDED_IS_DROPPED,
                             grandParentField,
                             ProcessorErrors.embeddedPrimaryKeyIsDropped(
-                                    element.qualifiedName.toString(), field.name))
+                                element.qualifiedName, field.name))
                     null
                 } else {
                     PrimaryKey(declaredIn = field.element.enclosingElement,
@@ -326,7 +322,7 @@
      * Check classes for @Entity(primaryKeys = ?).
      */
     private fun collectPrimaryKeysFromEntityAnnotations(
-        typeElement: TypeElement,
+        typeElement: XTypeElement,
         availableFields: List<Field>
     ): List<PrimaryKey> {
         val myPkeys = typeElement.toAnnotationBox(androidx.room.Entity::class)?.let {
@@ -347,7 +343,7 @@
             }
         } ?: emptyList()
         // checks supers.
-        val mySuper = typeElement.superclass
+        val mySuper = typeElement.superType
         val superPKeys = if (mySuper != null && mySuper.isNotNone()) {
             // my super cannot see my fields so remove them.
             val remainingFields = availableFields.filterNot {
@@ -379,7 +375,7 @@
     // pkey, if so, use it.
     private fun choosePrimaryKey(
         candidates: List<PrimaryKey>,
-        typeElement: TypeElement
+        typeElement: XTypeElement
     ): PrimaryKey {
         // If 1 of these primary keys is declared in this class, then it is the winner. Just print
         //    a note for the others.
@@ -398,7 +394,7 @@
             myPKeys.first()
         } else if (myPKeys.isEmpty()) {
             // i have not declared anything, delegate to super
-            val mySuper = typeElement.superclass
+            val mySuper = typeElement.superType
             if (mySuper != null && mySuper.isNotNone()) {
                 return choosePrimaryKey(candidates, mySuper.asTypeElement())
             }
@@ -449,7 +445,8 @@
                             embedded.field.element, ProcessorErrors.droppedEmbeddedIndex(
                             entityName = embedded.pojo.typeName.toString(),
                             fieldPath = embedded.field.getPath(),
-                            grandParent = element.qualifiedName.toString()))
+                            grandParent = element.qualifiedName
+                        ))
                 }
             }
         }
@@ -458,7 +455,7 @@
 
     // check if parent is an Entity, if so, report its annotation indices
     private fun loadSuperIndices(
-        typeMirror: TypeMirror?,
+        typeMirror: XType?,
         tableName: String,
         inherit: Boolean
     ): List<IndexInput> {
@@ -483,11 +480,12 @@
                 context.logger.w(Warning.INDEX_FROM_PARENT_IS_DROPPED,
                         parentElement,
                         ProcessorErrors.droppedSuperClassIndex(
-                                childEntity = element.qualifiedName.toString(),
-                                superEntity = parentElement.qualifiedName.toString()))
+                                childEntity = element.qualifiedName,
+                                superEntity = parentElement.qualifiedName
+                        ))
                 emptyList()
             }
         } ?: emptyList()
-        return myIndices + loadSuperIndices(parentElement.superclass, tableName, inherit)
+        return myIndices + loadSuperIndices(parentElement.superType, tableName, inherit)
     }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/TransactionMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/TransactionMethodProcessor.kt
index f5808d2..8a4cd01 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/TransactionMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/TransactionMethodProcessor.kt
@@ -20,41 +20,32 @@
 import androidx.room.ext.LifecyclesTypeNames
 import androidx.room.ext.RxJava2TypeNames
 import androidx.room.ext.RxJava3TypeNames
-import androidx.room.ext.findKotlinDefaultImpl
-import androidx.room.ext.findTypeMirror
-import androidx.room.ext.isAbstract
-import androidx.room.ext.isJavaDefault
-import androidx.room.ext.isOverrideableIgnoringContainer
-import androidx.room.ext.name
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
 import androidx.room.vo.TransactionMethod
-import erasure
-import isAssignableFrom
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
 
 class TransactionMethodProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val executableElement: ExecutableElement
+    val containing: XDeclaredType,
+    val executableElement: XMethodElement
 ) {
 
     val context = baseContext.fork(executableElement)
 
     fun process(): TransactionMethod {
         val delegate = MethodProcessorDelegate.createFor(context, containing, executableElement)
-        val typeUtils = context.processingEnv.typeUtils
-        val kotlinDefaultImpl = executableElement.findKotlinDefaultImpl(typeUtils)
+        val kotlinDefaultImpl = executableElement.findKotlinDefaultImpl()
         context.checker.check(
                 executableElement.isOverrideableIgnoringContainer() &&
                         (!executableElement.isAbstract() || kotlinDefaultImpl != null),
                 executableElement, ProcessorErrors.TRANSACTION_METHOD_MODIFIERS)
 
         val returnType = delegate.extractReturnType()
-        val erasureReturnType = returnType.erasure(typeUtils)
+        val erasureReturnType = returnType.erasure()
 
         DEFERRED_TYPES.firstOrNull { className ->
-            context.processingEnv.findTypeMirror(className)?.let {
-                erasureReturnType.isAssignableFrom(typeUtils, it)
+            context.processingEnv.findType(className)?.let {
+                erasureReturnType.isAssignableFrom(it)
             } ?: false
         }?.let { returnTypeName ->
             context.logger.e(
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/UpdateMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/UpdateMethodProcessor.kt
index 10a9e93..79a4a67 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/UpdateMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/UpdateMethodProcessor.kt
@@ -19,16 +19,15 @@
 import androidx.room.OnConflictStrategy.IGNORE
 import androidx.room.OnConflictStrategy.REPLACE
 import androidx.room.Update
-import androidx.room.ext.name
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
 import androidx.room.vo.UpdateMethod
 import androidx.room.vo.findFieldByColumnName
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
 
 class UpdateMethodProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val executableElement: ExecutableElement
+    val containing: XDeclaredType,
+    val executableElement: XMethodElement
 ) {
     val context = baseContext.fork(executableElement)
 
@@ -42,7 +41,7 @@
                 executableElement, ProcessorErrors.INVALID_ON_CONFLICT_VALUE)
 
         val (entities, params) = delegate.extractParams(
-            targetEntityType = annotation?.getAsTypeMirror("entity"),
+            targetEntityType = annotation?.getAsType("entity"),
             missingParamError = ProcessorErrors.UPDATE_MISSING_PARAMS,
             onValidatePartialEntity = { entity, pojo ->
                 val missingPrimaryKeys = entity.primaryKey.fields.filter {
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegate.kt b/room/compiler/src/main/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegate.kt
index c6d1ba1..1e0dab2 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegate.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegate.kt
@@ -17,21 +17,10 @@
 package androidx.room.processor.autovalue
 
 import androidx.room.Ignore
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.getDeclaredMethods
-import androidx.room.ext.getPackage
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.hasAnyOf
-import androidx.room.ext.isAbstract
-import androidx.room.ext.isPrivate
-import androidx.room.ext.isStatic
-import androidx.room.ext.isType
-import androidx.room.ext.kindName
-import androidx.room.ext.name
-import androidx.room.ext.type
-import androidx.room.ext.typeName
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XExecutableElement
+import androidx.room.processing.XTypeElement
+import androidx.room.processing.isType
 import androidx.room.processor.Context
 import androidx.room.processor.PojoProcessor
 import androidx.room.processor.PojoProcessor.Companion.TARGET_METHOD_ANNOTATIONS
@@ -42,33 +31,27 @@
 import androidx.room.vo.Pojo
 import androidx.room.vo.Warning
 import com.google.auto.value.AutoValue.CopyAnnotations
-import isSameType
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
 
 /**
  * Delegate to process generated AutoValue class as a Pojo.
  */
 class AutoValuePojoProcessorDelegate(
     private val context: Context,
-    private val autoValueElement: TypeElement
+    private val autoValueElement: XTypeElement
 ) : PojoProcessor.Delegate {
 
-    private val autoValueDeclaredType: DeclaredType by lazy {
+    private val autoValueDeclaredType: XDeclaredType by lazy {
         autoValueElement.asDeclaredType()
     }
 
-    override fun onPreProcess(element: TypeElement) {
-        val allMethods = autoValueElement.getAllMethods(context.processingEnv)
+    override fun onPreProcess(element: XTypeElement) {
+        val allMethods = autoValueElement.getAllMethods()
         val autoValueAbstractGetters = allMethods
             .filter { it.isAbstract() && it.parameters.size == 0 }
 
         // Warn about missing @AutoValue.CopyAnnotations in the property getters.
         autoValueAbstractGetters.forEach {
-            val hasRoomAnnotation = it.annotationMirrors.map {
-                it.annotationType.typeName().toString()
-            }.any { it.contains("androidx.room") }
+            val hasRoomAnnotation = it.hasAnnotationWithPackage("androidx.room")
             if (hasRoomAnnotation && !it.hasAnnotation(CopyAnnotations::class)) {
                 context.logger.w(Warning.MISSING_COPY_ANNOTATIONS, it,
                         ProcessorErrors.MISSING_COPY_ANNOTATIONS)
@@ -87,19 +70,18 @@
             }
     }
 
-    override fun findConstructors(element: TypeElement): List<ExecutableElement> {
-        val typeUtils = context.processingEnv.typeUtils
+    override fun findConstructors(element: XTypeElement): List<XExecutableElement> {
         return autoValueElement.getDeclaredMethods().filter {
             it.isStatic() &&
                     !it.hasAnnotation(Ignore::class) &&
                     !it.isPrivate() &&
-                    it.returnType.isSameType(typeUtils, autoValueElement.type)
+                    it.returnType.isSameType(autoValueElement.type)
         }
     }
 
     override fun createPojo(
-        element: TypeElement,
-        declaredType: DeclaredType,
+        element: XTypeElement,
+        declaredType: XDeclaredType,
         fields: List<Field>,
         embeddedFields: List<EmbeddedField>,
         relations: List<androidx.room.vo.Relation>,
@@ -119,14 +101,14 @@
          *
          * This is the same naming strategy used by AutoValue's processor.
          */
-        fun getGeneratedClassName(element: TypeElement): String {
+        fun getGeneratedClassName(element: XTypeElement): String {
             var type = element
             var name = type.name
-            while (type.enclosingElement.isType()) {
-                type = type.enclosingElement.asTypeElement()
+            while (type.enclosingElement?.isType() == true) {
+                type = type.enclosingElement!!.asTypeElement()
                 name = "${type.name}_$name"
             }
-            val pkg = type.getPackage()
+            val pkg = type.packageName
             return "$pkg${if (pkg.isEmpty()) "" else "."}AutoValue_$name"
         }
     }
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/cache/Cache.kt b/room/compiler/src/main/kotlin/androidx/room/processor/cache/Cache.kt
index 115f85e..16b9ab3 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/cache/Cache.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/cache/Cache.kt
@@ -18,14 +18,14 @@
 
 package androidx.room.processor.cache
 
+import androidx.room.processing.XElement
+import androidx.room.processing.XType
 import androidx.room.processor.FieldProcessor
 import androidx.room.vo.EmbeddedField
 import androidx.room.vo.Entity
 import androidx.room.vo.Pojo
 import androidx.room.vo.Warning
 import java.util.LinkedHashSet
-import javax.lang.model.element.Element
-import javax.lang.model.type.TypeMirror
 
 /**
  * A cache key can be used to avoid re-processing elements.
@@ -35,7 +35,7 @@
  */
 class Cache(
     val parent: Cache?,
-    val converters: LinkedHashSet<TypeMirror>,
+    val converters: LinkedHashSet<XType>,
     val suppressedWarnings: Set<Warning>
 ) {
     val entities: Bucket<EntityKey, Entity> = Bucket(parent?.entities)
@@ -54,13 +54,13 @@
     /**
      * Key for Entity cache
      */
-    data class EntityKey(val element: Element)
+    data class EntityKey(val element: XElement)
 
     /**
      * Key for Pojo cache
      */
     data class PojoKey(
-        val element: Element,
+        val element: XElement,
         val scope: FieldProcessor.BindingScope,
         val parent: EmbeddedField?
     )
@@ -71,7 +71,7 @@
      * Converters are kept in a linked set since the order is important for the TypeAdapterStore.
      */
     private data class FullKey<T>(
-        val converters: LinkedHashSet<TypeMirror>,
+        val converters: LinkedHashSet<XType>,
         val suppressedWarnings: Set<Warning>,
         val key: T
     )
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/KotlinDefaultMethodDelegateBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/KotlinDefaultMethodDelegateBinder.kt
index 139d491..87e668f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/KotlinDefaultMethodDelegateBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/KotlinDefaultMethodDelegateBinder.kt
@@ -20,9 +20,8 @@
 import androidx.room.ext.L
 import androidx.room.ext.N
 import androidx.room.ext.T
+import androidx.room.processing.XType
 import com.squareup.javapoet.ClassName
-import isVoid
-import javax.lang.model.type.TypeMirror
 
 /**
  * Method binder that delegates to concrete DAO function in a Kotlin interface.
@@ -32,7 +31,7 @@
         daoName: ClassName,
         daoImplName: ClassName,
         methodName: String,
-        returnType: TypeMirror,
+        returnType: XType,
         parameterNames: List<String>,
         scope: CodeGenScope
     ) {
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/ObservableQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/ObservableQueryResultBinderProvider.kt
index e156a4c..159bf397 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/ObservableQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/ObservableQueryResultBinderProvider.kt
@@ -17,26 +17,26 @@
 package androidx.room.solver
 
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.query.result.QueryResultAdapter
 import androidx.room.solver.query.result.QueryResultBinder
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binder provider class that has common functionality for observables.
  */
 abstract class ObservableQueryResultBinderProvider(val context: Context) :
     QueryResultBinderProvider {
-    protected abstract fun extractTypeArg(declared: DeclaredType): TypeMirror
+    protected abstract fun extractTypeArg(declared: XDeclaredType): XType
     protected abstract fun create(
-        typeArg: TypeMirror,
+        typeArg: XType,
         resultAdapter: QueryResultAdapter?,
         tableNames: Set<String>
     ): QueryResultBinder
 
-    final override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    final override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         val typeArg = extractTypeArg(declared)
         val adapter = context.typeAdapterStore.findQueryResultAdapter(typeArg, query)
         val tableNames = ((adapter?.accessedTableNames() ?: emptyList()) +
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/QueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/QueryResultBinderProvider.kt
index 2fda890..8290d7a 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/QueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/QueryResultBinderProvider.kt
@@ -17,10 +17,10 @@
 package androidx.room.solver
 
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.solver.query.result.QueryResultBinder
-import javax.lang.model.type.DeclaredType
 
 interface QueryResultBinderProvider {
-    fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder
-    fun matches(declared: DeclaredType): Boolean
+    fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder
+    fun matches(declared: XDeclaredType): Boolean
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt b/room/compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt
index 365e3eb..740806b 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt
@@ -18,13 +18,13 @@
 
 import androidx.room.ext.CommonTypeNames
 import androidx.room.ext.GuavaBaseTypeNames
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.extendsBoundOrSelf
-import androidx.room.ext.isAssignableFromWithoutVariance
 import androidx.room.ext.isEntityElement
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XType
+import androidx.room.processing.asDeclaredType
+import androidx.room.processing.isArray
+import androidx.room.processing.isDeclared
 import androidx.room.processor.Context
 import androidx.room.processor.EntityProcessor
 import androidx.room.processor.FieldProcessor
@@ -92,21 +92,9 @@
 import androidx.room.solver.types.StringColumnTypeAdapter
 import androidx.room.solver.types.TypeConverter
 import androidx.room.vo.ShortcutQueryParameter
-import asDeclaredType
-import asTypeElement
 import com.google.common.annotations.VisibleForTesting
 import com.google.common.collect.ImmutableList
-import erasure
-import isArray
-import isAssignableFrom
-import isDeclared
-import isError
-import isNotByte
-import isSameType
-import isType
-import isTypeOf
 import java.util.LinkedList
-import javax.lang.model.type.TypeMirror
 
 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
 /**
@@ -158,7 +146,7 @@
                     .createPrimitiveAdapters(context.processingEnv)
             primitives.forEach(::addColumnAdapter)
             BoxedPrimitiveColumnTypeAdapter
-                    .createBoxedPrimitiveAdapters(context.processingEnv, primitives)
+                    .createBoxedPrimitiveAdapters(primitives)
                     .forEach(::addColumnAdapter)
             addColumnAdapter(StringColumnTypeAdapter(context.processingEnv))
             addColumnAdapter(ByteArrayColumnTypeAdapter(context.processingEnv))
@@ -215,7 +203,7 @@
      * Searches 1 way to bind a value into a statement.
      */
     fun findStatementValueBinder(
-        input: TypeMirror,
+        input: XType,
         affinity: SQLTypeAffinity?
     ): StatementValueBinder? {
         if (input.isError()) {
@@ -237,7 +225,7 @@
     /**
      * Returns which entities targets the given affinity.
      */
-    private fun targetTypeMirrorsFor(affinity: SQLTypeAffinity?): List<TypeMirror> {
+    private fun targetTypeMirrorsFor(affinity: SQLTypeAffinity?): List<XType> {
         val specifiedTargets = affinity?.getTypeMirrors(context.processingEnv)
         return if (specifiedTargets == null || specifiedTargets.isEmpty()) {
             knownColumnTypeMirrors
@@ -249,7 +237,7 @@
     /**
      * Searches 1 way to read it from cursor
      */
-    fun findCursorValueReader(output: TypeMirror, affinity: SQLTypeAffinity?): CursorValueReader? {
+    fun findCursorValueReader(output: XType, affinity: SQLTypeAffinity?): CursorValueReader? {
         if (output.isError()) {
             return null
         }
@@ -278,10 +266,9 @@
                 CompositeTypeConverter(r2, r1)
             }
             else -> {
-                val types = context.processingEnv.typeUtils
                 typeConverters.firstOrNull {
-                    it.from.isSameType(types, converter.to) &&
-                            it.to.isSameType(types, converter.from)
+                    it.from.isSameType(converter.to) &&
+                            it.to.isSameType(converter.from)
                 }
             }
         }
@@ -291,7 +278,7 @@
      * Finds a two way converter, if you need 1 way, use findStatementValueBinder or
      * findCursorValueReader.
      */
-    fun findColumnTypeAdapter(out: TypeMirror, affinity: SQLTypeAffinity?): ColumnTypeAdapter? {
+    fun findColumnTypeAdapter(out: XType, affinity: SQLTypeAffinity?): ColumnTypeAdapter? {
         if (out.isError()) {
             return null
         }
@@ -309,7 +296,7 @@
     }
 
     private fun findDirectAdapterFor(
-        out: TypeMirror,
+        out: XType,
         affinity: SQLTypeAffinity?
     ): ColumnTypeAdapter? {
         return getAllColumnAdapters(out).firstOrNull {
@@ -317,11 +304,11 @@
         }
     }
 
-    fun findTypeConverter(input: TypeMirror, output: TypeMirror): TypeConverter? {
+    fun findTypeConverter(input: XType, output: XType): TypeConverter? {
         return findTypeConverter(listOf(input), listOf(output))
     }
 
-    fun findDeleteOrUpdateMethodBinder(typeMirror: TypeMirror): DeleteOrUpdateMethodBinder {
+    fun findDeleteOrUpdateMethodBinder(typeMirror: XType): DeleteOrUpdateMethodBinder {
         val adapter = findDeleteOrUpdateAdapter(typeMirror)
         return if (typeMirror.isDeclared()) {
             deleteOrUpdateBinderProvider.first {
@@ -333,7 +320,7 @@
     }
 
     fun findInsertMethodBinder(
-        typeMirror: TypeMirror,
+        typeMirror: XType,
         params: List<ShortcutQueryParameter>
     ): InsertMethodBinder {
         return if (typeMirror.isDeclared()) {
@@ -345,7 +332,7 @@
         }
     }
 
-    fun findQueryResultBinder(typeMirror: TypeMirror, query: ParsedQuery): QueryResultBinder {
+    fun findQueryResultBinder(typeMirror: XType, query: ParsedQuery): QueryResultBinder {
         return if (typeMirror.isDeclared()) {
             return queryResultBinderProviders.first {
                 it.matches(typeMirror)
@@ -356,7 +343,7 @@
     }
 
     fun findPreparedQueryResultBinder(
-        typeMirror: TypeMirror,
+        typeMirror: XType,
         query: ParsedQuery
     ): PreparedQueryResultBinder {
         return if (typeMirror.isDeclared()) {
@@ -368,21 +355,21 @@
         }
     }
 
-    fun findPreparedQueryResultAdapter(typeMirror: TypeMirror, query: ParsedQuery) =
+    fun findPreparedQueryResultAdapter(typeMirror: XType, query: ParsedQuery) =
         PreparedQueryResultAdapter.create(typeMirror, query.type)
 
-    fun findDeleteOrUpdateAdapter(typeMirror: TypeMirror): DeleteOrUpdateMethodAdapter? {
+    fun findDeleteOrUpdateAdapter(typeMirror: XType): DeleteOrUpdateMethodAdapter? {
         return DeleteOrUpdateMethodAdapter.create(typeMirror)
     }
 
     fun findInsertAdapter(
-        typeMirror: TypeMirror,
+        typeMirror: XType,
         params: List<ShortcutQueryParameter>
     ): InsertMethodAdapter? {
         return InsertMethodAdapter.create(typeMirror, params)
     }
 
-    fun findQueryResultAdapter(typeMirror: TypeMirror, query: ParsedQuery): QueryResultAdapter? {
+    fun findQueryResultAdapter(typeMirror: XType, query: ParsedQuery): QueryResultAdapter? {
         if (typeMirror.isError()) {
             return null
         }
@@ -390,15 +377,13 @@
             if (typeMirror.typeArguments.isEmpty()) {
                 val rowAdapter = findRowAdapter(typeMirror, query) ?: return null
                 return SingleEntityQueryResultAdapter(rowAdapter)
-            } else if (typeMirror.erasure(context.processingEnv.typeUtils).typeName() ==
-                    GuavaBaseTypeNames.OPTIONAL) {
+            } else if (typeMirror.erasure().typeName == GuavaBaseTypeNames.OPTIONAL) {
                 // Handle Guava Optional by unpacking its generic type argument and adapting that.
                 // The Optional adapter will reappend the Optional type.
                 val typeArg = typeMirror.typeArguments.first()
                 val rowAdapter = findRowAdapter(typeArg, query) ?: return null
                 return GuavaOptionalQueryResultAdapter(SingleEntityQueryResultAdapter(rowAdapter))
-            } else if (typeMirror.erasure(context.processingEnv.typeUtils).typeName() ==
-                    CommonTypeNames.OPTIONAL) {
+            } else if (typeMirror.erasure().typeName == CommonTypeNames.OPTIONAL) {
                 // Handle java.util.Optional similarly.
                 val typeArg = typeMirror.typeArguments.first()
                 val rowAdapter = findRowAdapter(typeArg, query) ?: return null
@@ -427,7 +412,7 @@
      * Find a converter from cursor to the given type mirror.
      * If there is information about the query result, we try to use it to accept *any* POJO.
      */
-    fun findRowAdapter(typeMirror: TypeMirror, query: ParsedQuery): RowAdapter? {
+    fun findRowAdapter(typeMirror: XType, query: ParsedQuery): RowAdapter? {
         if (typeMirror.isError()) {
             return null
         }
@@ -460,7 +445,7 @@
 
             if (rowAdapter == null && query.resultInfo == null) {
                 // we don't know what query returns. Check for entity.
-                val asElement = typeMirror.asElement()
+                val asElement = typeMirror.asTypeElement()
                 if (asElement.isEntityElement()) {
                     return EntityRowAdapter(EntityProcessor(
                             context = context,
@@ -508,13 +493,9 @@
         }
     }
 
-    fun findQueryParameterAdapter(typeMirror: TypeMirror): QueryParameterAdapter? {
-        val typeUtils = context.processingEnv.typeUtils
+    fun findQueryParameterAdapter(typeMirror: XType): QueryParameterAdapter? {
         if (typeMirror.isType() &&
-            context.COMMON_TYPES.COLLECTION.erasure(typeUtils).isAssignableFrom(
-                typeUtils,
-                typeMirror
-            )) {
+            context.COMMON_TYPES.COLLECTION.erasure().isAssignableFrom(typeMirror)) {
             val declared = typeMirror.asDeclaredType()
             val binder = findStatementValueBinder(
                 declared.typeArguments.first().extendsBoundOrSelf(), null)
@@ -535,34 +516,33 @@
         }
     }
 
-    private fun findTypeConverter(input: TypeMirror, outputs: List<TypeMirror>): TypeConverter? {
+    private fun findTypeConverter(input: XType, outputs: List<XType>): TypeConverter? {
         return findTypeConverter(listOf(input), outputs)
     }
 
-    private fun findTypeConverter(input: List<TypeMirror>, output: TypeMirror): TypeConverter? {
+    private fun findTypeConverter(input: List<XType>, output: XType): TypeConverter? {
         return findTypeConverter(input, listOf(output))
     }
 
     private fun findTypeConverter(
-        inputs: List<TypeMirror>,
-        outputs: List<TypeMirror>
+        inputs: List<XType>,
+        outputs: List<XType>
     ): TypeConverter? {
         if (inputs.isEmpty()) {
             return null
         }
-        val types = context.processingEnv.typeUtils
         inputs.forEach { input ->
-            if (outputs.any { output -> input.isSameType(types, output) }) {
+            if (outputs.any { output -> input.isSameType(output) }) {
                 return NoOpConverter(input)
             }
         }
 
-        val excludes = arrayListOf<TypeMirror>()
+        val excludes = arrayListOf<XType>()
 
         val queue = LinkedList<TypeConverter>()
         fun exactMatch(candidates: List<TypeConverter>): TypeConverter? {
             return candidates.firstOrNull {
-                outputs.any { output -> it.to.isAssignableFromWithoutVariance(types, output) }
+                outputs.any { output -> it.to.isAssignableFromWithoutVariance(output) }
             }
         }
         inputs.forEach { input ->
@@ -593,9 +573,9 @@
         return null
     }
 
-    private fun getAllColumnAdapters(input: TypeMirror): List<ColumnTypeAdapter> {
+    private fun getAllColumnAdapters(input: XType): List<ColumnTypeAdapter> {
         return columnTypeAdapters.filter {
-            input.isSameType(context.processingEnv.typeUtils, it.out)
+            input.isSameType(it.out)
         }
     }
 
@@ -604,17 +584,16 @@
      * The returned list is ordered by priority such that if we have an exact match, it is
      * prioritized.
      */
-    private fun getAllTypeConverters(input: TypeMirror, excludes: List<TypeMirror>):
+    private fun getAllTypeConverters(input: XType, excludes: List<XType>):
             List<TypeConverter> {
-        val types = context.processingEnv.typeUtils
         // for input, check assignability because it defines whether we can use the method or not.
         // for excludes, use exact match
         return typeConverters.filter { converter ->
-            converter.from.isAssignableFrom(types, input) &&
-                    !excludes.any { it.isSameType(types, converter.to) }
+            converter.from.isAssignableFrom(input) &&
+                    !excludes.any { it.isSameType(converter.to) }
         }.sortedByDescending {
             // if it is the same, prioritize
-            if (it.from.isSameType(types, input)) {
+            if (it.from.isSameType(input)) {
                 2
             } else {
                 1
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/CoroutineFlowResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/CoroutineFlowResultBinderProvider.kt
index 3e145b1..286d620 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/CoroutineFlowResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/CoroutineFlowResultBinderProvider.kt
@@ -18,15 +18,13 @@
 
 import androidx.room.ext.KotlinTypeNames
 import androidx.room.ext.RoomCoroutinesTypeNames
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.QueryResultBinderProvider
 import androidx.room.solver.query.result.CoroutineFlowResultBinder
 import androidx.room.solver.query.result.QueryResultBinder
-import erasure
-import javax.lang.model.type.DeclaredType
 
 @Suppress("FunctionName")
 fun CoroutineFlowResultBinderProvider(context: Context): QueryResultBinderProvider =
@@ -49,7 +47,7 @@
         )
     }
 
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         val typeArg = declared.typeArguments.first()
         val adapter = context.typeAdapterStore.findQueryResultAdapter(typeArg, query)
         val tableNames = ((adapter?.accessedTableNames() ?: emptyList()) +
@@ -60,11 +58,11 @@
         return CoroutineFlowResultBinder(typeArg, tableNames, adapter)
     }
 
-    override fun matches(declared: DeclaredType): Boolean {
+    override fun matches(declared: XDeclaredType): Boolean {
         if (declared.typeArguments.size != 1) {
             return false
         }
-        val typeName = declared.erasure(context.processingEnv.typeUtils).typeName()
+        val typeName = declared.erasure().typeName
         if (typeName in CHANNEL_TYPE_NAMES) {
             context.logger.e(ProcessorErrors.invalidChannelType(typeName.toString()))
             return false
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/CursorQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/CursorQueryResultBinderProvider.kt
index 1dcbfbd..6e08b73 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/CursorQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/CursorQueryResultBinderProvider.kt
@@ -17,19 +17,18 @@
 package androidx.room.solver.binderprovider
 
 import androidx.room.ext.AndroidTypeNames
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.solver.QueryResultBinderProvider
 import androidx.room.solver.query.result.CursorQueryResultBinder
 import androidx.room.solver.query.result.QueryResultBinder
-import javax.lang.model.type.DeclaredType
 
 class CursorQueryResultBinderProvider(val context: Context) : QueryResultBinderProvider {
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         return CursorQueryResultBinder()
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
-        declared.typeArguments.size == 0 && declared.typeName() == AndroidTypeNames.CURSOR
+    override fun matches(declared: XDeclaredType): Boolean =
+        declared.typeArguments.isEmpty() && declared.typeName == AndroidTypeNames.CURSOR
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/DataSourceFactoryQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/DataSourceFactoryQueryResultBinderProvider.kt
index 9f2db8c..bf79b16 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/DataSourceFactoryQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/DataSourceFactoryQueryResultBinderProvider.kt
@@ -17,8 +17,9 @@
 package androidx.room.solver.binderprovider
 
 import androidx.room.ext.PagingTypeNames
-import androidx.room.ext.findTypeMirror
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.QueryResultBinderProvider
@@ -26,17 +27,13 @@
 import androidx.room.solver.query.result.ListQueryResultAdapter
 import androidx.room.solver.query.result.PositionalDataSourceQueryResultBinder
 import androidx.room.solver.query.result.QueryResultBinder
-import erasure
-import isAssignableFrom
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 class DataSourceFactoryQueryResultBinderProvider(val context: Context) : QueryResultBinderProvider {
-    private val dataSourceFactoryTypeMirror: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(PagingTypeNames.DATA_SOURCE_FACTORY)
+    private val dataSourceFactoryTypeMirror: XType? by lazy {
+        context.processingEnv.findType(PagingTypeNames.DATA_SOURCE_FACTORY)
     }
 
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         if (query.tables.isEmpty()) {
             context.logger.e(ProcessorErrors.OBSERVABLE_QUERY_NOTHING_TO_OBSERVE)
         }
@@ -51,19 +48,15 @@
         return DataSourceFactoryQueryResultBinder(countedBinder)
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
             declared.typeArguments.size == 2 && isLivePagedList(declared)
 
-    private fun isLivePagedList(declared: DeclaredType): Boolean {
+    private fun isLivePagedList(declared: XDeclaredType): Boolean {
         if (dataSourceFactoryTypeMirror == null) {
             return false
         }
-        val typeUtils = context.processingEnv.typeUtils
-        val erasure = declared.erasure(typeUtils)
+        val erasure = declared.erasure()
         // we don't want to return paged list unless explicitly requested
-        return erasure.isAssignableFrom(
-            typeUtils,
-            dataSourceFactoryTypeMirror!!
-        )
+        return erasure.isAssignableFrom(dataSourceFactoryTypeMirror!!)
     }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/DataSourceQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/DataSourceQueryResultBinderProvider.kt
index 7cd0505..b7d5ef12 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/DataSourceQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/DataSourceQueryResultBinderProvider.kt
@@ -17,29 +17,26 @@
 package androidx.room.solver.binderprovider
 
 import androidx.room.ext.PagingTypeNames
-import androidx.room.ext.findTypeMirror
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.QueryResultBinderProvider
 import androidx.room.solver.query.result.ListQueryResultAdapter
 import androidx.room.solver.query.result.PositionalDataSourceQueryResultBinder
 import androidx.room.solver.query.result.QueryResultBinder
-import erasure
-import isAssignableFrom
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 class DataSourceQueryResultBinderProvider(val context: Context) : QueryResultBinderProvider {
-    private val dataSourceTypeMirror: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(PagingTypeNames.DATA_SOURCE)
+    private val dataSourceTypeMirror: XType? by lazy {
+        context.processingEnv.findType(PagingTypeNames.DATA_SOURCE)
     }
 
-    private val positionalDataSourceTypeMirror: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(PagingTypeNames.POSITIONAL_DATA_SOURCE)
+    private val positionalDataSourceTypeMirror: XType? by lazy {
+        context.processingEnv.findType(PagingTypeNames.POSITIONAL_DATA_SOURCE)
     }
 
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         if (query.tables.isEmpty()) {
             context.logger.e(ProcessorErrors.OBSERVABLE_QUERY_NOTHING_TO_OBSERVE)
         }
@@ -52,25 +49,19 @@
         return PositionalDataSourceQueryResultBinder(listAdapter, tableNames)
     }
 
-    override fun matches(declared: DeclaredType): Boolean {
+    override fun matches(declared: XDeclaredType): Boolean {
         if (dataSourceTypeMirror == null || positionalDataSourceTypeMirror == null) {
             return false
         }
         if (declared.typeArguments.isEmpty()) {
             return false
         }
-        val typeUtils = context.processingEnv.typeUtils
-        val erasure = declared.erasure(typeUtils)
-        val isDataSource = dataSourceTypeMirror!!.isAssignableFrom(
-            typeUtils,
-            erasure
-        )
+        val erasure = declared.erasure()
+        val isDataSource = dataSourceTypeMirror!!.isAssignableFrom(erasure)
         if (!isDataSource) {
             return false
         }
-        val isPositional = positionalDataSourceTypeMirror!!.isAssignableFrom(
-            typeUtils, erasure
-        )
+        val isPositional = positionalDataSourceTypeMirror!!.isAssignableFrom(erasure)
         if (!isPositional) {
             context.logger.e(ProcessorErrors.PAGING_SPECIFY_DATA_SOURCE_TYPE)
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/GuavaListenableFutureQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/GuavaListenableFutureQueryResultBinderProvider.kt
index 2eabc87..31aae30 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/GuavaListenableFutureQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/GuavaListenableFutureQueryResultBinderProvider.kt
@@ -18,15 +18,13 @@
 
 import androidx.room.ext.GuavaUtilConcurrentTypeNames
 import androidx.room.ext.RoomGuavaTypeNames
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.QueryResultBinderProvider
 import androidx.room.solver.query.result.GuavaListenableFutureQueryResultBinder
 import androidx.room.solver.query.result.QueryResultBinder
-import erasure
-import javax.lang.model.type.DeclaredType
 
 @Suppress("FunctionName")
 fun GuavaListenableFutureQueryResultBinderProvider(context: Context): QueryResultBinderProvider =
@@ -47,7 +45,7 @@
      *
      * <p>Emits a compiler error if the Guava Room extension library is not linked.
      */
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         // Use the type T inside ListenableFuture<T> as the type to adapt and to pass into
         // the binder.
         val adapter = context.typeAdapterStore.findQueryResultAdapter(
@@ -59,8 +57,7 @@
     /**
      * Returns true iff the input {@code declared} type is ListenableFuture<T>.
      */
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
         declared.typeArguments.size == 1 &&
-                declared.erasure(context.processingEnv.typeUtils).typeName() ==
-                        GuavaUtilConcurrentTypeNames.LISTENABLE_FUTURE
+                declared.erasure().typeName == GuavaUtilConcurrentTypeNames.LISTENABLE_FUTURE
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/InstantQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/InstantQueryResultBinderProvider.kt
index d0b1660..7e9a40c 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/InstantQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/InstantQueryResultBinderProvider.kt
@@ -17,17 +17,17 @@
 package androidx.room.solver.binderprovider
 
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.solver.QueryResultBinderProvider
 import androidx.room.solver.query.result.InstantQueryResultBinder
 import androidx.room.solver.query.result.QueryResultBinder
-import javax.lang.model.type.DeclaredType
 
 class InstantQueryResultBinderProvider(val context: Context) : QueryResultBinderProvider {
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         return InstantQueryResultBinder(
                 context.typeAdapterStore.findQueryResultAdapter(declared, query))
     }
 
-    override fun matches(declared: DeclaredType): Boolean = true
+    override fun matches(declared: XDeclaredType): Boolean = true
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/LiveDataQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/LiveDataQueryResultBinderProvider.kt
index 320343d..b1cae91 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/LiveDataQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/LiveDataQueryResultBinderProvider.kt
@@ -17,27 +17,24 @@
 package androidx.room.solver.binderprovider
 
 import androidx.room.ext.LifecyclesTypeNames
-import androidx.room.ext.findTypeMirror
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.solver.ObservableQueryResultBinderProvider
 import androidx.room.solver.query.result.LiveDataQueryResultBinder
 import androidx.room.solver.query.result.QueryResultAdapter
 import androidx.room.solver.query.result.QueryResultBinder
-import erasure
-import isAssignableFrom
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 class LiveDataQueryResultBinderProvider(context: Context) :
     ObservableQueryResultBinderProvider(context) {
-    private val liveDataTypeMirror: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(LifecyclesTypeNames.LIVE_DATA)
+    private val liveDataTypeMirror: XType? by lazy {
+        context.processingEnv.findType(LifecyclesTypeNames.LIVE_DATA)
     }
 
-    override fun extractTypeArg(declared: DeclaredType): TypeMirror = declared.typeArguments.first()
+    override fun extractTypeArg(declared: XDeclaredType): XType = declared.typeArguments.first()
 
     override fun create(
-        typeArg: TypeMirror,
+        typeArg: XType,
         resultAdapter: QueryResultAdapter?,
         tableNames: Set<String>
     ): QueryResultBinder {
@@ -47,15 +44,14 @@
                 adapter = resultAdapter)
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
             declared.typeArguments.size == 1 && isLiveData(declared)
 
-    private fun isLiveData(declared: DeclaredType): Boolean {
+    private fun isLiveData(declared: XDeclaredType): Boolean {
         if (liveDataTypeMirror == null) {
             return false
         }
-        val typeUtils = context.processingEnv.typeUtils
-        val erasure = declared.erasure(typeUtils)
-        return erasure.isAssignableFrom(typeUtils, liveDataTypeMirror!!)
+        val erasure = declared.erasure()
+        return erasure.isAssignableFrom(liveDataTypeMirror!!)
     }
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/PagingSourceQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/PagingSourceQueryResultBinderProvider.kt
index 19b5fb9..81053a5 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/PagingSourceQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/PagingSourceQueryResultBinderProvider.kt
@@ -17,9 +17,9 @@
 package androidx.room.solver.binderprovider
 
 import androidx.room.ext.PagingTypeNames
-import androidx.room.ext.findTypeMirror
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.QueryResultBinderProvider
@@ -28,17 +28,13 @@
 import androidx.room.solver.query.result.PositionalDataSourceQueryResultBinder
 import androidx.room.solver.query.result.QueryResultBinder
 import com.squareup.javapoet.TypeName
-import erasure
-import isAssignableFrom
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 class PagingSourceQueryResultBinderProvider(val context: Context) : QueryResultBinderProvider {
-    private val pagingSourceTypeMirror: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(PagingTypeNames.PAGING_SOURCE)
+    private val pagingSourceTypeMirror: XType? by lazy {
+        context.processingEnv.findType(PagingTypeNames.PAGING_SOURCE)
     }
 
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         if (query.tables.isEmpty()) {
             context.logger.e(ProcessorErrors.OBSERVABLE_QUERY_NOTHING_TO_OBSERVE)
         }
@@ -53,7 +49,7 @@
         )
     }
 
-    override fun matches(declared: DeclaredType): Boolean {
+    override fun matches(declared: XDeclaredType): Boolean {
         if (pagingSourceTypeMirror == null) {
             return false
         }
@@ -62,13 +58,12 @@
             return false
         }
 
-        val typeUtils = context.processingEnv.typeUtils
-        val erasure = declared.erasure(typeUtils)
-        if (!pagingSourceTypeMirror!!.isAssignableFrom(typeUtils, erasure)) {
+        val erasure = declared.erasure()
+        if (!pagingSourceTypeMirror!!.isAssignableFrom(erasure)) {
             return false
         }
 
-        if (declared.typeArguments.first().typeName() != TypeName.INT.box()) {
+        if (declared.typeArguments.first().typeName != TypeName.INT.box()) {
             context.logger.e(ProcessorErrors.PAGING_SPECIFY_PAGING_SOURCE_TYPE)
         }
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/QueryResultBinderProviderWithRequiredArtifact.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/QueryResultBinderProviderWithRequiredArtifact.kt
index 2a6c57a..7e39c45 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/QueryResultBinderProviderWithRequiredArtifact.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/QueryResultBinderProviderWithRequiredArtifact.kt
@@ -15,13 +15,12 @@
  */
 package androidx.room.solver.binderprovider
 
-import androidx.room.ext.findTypeElement
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.solver.QueryResultBinderProvider
 import androidx.room.solver.query.result.QueryResultBinder
 import com.squareup.javapoet.TypeName
-import javax.lang.model.type.DeclaredType
 
 /**
  * Common functionality for binder providers that require an additional artifact
@@ -47,11 +46,11 @@
         context.processingEnv.findTypeElement(requiredType) != null
     }
 
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         return delegate.provide(declared, query)
     }
 
-    override fun matches(declared: DeclaredType): Boolean {
+    override fun matches(declared: XDeclaredType): Boolean {
         val result = delegate.matches(declared)
         if (result && !hasRequiredArtifact) {
             context.logger.e(missingArtifactErrorMsg)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/RxCallableQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/RxCallableQueryResultBinderProvider.kt
index 4725127..278a1aa 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/RxCallableQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/RxCallableQueryResultBinderProvider.kt
@@ -16,32 +16,30 @@
 
 package androidx.room.solver.binderprovider
 
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.solver.QueryResultBinderProvider
 import androidx.room.solver.RxType
 import androidx.room.solver.query.result.QueryResultBinder
 import androidx.room.solver.query.result.RxCallableQueryResultBinder
-import erasure
-import javax.lang.model.type.DeclaredType
 
 class RxCallableQueryResultBinderProvider private constructor(
     val context: Context,
     private val rxType: RxType
 ) : QueryResultBinderProvider {
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         val typeArg = declared.typeArguments.first()
         val adapter = context.typeAdapterStore.findQueryResultAdapter(typeArg, query)
         return RxCallableQueryResultBinder(rxType, typeArg, adapter)
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
         declared.typeArguments.size == 1 && matchesRxType(declared)
 
-    private fun matchesRxType(declared: DeclaredType): Boolean {
-        val erasure = declared.erasure(context.processingEnv.typeUtils)
-        return erasure.typeName() == rxType.className
+    private fun matchesRxType(declared: XDeclaredType): Boolean {
+        val erasure = declared.erasure()
+        return erasure.typeName == rxType.className
     }
 
     companion object {
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/RxQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/RxQueryResultBinderProvider.kt
index 938deea..fae68af 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/RxQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/RxQueryResultBinderProvider.kt
@@ -16,30 +16,27 @@
 
 package androidx.room.solver.binderprovider
 
-import androidx.room.ext.findTypeMirror
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.solver.ObservableQueryResultBinderProvider
 import androidx.room.solver.RxType
 import androidx.room.solver.query.result.QueryResultAdapter
 import androidx.room.solver.query.result.QueryResultBinder
 import androidx.room.solver.query.result.RxQueryResultBinder
-import erasure
-import isAssignableFrom
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 class RxQueryResultBinderProvider private constructor(
     context: Context,
     private val rxType: RxType
 ) : ObservableQueryResultBinderProvider(context) {
-    private val typeMirror: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(rxType.className)
+    private val typeMirror: XType? by lazy {
+        context.processingEnv.findType(rxType.className)
     }
 
-    override fun extractTypeArg(declared: DeclaredType): TypeMirror = declared.typeArguments.first()
+    override fun extractTypeArg(declared: XDeclaredType): XType = declared.typeArguments.first()
 
     override fun create(
-        typeArg: TypeMirror,
+        typeArg: XType,
         resultAdapter: QueryResultAdapter?,
         tableNames: Set<String>
     ): QueryResultBinder {
@@ -51,16 +48,15 @@
         )
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
         declared.typeArguments.size == 1 && matchesRxType(declared)
 
-    private fun matchesRxType(declared: DeclaredType): Boolean {
+    private fun matchesRxType(declared: XDeclaredType): Boolean {
         if (typeMirror == null) {
             return false
         }
-        val typeUtils = context.processingEnv.typeUtils
-        val erasure = declared.erasure(typeUtils)
-        return erasure.isAssignableFrom(typeUtils, typeMirror!!)
+        val erasure = declared.erasure()
+        return erasure.isAssignableFrom(typeMirror!!)
     }
 
     companion object {
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/CallablePreparedQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/CallablePreparedQueryResultBinder.kt
index 74b084f..617dab3 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/CallablePreparedQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/CallablePreparedQueryResultBinder.kt
@@ -17,13 +17,12 @@
 package androidx.room.solver.prepared.binder
 
 import androidx.room.ext.CallableTypeSpecBuilder
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.prepared.result.PreparedQueryResultAdapter
 import com.squareup.javapoet.CodeBlock
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.TypeSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binder for deferred queries.
@@ -33,14 +32,14 @@
  * function.
  */
 class CallablePreparedQueryResultBinder private constructor(
-    val returnType: TypeMirror,
+    val returnType: XType,
     val addStmntBlock: CodeBlock.Builder.(callableImpl: TypeSpec, dbField: FieldSpec) -> Unit,
     adapter: PreparedQueryResultAdapter?
 ) : PreparedQueryResultBinder(adapter) {
 
     companion object {
         fun createPreparedBinder(
-            returnType: TypeMirror,
+            returnType: XType,
             adapter: PreparedQueryResultAdapter?,
             addCodeBlock: CodeBlock.Builder.(callableImpl: TypeSpec, dbField: FieldSpec) -> Unit
         ) = CallablePreparedQueryResultBinder(returnType, addCodeBlock, adapter)
@@ -53,7 +52,7 @@
         scope: CodeGenScope
     ) {
         val binderScope = scope.fork()
-        val callableImpl = CallableTypeSpecBuilder(returnType.typeName()) {
+        val callableImpl = CallableTypeSpecBuilder(returnType.typeName) {
             adapter?.executeAndReturn(
                 binderScope.prepareQueryStmtBlock(),
                 preparedStmtField,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/GuavaListenableFuturePreparedQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/GuavaListenableFuturePreparedQueryResultBinderProvider.kt
index 8063f81..5656cad 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/GuavaListenableFuturePreparedQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/GuavaListenableFuturePreparedQueryResultBinderProvider.kt
@@ -21,15 +21,12 @@
 import androidx.room.ext.N
 import androidx.room.ext.RoomGuavaTypeNames
 import androidx.room.ext.T
-import androidx.room.ext.findTypeElement
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.prepared.binder.CallablePreparedQueryResultBinder.Companion.createPreparedBinder
 import androidx.room.solver.prepared.binder.PreparedQueryResultBinder
-import erasure
-import javax.lang.model.type.DeclaredType
 
 class GuavaListenableFuturePreparedQueryResultBinderProvider(val context: Context) :
     PreparedQueryResultBinderProvider {
@@ -38,12 +35,12 @@
         context.processingEnv.findTypeElement(RoomGuavaTypeNames.GUAVA_ROOM) != null
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
         declared.typeArguments.size == 1 &&
-                declared.erasure(context.processingEnv.typeUtils).typeName() ==
+                declared.erasure().typeName ==
                 GuavaUtilConcurrentTypeNames.LISTENABLE_FUTURE
 
-    override fun provide(declared: DeclaredType, query: ParsedQuery): PreparedQueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): PreparedQueryResultBinder {
         if (!hasGuavaRoom) {
             context.logger.e(ProcessorErrors.MISSING_ROOM_GUAVA_ARTIFACT)
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/InstantPreparedQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/InstantPreparedQueryResultBinderProvider.kt
index 4086648..2082ac4 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/InstantPreparedQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/InstantPreparedQueryResultBinderProvider.kt
@@ -17,18 +17,18 @@
 package androidx.room.solver.prepared.binderprovider
 
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.solver.prepared.binder.InstantPreparedQueryResultBinder
-import javax.lang.model.type.DeclaredType
 
 class InstantPreparedQueryResultBinderProvider(
     val context: Context
 ) : PreparedQueryResultBinderProvider {
 
-    override fun matches(declared: DeclaredType) = true
+    override fun matches(declared: XDeclaredType) = true
 
     override fun provide(
-        declared: DeclaredType,
+        declared: XDeclaredType,
         query: ParsedQuery
     ) = InstantPreparedQueryResultBinder(
         context.typeAdapterStore.findPreparedQueryResultAdapter(declared, query)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/PreparedQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/PreparedQueryResultBinderProvider.kt
index 3a639b1..fd97081 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/PreparedQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/PreparedQueryResultBinderProvider.kt
@@ -17,8 +17,8 @@
 package androidx.room.solver.prepared.binderprovider
 
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.solver.prepared.binder.PreparedQueryResultBinder
-import javax.lang.model.type.DeclaredType
 
 /**
  * Interface for for providing the appropriate [PreparedQueryResultBinder] given a query and a
@@ -26,13 +26,13 @@
  */
 interface PreparedQueryResultBinderProvider {
     /**
-     * Check whether the [DeclaredType] can be handled by the [PreparedQueryResultBinder] provided
+     * Check whether the [XDeclaredType] can be handled by the [PreparedQueryResultBinder] provided
      * by this provider.
      */
-    fun matches(declared: DeclaredType): Boolean
+    fun matches(declared: XDeclaredType): Boolean
 
     /**
      * Provides a [PreparedQueryResultBinder]
      */
-    fun provide(declared: DeclaredType, query: ParsedQuery): PreparedQueryResultBinder
+    fun provide(declared: XDeclaredType, query: ParsedQuery): PreparedQueryResultBinder
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/RxPreparedQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/RxPreparedQueryResultBinderProvider.kt
index 85d7b98..c12bf40 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/RxPreparedQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/RxPreparedQueryResultBinderProvider.kt
@@ -18,18 +18,13 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.findTypeElement
-import androidx.room.ext.findTypeMirror
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.solver.RxType
 import androidx.room.solver.prepared.binder.CallablePreparedQueryResultBinder.Companion.createPreparedBinder
 import androidx.room.solver.prepared.binder.PreparedQueryResultBinder
-import erasure
-import isAssignableFrom
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 open class RxPreparedQueryResultBinderProvider internal constructor(
     val context: Context,
@@ -40,15 +35,15 @@
         context.processingEnv.findTypeElement(rxType.version.rxRoomClassName) != null
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
         declared.typeArguments.size == 1 && matchesRxType(declared)
 
-    private fun matchesRxType(declared: DeclaredType): Boolean {
-        val erasure = declared.erasure(context.processingEnv.typeUtils)
-        return erasure.typeName() == rxType.className
+    private fun matchesRxType(declared: XDeclaredType): Boolean {
+        val erasure = declared.erasure()
+        return erasure.typeName == rxType.className
     }
 
-    override fun provide(declared: DeclaredType, query: ParsedQuery): PreparedQueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): PreparedQueryResultBinder {
         if (!hasRxJavaArtifact) {
             context.logger.e(rxType.version.missingArtifactMessage)
         }
@@ -61,7 +56,7 @@
         }
     }
 
-    open fun extractTypeArg(declared: DeclaredType): TypeMirror = declared.typeArguments.first()
+    open fun extractTypeArg(declared: XDeclaredType): XType = declared.typeArguments.first()
 
     companion object {
         fun getAll(context: Context) = listOf(
@@ -80,18 +75,17 @@
     rxType: RxType
 ) : RxPreparedQueryResultBinderProvider(context, rxType) {
 
-    private val completableType: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(rxType.className)
+    private val completableType: XType? by lazy {
+        context.processingEnv.findType(rxType.className)
     }
 
-    override fun matches(declared: DeclaredType): Boolean {
+    override fun matches(declared: XDeclaredType): Boolean {
         if (completableType == null) {
             return false
         }
-        val typeUtils = context.processingEnv.typeUtils
-        val erasure = declared.erasure(typeUtils)
-        return erasure.isAssignableFrom(typeUtils, completableType!!)
+        val erasure = declared.erasure()
+        return erasure.isAssignableFrom(completableType!!)
     }
 
-    override fun extractTypeArg(declared: DeclaredType) = context.COMMON_TYPES.VOID
+    override fun extractTypeArg(declared: XDeclaredType) = context.COMMON_TYPES.VOID
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/result/PreparedQueryResultAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/result/PreparedQueryResultAdapter.kt
index d612453..4928df3 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/result/PreparedQueryResultAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/result/PreparedQueryResultAdapter.kt
@@ -20,29 +20,23 @@
 import androidx.room.ext.L
 import androidx.room.ext.N
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.parser.QueryType
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.prepared.binder.PreparedQueryResultBinder
 import com.squareup.javapoet.FieldSpec
-import isInt
-import isKotlinUnit
-import isLong
-import isVoid
-import isVoidObject
-import javax.lang.model.type.TypeMirror
 
 /**
  * An adapter for [PreparedQueryResultBinder] that executes queries with INSERT, UPDATE or DELETE
  * statements.
  */
 class PreparedQueryResultAdapter(
-    private val returnType: TypeMirror,
+    private val returnType: XType,
     private val queryType: QueryType
 ) {
     companion object {
         fun create(
-            returnType: TypeMirror,
+            returnType: XType,
             queryType: QueryType
         ) = if (isValidReturnType(returnType, queryType)) {
             PreparedQueryResultAdapter(returnType, queryType)
@@ -50,7 +44,7 @@
             null
         }
 
-        private fun isValidReturnType(returnType: TypeMirror, queryType: QueryType): Boolean {
+        private fun isValidReturnType(returnType: XType, queryType: QueryType): Boolean {
             if (returnType.isVoid() || returnType.isVoidObject() || returnType.isKotlinUnit()) {
                 return true
             } else {
@@ -89,7 +83,7 @@
                     val resultVar = scope.getTmpVar("_result")
                     addStatement(
                         "final $L $L = $L.$L()",
-                        returnType.typeName(), resultVar, stmtQueryVal, stmtMethod
+                        returnType.typeName, resultVar, stmtQueryVal, stmtMethod
                     )
                     addStatement("$N.setTransactionSuccessful()", dbField)
                     addStatement("return $L", resultVar)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/parameter/ArrayQueryParameterAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/parameter/ArrayQueryParameterAdapter.kt
index 0dd9732..477e0e9 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/parameter/ArrayQueryParameterAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/parameter/ArrayQueryParameterAdapter.kt
@@ -18,7 +18,6 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.types.StatementValueBinder
 import com.squareup.javapoet.TypeName
@@ -36,7 +35,7 @@
     ) {
         scope.builder().apply {
             val itrVar = scope.getTmpVar("_item")
-            beginControlFlow("for ($T $L : $L)", bindAdapter.typeMirror().typeName(), itrVar,
+            beginControlFlow("for ($T $L : $L)", bindAdapter.typeMirror().typeName, itrVar,
                     inputVarName).apply {
                         bindAdapter.bindToStmt(stmtVarName, startIndexVarName, itrVar, scope)
                         addStatement("$L ++", startIndexVarName)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/parameter/CollectionQueryParameterAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/parameter/CollectionQueryParameterAdapter.kt
index e61f014..b935167 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/parameter/CollectionQueryParameterAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/parameter/CollectionQueryParameterAdapter.kt
@@ -18,7 +18,6 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.types.StatementValueBinder
 import com.squareup.javapoet.TypeName
@@ -36,7 +35,7 @@
     ) {
         scope.builder().apply {
             val itrVar = scope.getTmpVar("_item")
-            beginControlFlow("for ($T $L : $L)", bindAdapter.typeMirror().typeName(), itrVar,
+            beginControlFlow("for ($T $L : $L)", bindAdapter.typeMirror().typeName, itrVar,
                     inputVarName).apply {
                         bindAdapter.bindToStmt(stmtVarName, startIndexVarName, itrVar, scope)
                         addStatement("$L ++", startIndexVarName)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ArrayQueryResultAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ArrayQueryResultAdapter.kt
index 86a1c41..549e0df 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ArrayQueryResultAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ArrayQueryResultAdapter.kt
@@ -18,7 +18,6 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.ArrayTypeName
 import com.squareup.javapoet.TypeName
@@ -29,14 +28,14 @@
         scope.builder().apply {
             rowAdapter?.onCursorReady(cursorVarName, scope)
 
-            val arrayType = ArrayTypeName.of(type.typeName())
+            val arrayType = ArrayTypeName.of(type.typeName)
             addStatement("final $T $L = new $T[$L.getCount()]",
-                    arrayType, outVarName, type.typeName(), cursorVarName)
+                    arrayType, outVarName, type.typeName, cursorVarName)
             val tmpVarName = scope.getTmpVar("_item")
             val indexVar = scope.getTmpVar("_index")
             addStatement("$T $L = 0", TypeName.INT, indexVar)
             beginControlFlow("while($L.moveToNext())", cursorVarName).apply {
-                addStatement("final $T $L", type.typeName(), tmpVarName)
+                addStatement("final $T $L", type.typeName, tmpVarName)
                 rowAdapter?.convert(tmpVarName, cursorVarName, scope)
                 addStatement("$L[$L] = $L", outVarName, indexVar, tmpVarName)
                 addStatement("$L ++", indexVar)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/CoroutineFlowResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/CoroutineFlowResultBinder.kt
index 3feb379..a582db4 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/CoroutineFlowResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/CoroutineFlowResultBinder.kt
@@ -22,16 +22,15 @@
 import androidx.room.ext.RoomCoroutinesTypeNames
 import androidx.room.ext.T
 import androidx.room.ext.arrayTypeName
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.FieldSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binds the result of a of a Kotlin Coroutine Flow<T>
  */
 class CoroutineFlowResultBinder(
-    val typeArg: TypeMirror,
+    val typeArg: XType,
     val tableNames: Set<String>,
     adapter: QueryResultAdapter?
 ) : BaseObservableQueryResultBinder(adapter) {
@@ -43,7 +42,7 @@
         inTransaction: Boolean,
         scope: CodeGenScope
     ) {
-        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName()) {
+        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName) {
             createRunQueryAndReturnStatements(
                 builder = this,
                 roomSQLiteQueryVar = roomSQLiteQueryVar,
@@ -64,7 +63,7 @@
                 RoomCoroutinesTypeNames.COROUTINES_ROOM,
                 dbField,
                 if (inTransaction) "true" else "false",
-                String::class.arrayTypeName(),
+                String::class.arrayTypeName,
                 tableNamesList,
                 callableImpl)
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/CoroutineResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/CoroutineResultBinder.kt
index 861fa1f..ee02de6 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/CoroutineResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/CoroutineResultBinder.kt
@@ -23,17 +23,16 @@
 import androidx.room.ext.RoomCoroutinesTypeNames
 import androidx.room.ext.RoomTypeNames
 import androidx.room.ext.T
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.MethodSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binds the result of a of a Kotlin coroutine suspend function.
  */
 class CoroutineResultBinder(
-    val typeArg: TypeMirror,
+    val typeArg: XType,
     private val continuationParamName: String,
     adapter: QueryResultAdapter?
 ) : QueryResultBinder(adapter) {
@@ -53,7 +52,7 @@
             RoomTypeNames.DB_UTIL
         )
 
-        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName()) {
+        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName) {
             createRunQueryAndReturnStatements(
                 builder = this,
                 roomSQLiteQueryVar = roomSQLiteQueryVar,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/GuavaListenableFutureQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/GuavaListenableFutureQueryResultBinder.kt
index 5a6536f..b181526 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/GuavaListenableFutureQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/GuavaListenableFutureQueryResultBinder.kt
@@ -17,16 +17,15 @@
 package androidx.room.solver.query.result
 
 import androidx.room.ext.AndroidTypeNames
+import androidx.room.ext.CallableTypeSpecBuilder
 import androidx.room.ext.L
 import androidx.room.ext.N
 import androidx.room.ext.RoomGuavaTypeNames
-import androidx.room.ext.T
-import androidx.room.ext.CallableTypeSpecBuilder
 import androidx.room.ext.RoomTypeNames
-import androidx.room.ext.typeName
+import androidx.room.ext.T
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.FieldSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * A ResultBinder that emits a ListenableFuture<T> where T is the input {@code typeArg}.
@@ -34,7 +33,7 @@
  * <p>The Future runs on the background thread Executor.
  */
 class GuavaListenableFutureQueryResultBinder(
-    val typeArg: TypeMirror,
+    val typeArg: XType,
     adapter: QueryResultAdapter?
 ) : BaseObservableQueryResultBinder(adapter) {
 
@@ -54,7 +53,7 @@
         )
 
         // Callable<T> // Note that this callable does not release the query object.
-        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName()) {
+        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName) {
             createRunQueryAndReturnStatements(
                 builder = this,
                 roomSQLiteQueryVar = roomSQLiteQueryVar,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/GuavaOptionalQueryResultAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/GuavaOptionalQueryResultAdapter.kt
index 73da7aa..bbd3d4f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/GuavaOptionalQueryResultAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/GuavaOptionalQueryResultAdapter.kt
@@ -19,7 +19,6 @@
 import androidx.room.ext.GuavaBaseTypeNames
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.ParameterizedTypeName
 
@@ -40,7 +39,7 @@
             resultAdapter.convert(valueVarName, cursorVarName, scope)
             addStatement(
                     "final $T $L = $T.fromNullable($L)",
-                    ParameterizedTypeName.get(GuavaBaseTypeNames.OPTIONAL, type?.typeName()),
+                    ParameterizedTypeName.get(GuavaBaseTypeNames.OPTIONAL, type?.typeName),
                     outVarName,
                     GuavaBaseTypeNames.OPTIONAL,
                     valueVarName)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ImmutableListQueryResultAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ImmutableListQueryResultAdapter.kt
index 33dd5ab..3bf310d 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ImmutableListQueryResultAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ImmutableListQueryResultAdapter.kt
@@ -18,7 +18,6 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import com.google.common.collect.ImmutableList
 import com.squareup.javapoet.ClassName
@@ -30,16 +29,16 @@
         scope.builder().apply {
             rowAdapter?.onCursorReady(cursorVarName, scope)
             val collectionType = ParameterizedTypeName
-                .get(ClassName.get(ImmutableList::class.java), type.typeName())
+                .get(ClassName.get(ImmutableList::class.java), type.typeName)
             val immutableListBuilderType = ParameterizedTypeName
-                .get(ClassName.get(ImmutableList.Builder::class.java), type.typeName())
+                .get(ClassName.get(ImmutableList.Builder::class.java), type.typeName)
             val immutableListBuilderName = scope.getTmpVar("_immutableListBuilder")
             addStatement("final $T $L = $T.<$T>builder()",
                 immutableListBuilderType, immutableListBuilderName,
-                ClassName.get(ImmutableList::class.java), type.typeName())
+                ClassName.get(ImmutableList::class.java), type.typeName)
             val tmpVarName = scope.getTmpVar("_item")
             beginControlFlow("while($L.moveToNext())", cursorVarName).apply {
-                addStatement("final $T $L", type.typeName(), tmpVarName)
+                addStatement("final $T $L", type.typeName, tmpVarName)
                 rowAdapter?.convert(tmpVarName, cursorVarName, scope)
                 addStatement("$L.add($L)", immutableListBuilderName, tmpVarName)
             }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ListQueryResultAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ListQueryResultAdapter.kt
index a38c431..ba5f29d 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ListQueryResultAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ListQueryResultAdapter.kt
@@ -18,7 +18,6 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.ParameterizedTypeName
@@ -30,14 +29,14 @@
         scope.builder().apply {
             rowAdapter?.onCursorReady(cursorVarName, scope)
             val collectionType = ParameterizedTypeName
-                    .get(ClassName.get(List::class.java), type.typeName())
+                    .get(ClassName.get(List::class.java), type.typeName)
             val arrayListType = ParameterizedTypeName
-                    .get(ClassName.get(ArrayList::class.java), type.typeName())
+                    .get(ClassName.get(ArrayList::class.java), type.typeName)
             addStatement("final $T $L = new $T($L.getCount())",
                     collectionType, outVarName, arrayListType, cursorVarName)
             val tmpVarName = scope.getTmpVar("_item")
             beginControlFlow("while($L.moveToNext())", cursorVarName).apply {
-                addStatement("final $T $L", type.typeName(), tmpVarName)
+                addStatement("final $T $L", type.typeName, tmpVarName)
                 rowAdapter?.convert(tmpVarName, cursorVarName, scope)
                 addStatement("$L.add($L)", outVarName, tmpVarName)
             }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/LiveDataQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/LiveDataQueryResultBinder.kt
index 4491567..5aaf677 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/LiveDataQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/LiveDataQueryResultBinder.kt
@@ -21,16 +21,15 @@
 import androidx.room.ext.N
 import androidx.room.ext.T
 import androidx.room.ext.arrayTypeName
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.FieldSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * Converts the query into a LiveData and returns it. No query is run until necessary.
  */
 class LiveDataQueryResultBinder(
-    val typeArg: TypeMirror,
+    val typeArg: XType,
     val tableNames: Set<String>,
     adapter: QueryResultAdapter?
 ) : BaseObservableQueryResultBinder(adapter) {
@@ -42,7 +41,7 @@
         inTransaction: Boolean,
         scope: CodeGenScope
     ) {
-        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName()) {
+        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName) {
             createRunQueryAndReturnStatements(
                 builder = this,
                 roomSQLiteQueryVar = roomSQLiteQueryVar,
@@ -62,7 +61,7 @@
             addStatement(
                 "return $N.getInvalidationTracker().createLiveData(new $T{$L}, $L, $L)",
                 dbField,
-                String::class.arrayTypeName(),
+                String::class.arrayTypeName,
                 tableNamesList,
                 if (inTransaction) "true" else "false",
                 callableImpl
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/OptionalQueryResultAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/OptionalQueryResultAdapter.kt
index a79ad7b..f6f5157 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/OptionalQueryResultAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/OptionalQueryResultAdapter.kt
@@ -19,7 +19,6 @@
 import androidx.room.ext.CommonTypeNames
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.ParameterizedTypeName
 
@@ -42,7 +41,7 @@
             resultAdapter.convert(valueVarName, cursorVarName, scope)
             addStatement(
                     "final $T $L = $T.ofNullable($L)",
-                    ParameterizedTypeName.get(CommonTypeNames.OPTIONAL, type?.typeName()),
+                    ParameterizedTypeName.get(CommonTypeNames.OPTIONAL, type?.typeName),
                     outVarName,
                     CommonTypeNames.OPTIONAL,
                     valueVarName)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PagingQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PagingQueryResultBinder.kt
index a8a426f..4b08701 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PagingQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PagingQueryResultBinder.kt
@@ -51,7 +51,7 @@
                     superclass(
                         ParameterizedTypeName.get(
                             PagingTypeNames.DATA_SOURCE_FACTORY,
-                            Integer::class.typeName(),
+                            Integer::class.typeName,
                             typeName
                         )
                     )
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PojoRowAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PojoRowAdapter.kt
index 74d1a49..c3ec269 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PojoRowAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PojoRowAdapter.kt
@@ -20,6 +20,7 @@
 import androidx.room.ext.RoomTypeNames
 import androidx.room.ext.S
 import androidx.room.ext.T
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.CodeGenScope
@@ -33,7 +34,6 @@
 import androidx.room.writer.FieldReadWriteWriter
 import com.squareup.javapoet.TypeName
 import stripNonJava
-import javax.lang.model.type.TypeMirror
 
 /**
  * Creates the entity from the given info.
@@ -44,7 +44,7 @@
     context: Context,
     private val info: QueryResultInfo?,
     val pojo: Pojo,
-    out: TypeMirror
+    out: XType
 ) : RowAdapter(out) {
     val mapping: Mapping
     val relationCollectors: List<RelationCollector>
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PositionalDataSourceQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PositionalDataSourceQueryResultBinder.kt
index 8ddf99f..7da04a0f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PositionalDataSourceQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PositionalDataSourceQueryResultBinder.kt
@@ -21,7 +21,6 @@
 import androidx.room.ext.L
 import androidx.room.ext.N
 import androidx.room.ext.RoomTypeNames
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.MethodSpec
@@ -35,7 +34,7 @@
     val listAdapter: ListQueryResultAdapter?,
     val tableNames: Set<String>
 ) : QueryResultBinder(listAdapter) {
-    val itemTypeName: TypeName = listAdapter?.rowAdapter?.out?.typeName() ?: TypeName.OBJECT
+    val itemTypeName: TypeName = listAdapter?.rowAdapter?.out?.typeName ?: TypeName.OBJECT
     val typeName: ParameterizedTypeName = ParameterizedTypeName.get(
             RoomTypeNames.LIMIT_OFFSET_DATA_SOURCE, itemTypeName)
     override fun convertAndReturn(
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RowAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RowAdapter.kt
index a9d4db6f..99a89a0 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RowAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RowAdapter.kt
@@ -16,15 +16,15 @@
 
 package androidx.room.solver.query.result
 
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
-import javax.lang.model.type.TypeMirror
 
 /**
  * Converts a row of a cursor result into an Entity or a primitive.
  * <p>
  * An instance of this is created for each usage so that it can keep local variables.
  */
-abstract class RowAdapter(val out: TypeMirror) {
+abstract class RowAdapter(val out: XType) {
     /**
      * Called when cursor variable is ready, good place to put initialization code.
      */
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RxCallableQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RxCallableQueryResultBinder.kt
index d1eee32..9932e82 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RxCallableQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RxCallableQueryResultBinder.kt
@@ -23,20 +23,19 @@
 import androidx.room.ext.RoomTypeNames
 import androidx.room.ext.S
 import androidx.room.ext.T
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.RxType
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.MethodSpec
 import javax.lang.model.element.Modifier
-import javax.lang.model.type.TypeMirror
 
 /**
  * Generic Result binder for Rx classes that accept a callable.
  */
 internal class RxCallableQueryResultBinder(
     private val rxType: RxType,
-    val typeArg: TypeMirror,
+    val typeArg: XType,
     adapter: QueryResultAdapter?
 ) : QueryResultBinder(adapter) {
     override fun convertAndReturn(
@@ -46,7 +45,7 @@
         inTransaction: Boolean,
         scope: CodeGenScope
     ) {
-        val callable = CallableTypeSpecBuilder(typeArg.typeName()) {
+        val callable = CallableTypeSpecBuilder(typeArg.typeName) {
             fillInCallMethod(
                 roomSQLiteQueryVar = roomSQLiteQueryVar,
                 dbField = dbField,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RxQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RxQueryResultBinder.kt
index 109df19..45b862ff 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RxQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RxQueryResultBinder.kt
@@ -21,18 +21,17 @@
 import androidx.room.ext.N
 import androidx.room.ext.T
 import androidx.room.ext.arrayTypeName
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.RxType
 import com.squareup.javapoet.FieldSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binds the result as an RxJava2 Flowable, Publisher and Observable.
  */
 internal class RxQueryResultBinder(
     private val rxType: RxType,
-    val typeArg: TypeMirror,
+    val typeArg: XType,
     val queryTableNames: Set<String>,
     adapter: QueryResultAdapter?
 ) : BaseObservableQueryResultBinder(adapter) {
@@ -43,7 +42,7 @@
         inTransaction: Boolean,
         scope: CodeGenScope
     ) {
-        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName()) {
+        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName) {
             createRunQueryAndReturnStatements(builder = this,
                 roomSQLiteQueryVar = roomSQLiteQueryVar,
                 inTransaction = inTransaction,
@@ -62,7 +61,7 @@
                 rxType.factoryMethodName,
                 dbField,
                 if (inTransaction) "true" else "false",
-                String::class.arrayTypeName(),
+                String::class.arrayTypeName,
                 tableNamesList,
                 callableImpl)
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/SingleEntityQueryResultAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/SingleEntityQueryResultAdapter.kt
index c6eef30..de66448 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/SingleEntityQueryResultAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/SingleEntityQueryResultAdapter.kt
@@ -18,9 +18,7 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
-import defaultValue
 
 /**
  * Wraps a row adapter when there is only 1 item in the result
@@ -30,7 +28,7 @@
     override fun convert(outVarName: String, cursorVarName: String, scope: CodeGenScope) {
         scope.builder().apply {
             rowAdapter?.onCursorReady(cursorVarName, scope)
-            addStatement("final $T $L", type.typeName(), outVarName)
+            addStatement("final $T $L", type.typeName, outVarName)
             beginControlFlow("if($L.moveToFirst())", cursorVarName)
                 rowAdapter?.convert(outVarName, cursorVarName, scope)
             nextControlFlow("else").apply {
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableDeleteOrUpdateMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableDeleteOrUpdateMethodBinder.kt
index 3d539ba..5b743db5 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableDeleteOrUpdateMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableDeleteOrUpdateMethodBinder.kt
@@ -17,14 +17,13 @@
 package androidx.room.solver.shortcut.binder
 
 import androidx.room.ext.CallableTypeSpecBuilder
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.shortcut.result.DeleteOrUpdateMethodAdapter
 import androidx.room.vo.ShortcutQueryParameter
 import com.squareup.javapoet.CodeBlock
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.TypeSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binder for deferred delete and update methods.
@@ -34,14 +33,14 @@
  * function.
  */
 class CallableDeleteOrUpdateMethodBinder private constructor(
-    val typeArg: TypeMirror,
+    val typeArg: XType,
     val addStmntBlock: CodeBlock.Builder.(callableImpl: TypeSpec, dbField: FieldSpec) -> Unit,
     adapter: DeleteOrUpdateMethodAdapter?
 ) : DeleteOrUpdateMethodBinder(adapter) {
 
     companion object {
         fun createDeleteOrUpdateBinder(
-            typeArg: TypeMirror,
+            typeArg: XType,
             adapter: DeleteOrUpdateMethodAdapter?,
             addCodeBlock: CodeBlock.Builder.(callableImpl: TypeSpec, dbField: FieldSpec) -> Unit
         ) = CallableDeleteOrUpdateMethodBinder(typeArg, addCodeBlock, adapter)
@@ -54,7 +53,7 @@
         scope: CodeGenScope
     ) {
         val adapterScope = scope.fork()
-        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName()) {
+        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName) {
             adapter?.createDeleteOrUpdateMethodBody(
                 parameters = parameters,
                 adapters = adapters,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableInsertMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableInsertMethodBinder.kt
index b0da79e..8c5d892f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableInsertMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableInsertMethodBinder.kt
@@ -17,14 +17,13 @@
 package androidx.room.solver.shortcut.binder
 
 import androidx.room.ext.CallableTypeSpecBuilder
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.shortcut.result.InsertMethodAdapter
 import androidx.room.vo.ShortcutQueryParameter
 import com.squareup.javapoet.CodeBlock
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.TypeSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binder for deferred insert methods.
@@ -34,14 +33,14 @@
  * function.
  */
 class CallableInsertMethodBinder(
-    val typeArg: TypeMirror,
+    val typeArg: XType,
     val addStmntBlock: CodeBlock.Builder.(callableImpl: TypeSpec, dbField: FieldSpec) -> Unit,
     adapter: InsertMethodAdapter?
 ) : InsertMethodBinder(adapter) {
 
         companion object {
             fun createInsertBinder(
-                typeArg: TypeMirror,
+                typeArg: XType,
                 adapter: InsertMethodAdapter?,
                 addCodeBlock: CodeBlock.Builder.(callableImpl: TypeSpec, dbField: FieldSpec) -> Unit
             ) = CallableInsertMethodBinder(typeArg, addCodeBlock, adapter)
@@ -54,7 +53,7 @@
             scope: CodeGenScope
         ) {
             val adapterScope = scope.fork()
-            val callableImpl = CallableTypeSpecBuilder(typeArg.typeName()) {
+            val callableImpl = CallableTypeSpecBuilder(typeArg.typeName) {
                 adapter?.createInsertionMethodBody(
                     parameters = parameters,
                     insertionAdapters = insertionAdapters,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/DeleteOrUpdateMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/DeleteOrUpdateMethodBinder.kt
index 16fb5b2..c576cc9 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/DeleteOrUpdateMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/DeleteOrUpdateMethodBinder.kt
@@ -17,8 +17,8 @@
 package androidx.room.solver.shortcut.binder
 
 import androidx.room.solver.CodeGenScope
-import androidx.room.vo.ShortcutQueryParameter
 import androidx.room.solver.shortcut.result.DeleteOrUpdateMethodAdapter
+import androidx.room.vo.ShortcutQueryParameter
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.TypeSpec
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InsertMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InsertMethodBinder.kt
index d95fddf..2a6c3bc 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InsertMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InsertMethodBinder.kt
@@ -17,8 +17,8 @@
 package androidx.room.solver.shortcut.binder
 
 import androidx.room.solver.CodeGenScope
-import androidx.room.vo.ShortcutQueryParameter
 import androidx.room.solver.shortcut.result.InsertMethodAdapter
+import androidx.room.vo.ShortcutQueryParameter
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.TypeSpec
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InstantDeleteOrUpdateMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InstantDeleteOrUpdateMethodBinder.kt
index 2db1aa3..3e3e938 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InstantDeleteOrUpdateMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InstantDeleteOrUpdateMethodBinder.kt
@@ -18,8 +18,8 @@
 
 import androidx.room.ext.N
 import androidx.room.solver.CodeGenScope
-import androidx.room.vo.ShortcutQueryParameter
 import androidx.room.solver.shortcut.result.DeleteOrUpdateMethodAdapter
+import androidx.room.vo.ShortcutQueryParameter
 import androidx.room.writer.DaoWriter
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.TypeSpec
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InstantInsertMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InstantInsertMethodBinder.kt
index 7d8d2c1..d0f1310 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InstantInsertMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InstantInsertMethodBinder.kt
@@ -18,8 +18,8 @@
 
 import androidx.room.ext.N
 import androidx.room.solver.CodeGenScope
-import androidx.room.vo.ShortcutQueryParameter
 import androidx.room.solver.shortcut.result.InsertMethodAdapter
+import androidx.room.vo.ShortcutQueryParameter
 import androidx.room.writer.DaoWriter
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.TypeSpec
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/DeleteOrUpdateMethodBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/DeleteOrUpdateMethodBinderProvider.kt
index cfc6247..3ed980d 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/DeleteOrUpdateMethodBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/DeleteOrUpdateMethodBinderProvider.kt
@@ -16,9 +16,9 @@
 
 package androidx.room.solver.shortcut.binderprovider
 
-import androidx.room.solver.shortcut.result.DeleteOrUpdateMethodAdapter
+import androidx.room.processing.XDeclaredType
 import androidx.room.solver.shortcut.binder.DeleteOrUpdateMethodBinder
-import javax.lang.model.type.DeclaredType
+import androidx.room.solver.shortcut.result.DeleteOrUpdateMethodAdapter
 
 /**
  * Provider for delete or update binders
@@ -26,12 +26,12 @@
 interface DeleteOrUpdateMethodBinderProvider {
 
     /**
-     * Check whether the [DeclaredType] can be handled by the [DeleteOrUpdateMethodBinder]
+     * Check whether the [XDeclaredType] can be handled by the [DeleteOrUpdateMethodBinder]
      */
-    fun matches(declared: DeclaredType): Boolean
+    fun matches(declared: XDeclaredType): Boolean
 
     /**
-     * Provider of [DeleteOrUpdateMethodAdapter], based on the [DeclaredType]
+     * Provider of [DeleteOrUpdateMethodAdapter], based on the [XDeclaredType]
      */
-    fun provide(declared: DeclaredType): DeleteOrUpdateMethodBinder
+    fun provide(declared: XDeclaredType): DeleteOrUpdateMethodBinder
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/GuavaListenableFutureDeleteOrUpdateMethodBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/GuavaListenableFutureDeleteOrUpdateMethodBinderProvider.kt
index db4276d..43b663f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/GuavaListenableFutureDeleteOrUpdateMethodBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/GuavaListenableFutureDeleteOrUpdateMethodBinderProvider.kt
@@ -21,14 +21,11 @@
 import androidx.room.ext.N
 import androidx.room.ext.RoomGuavaTypeNames
 import androidx.room.ext.T
-import androidx.room.ext.findTypeElement
-import androidx.room.ext.typeName
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.shortcut.binder.CallableDeleteOrUpdateMethodBinder.Companion.createDeleteOrUpdateBinder
 import androidx.room.solver.shortcut.binder.DeleteOrUpdateMethodBinder
-import erasure
-import javax.lang.model.type.DeclaredType
 
 /**
  * Provider for Guava ListenableFuture binders.
@@ -41,12 +38,11 @@
         context.processingEnv.findTypeElement(RoomGuavaTypeNames.GUAVA_ROOM) != null
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
         declared.typeArguments.size == 1 &&
-                declared.erasure(context.processingEnv.typeUtils).typeName() ==
-                GuavaUtilConcurrentTypeNames.LISTENABLE_FUTURE
+                declared.erasure().typeName == GuavaUtilConcurrentTypeNames.LISTENABLE_FUTURE
 
-    override fun provide(declared: DeclaredType): DeleteOrUpdateMethodBinder {
+    override fun provide(declared: XDeclaredType): DeleteOrUpdateMethodBinder {
         if (!hasGuavaRoom) {
             context.logger.e(ProcessorErrors.MISSING_ROOM_GUAVA_ARTIFACT)
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/GuavaListenableFutureInsertMethodBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/GuavaListenableFutureInsertMethodBinderProvider.kt
index 82cecb0a..485d138 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/GuavaListenableFutureInsertMethodBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/GuavaListenableFutureInsertMethodBinderProvider.kt
@@ -21,15 +21,12 @@
 import androidx.room.ext.N
 import androidx.room.ext.RoomGuavaTypeNames
 import androidx.room.ext.T
-import androidx.room.ext.findTypeElement
-import androidx.room.ext.typeName
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.shortcut.binder.CallableInsertMethodBinder.Companion.createInsertBinder
 import androidx.room.solver.shortcut.binder.InsertMethodBinder
 import androidx.room.vo.ShortcutQueryParameter
-import erasure
-import javax.lang.model.type.DeclaredType
 
 /**
  * Provider for Guava ListenableFuture binders.
@@ -42,13 +39,12 @@
         context.processingEnv.findTypeElement(RoomGuavaTypeNames.GUAVA_ROOM) != null
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
         declared.typeArguments.size == 1 &&
-                declared.erasure(context.processingEnv.typeUtils).typeName() ==
-                GuavaUtilConcurrentTypeNames.LISTENABLE_FUTURE
+                declared.erasure().typeName == GuavaUtilConcurrentTypeNames.LISTENABLE_FUTURE
 
     override fun provide(
-        declared: DeclaredType,
+        declared: XDeclaredType,
         params: List<ShortcutQueryParameter>
     ): InsertMethodBinder {
         if (!hasGuavaRoom) {
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InsertMethodBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InsertMethodBinderProvider.kt
index 3e0909c..18f77c3 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InsertMethodBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InsertMethodBinderProvider.kt
@@ -16,9 +16,9 @@
 
 package androidx.room.solver.shortcut.binderprovider
 
+import androidx.room.processing.XDeclaredType
 import androidx.room.solver.shortcut.binder.InsertMethodBinder
 import androidx.room.vo.ShortcutQueryParameter
-import javax.lang.model.type.DeclaredType
 
 /**
  * Provider for insert method binders.
@@ -26,12 +26,12 @@
 interface InsertMethodBinderProvider {
 
     /**
-     * Check whether the [DeclaredType] can be handled by the [InsertMethodBinder]
+     * Check whether the [XDeclaredType] can be handled by the [InsertMethodBinder]
      */
-    fun matches(declared: DeclaredType): Boolean
+    fun matches(declared: XDeclaredType): Boolean
 
     /**
-     * Provider of [InsertMethodBinder], based on the [DeclaredType] and the list of parameters
+     * Provider of [InsertMethodBinder], based on the [XDeclaredType] and the list of parameters
      */
-    fun provide(declared: DeclaredType, params: List<ShortcutQueryParameter>): InsertMethodBinder
+    fun provide(declared: XDeclaredType, params: List<ShortcutQueryParameter>): InsertMethodBinder
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InstantDeleteOrUpdateMethodBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InstantDeleteOrUpdateMethodBinderProvider.kt
index da916e0..54a4f13 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InstantDeleteOrUpdateMethodBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InstantDeleteOrUpdateMethodBinderProvider.kt
@@ -16,10 +16,10 @@
 
 package androidx.room.solver.shortcut.binderprovider
 
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.solver.shortcut.binder.DeleteOrUpdateMethodBinder
 import androidx.room.solver.shortcut.binder.InstantDeleteOrUpdateMethodBinder
-import javax.lang.model.type.DeclaredType
 
 /**
  * Provider for instant (blocking) delete or update method binder
@@ -28,9 +28,9 @@
     private val context: Context
 ) : DeleteOrUpdateMethodBinderProvider {
 
-    override fun matches(declared: DeclaredType) = true
+    override fun matches(declared: XDeclaredType) = true
 
-    override fun provide(declared: DeclaredType): DeleteOrUpdateMethodBinder {
+    override fun provide(declared: XDeclaredType): DeleteOrUpdateMethodBinder {
         val adapter = context.typeAdapterStore.findDeleteOrUpdateAdapter(declared)
         return InstantDeleteOrUpdateMethodBinder(adapter)
     }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InstantInsertMethodBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InstantInsertMethodBinderProvider.kt
index 64b5082..2bae5fb 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InstantInsertMethodBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InstantInsertMethodBinderProvider.kt
@@ -16,21 +16,21 @@
 
 package androidx.room.solver.shortcut.binderprovider
 
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.solver.shortcut.binder.InsertMethodBinder
 import androidx.room.solver.shortcut.binder.InstantInsertMethodBinder
 import androidx.room.vo.ShortcutQueryParameter
-import javax.lang.model.type.DeclaredType
 
 /**
  * Provider for instant (blocking) insert method binder.
  */
 class InstantInsertMethodBinderProvider(private val context: Context) : InsertMethodBinderProvider {
 
-    override fun matches(declared: DeclaredType) = true
+    override fun matches(declared: XDeclaredType) = true
 
     override fun provide(
-        declared: DeclaredType,
+        declared: XDeclaredType,
         params: List<ShortcutQueryParameter>
     ): InsertMethodBinder {
         return InstantInsertMethodBinder(
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/RxCallableDeleteOrUpdateMethodBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/RxCallableDeleteOrUpdateMethodBinderProvider.kt
index 98eb7ba..06b58ed 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/RxCallableDeleteOrUpdateMethodBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/RxCallableDeleteOrUpdateMethodBinderProvider.kt
@@ -18,16 +18,12 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.findTypeMirror
-import androidx.room.ext.typeName
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.solver.RxType
 import androidx.room.solver.shortcut.binder.CallableDeleteOrUpdateMethodBinder.Companion.createDeleteOrUpdateBinder
 import androidx.room.solver.shortcut.binder.DeleteOrUpdateMethodBinder
-import erasure
-import isAssignableFrom
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 /**
  * Provider for Rx Callable binders.
@@ -41,17 +37,17 @@
      * [Single] and [Maybe] are generics but [Completable] is not so each implementation of this
      * class needs to define how to extract the type argument.
      */
-    open fun extractTypeArg(declared: DeclaredType): TypeMirror = declared.typeArguments.first()
+    open fun extractTypeArg(declared: XDeclaredType): XType = declared.typeArguments.first()
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
             declared.typeArguments.size == 1 && matchesRxType(declared)
 
-    private fun matchesRxType(declared: DeclaredType): Boolean {
-        val erasure = declared.erasure(context.processingEnv.typeUtils)
-        return erasure.typeName() == rxType.className
+    private fun matchesRxType(declared: XDeclaredType): Boolean {
+        val erasure = declared.erasure()
+        return erasure.typeName == rxType.className
     }
 
-    override fun provide(declared: DeclaredType): DeleteOrUpdateMethodBinder {
+    override fun provide(declared: XDeclaredType): DeleteOrUpdateMethodBinder {
         val typeArg = extractTypeArg(declared)
         val adapter = context.typeAdapterStore.findDeleteOrUpdateAdapter(typeArg)
         return createDeleteOrUpdateBinder(typeArg, adapter) { callableImpl, _ ->
@@ -76,25 +72,24 @@
     rxType: RxType
 ) : RxCallableDeleteOrUpdateMethodBinderProvider(context, rxType) {
 
-    private val completableTypeMirror: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(rxType.className)
+    private val completableTypeMirror: XType? by lazy {
+        context.processingEnv.findType(rxType.className)
     }
 
     /**
      * Since Completable is not a generic, the supported return type should be Void.
      * Like this, the generated Callable.call method will return Void.
      */
-    override fun extractTypeArg(declared: DeclaredType): TypeMirror =
+    override fun extractTypeArg(declared: XDeclaredType): XType =
             context.COMMON_TYPES.VOID
 
-    override fun matches(declared: DeclaredType): Boolean = isCompletable(declared)
+    override fun matches(declared: XDeclaredType): Boolean = isCompletable(declared)
 
-    private fun isCompletable(declared: DeclaredType): Boolean {
+    private fun isCompletable(declared: XDeclaredType): Boolean {
         if (completableTypeMirror == null) {
             return false
         }
-        val typeUtils = context.processingEnv.typeUtils
-        val erasure = declared.erasure(typeUtils)
-        return erasure.isAssignableFrom(typeUtils, completableTypeMirror!!)
+        val erasure = declared.erasure()
+        return erasure.isAssignableFrom(completableTypeMirror!!)
     }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/RxCallableInsertMethodBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/RxCallableInsertMethodBinderProvider.kt
index 38258f1..b3a2a03 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/RxCallableInsertMethodBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/RxCallableInsertMethodBinderProvider.kt
@@ -18,17 +18,13 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.findTypeMirror
-import androidx.room.ext.typeName
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.solver.RxType
 import androidx.room.solver.shortcut.binder.CallableInsertMethodBinder.Companion.createInsertBinder
 import androidx.room.solver.shortcut.binder.InsertMethodBinder
 import androidx.room.vo.ShortcutQueryParameter
-import erasure
-import isAssignableFrom
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 /**
  * Provider for Rx Callable binders.
@@ -42,18 +38,18 @@
      * [Single] and [Maybe] are generics but [Completable] is not so each implementation of this
      * class needs to define how to extract the type argument.
      */
-    open fun extractTypeArg(declared: DeclaredType): TypeMirror = declared.typeArguments.first()
+    open fun extractTypeArg(declared: XDeclaredType): XType = declared.typeArguments.first()
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
             declared.typeArguments.size == 1 && matchesRxType(declared)
 
-    private fun matchesRxType(declared: DeclaredType): Boolean {
-        val erasure = declared.erasure(context.processingEnv.typeUtils)
-        return erasure.typeName() == rxType.className
+    private fun matchesRxType(declared: XDeclaredType): Boolean {
+        val erasure = declared.erasure()
+        return erasure.typeName == rxType.className
     }
 
     override fun provide(
-        declared: DeclaredType,
+        declared: XDeclaredType,
         params: List<ShortcutQueryParameter>
     ): InsertMethodBinder {
         val typeArg = extractTypeArg(declared)
@@ -80,25 +76,24 @@
     rxType: RxType
 ) : RxCallableInsertMethodBinderProvider(context, rxType) {
 
-    private val completableTypeMirror: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(rxType.className)
+    private val completableTypeMirror: XType? by lazy {
+        context.processingEnv.findType(rxType.className)
     }
 
     /**
      * Since Completable is not a generic, the supported return type should be Void.
      * Like this, the generated Callable.call method will return Void.
      */
-    override fun extractTypeArg(declared: DeclaredType): TypeMirror =
+    override fun extractTypeArg(declared: XDeclaredType): XType =
             context.COMMON_TYPES.VOID
 
-    override fun matches(declared: DeclaredType): Boolean = isCompletable(declared)
+    override fun matches(declared: XDeclaredType): Boolean = isCompletable(declared)
 
-    private fun isCompletable(declared: DeclaredType): Boolean {
+    private fun isCompletable(declared: XDeclaredType): Boolean {
         if (completableTypeMirror == null) {
             return false
         }
-        val typeUtils = context.processingEnv.typeUtils
-        val erasure = declared.erasure(typeUtils)
-        return erasure.isAssignableFrom(typeUtils, completableTypeMirror!!)
+        val erasure = declared.erasure()
+        return erasure.isAssignableFrom(completableTypeMirror!!)
     }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/result/DeleteOrUpdateMethodAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/result/DeleteOrUpdateMethodAdapter.kt
index dd925df..8bf5418 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/result/DeleteOrUpdateMethodAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/result/DeleteOrUpdateMethodAdapter.kt
@@ -20,30 +20,26 @@
 import androidx.room.ext.L
 import androidx.room.ext.N
 import androidx.room.ext.T
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.vo.ShortcutQueryParameter
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeSpec
-import isInt
-import isKotlinUnit
-import isVoid
-import isVoidObject
-import javax.lang.model.type.TypeMirror
 
 /**
  * Class that knows how to generate a delete or update method body.
  */
-class DeleteOrUpdateMethodAdapter private constructor(private val returnType: TypeMirror) {
+class DeleteOrUpdateMethodAdapter private constructor(private val returnType: XType) {
     companion object {
-        fun create(returnType: TypeMirror): DeleteOrUpdateMethodAdapter? {
+        fun create(returnType: XType): DeleteOrUpdateMethodAdapter? {
             if (isDeleteOrUpdateValid(returnType)) {
                 return DeleteOrUpdateMethodAdapter(returnType)
             }
             return null
         }
 
-        private fun isDeleteOrUpdateValid(returnType: TypeMirror): Boolean {
+        private fun isDeleteOrUpdateValid(returnType: XType): Boolean {
             return returnType.isVoid() ||
                     returnType.isInt() ||
                     returnType.isVoidObject() ||
@@ -90,13 +86,13 @@
         }
     }
 
-    private fun hasResultValue(returnType: TypeMirror): Boolean {
+    private fun hasResultValue(returnType: XType): Boolean {
         return !(returnType.isVoid() ||
                 returnType.isVoidObject() ||
                 returnType.isKotlinUnit())
     }
 
-    private fun hasNullReturn(returnType: TypeMirror) = returnType.isVoidObject()
+    private fun hasNullReturn(returnType: XType) = returnType.isVoidObject()
 
-    private fun hasUnitReturn(returnType: TypeMirror) = returnType.isKotlinUnit()
+    private fun hasUnitReturn(returnType: XType) = returnType.isKotlinUnit()
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/result/InsertMethodAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/result/InsertMethodAdapter.kt
index 0f3b013..4c1dada 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/result/InsertMethodAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/result/InsertMethodAdapter.kt
@@ -21,24 +21,16 @@
 import androidx.room.ext.N
 import androidx.room.ext.T
 import androidx.room.ext.typeName
+import androidx.room.processing.XType
+import androidx.room.processing.asDeclaredType
+import androidx.room.processing.isArray
 import androidx.room.solver.CodeGenScope
 import androidx.room.vo.ShortcutQueryParameter
-import asArray
-import asDeclaredType
 import com.squareup.javapoet.ArrayTypeName
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.ParameterizedTypeName
 import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeSpec
-import isArray
-import isBoxedLong
-import isKotlinUnit
-import isList
-import isLong
-import isPrimitiveLong
-import isVoid
-import isVoidObject
-import javax.lang.model.type.TypeMirror
 
 /**
  * Class that knows how to generate an insert method body.
@@ -46,7 +38,7 @@
 class InsertMethodAdapter private constructor(private val insertionType: InsertionType) {
     companion object {
         fun create(
-            returnType: TypeMirror,
+            returnType: XType,
             params: List<ShortcutQueryParameter>
         ): InsertMethodAdapter? {
             val insertionType = getInsertionType(returnType)
@@ -87,7 +79,7 @@
         }
 
         @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
-        private fun getInsertionType(returnType: TypeMirror): InsertionType? {
+        private fun getInsertionType(returnType: XType): InsertionType? {
 
             return if (returnType.isVoid()) {
                 InsertionType.INSERT_VOID
@@ -183,6 +175,6 @@
         INSERT_ID_ARRAY_BOX("insertAndReturnIdsArrayBox",
                 ArrayTypeName.of(TypeName.LONG.box())), // return Long[]
         INSERT_ID_LIST("insertAndReturnIdsList", // return List<Long>
-                ParameterizedTypeName.get(List::class.typeName(), TypeName.LONG.box())),
+                ParameterizedTypeName.get(List::class.typeName, TypeName.LONG.box())),
     }
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/CoroutineTransactionMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/CoroutineTransactionMethodBinder.kt
index bfdc32c..64da959 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/CoroutineTransactionMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/CoroutineTransactionMethodBinder.kt
@@ -22,14 +22,13 @@
 import androidx.room.ext.N
 import androidx.room.ext.RoomTypeNames.ROOM_DB_KT
 import androidx.room.ext.T
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.transaction.result.TransactionMethodAdapter
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.ParameterizedTypeName
 import com.squareup.javapoet.WildcardTypeName
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binder that knows how to write suspending transaction wrapper methods.
@@ -39,7 +38,7 @@
     private val continuationParamName: String
 ) : TransactionMethodBinder(adapter) {
     override fun executeAndReturn(
-        returnType: TypeMirror,
+        returnType: XType,
         parameterNames: List<String>,
         daoName: ClassName,
         daoImplName: ClassName,
@@ -49,7 +48,7 @@
         val innerContinuationParamName = "__cont"
         val functionImpl = Function1TypeSpecBuilder(
             parameterTypeName = ParameterizedTypeName.get(
-                CONTINUATION, WildcardTypeName.supertypeOf(returnType.typeName())),
+                CONTINUATION, WildcardTypeName.supertypeOf(returnType.typeName)),
             parameterName = innerContinuationParamName,
             returnTypeName = ClassName.OBJECT
         ) {
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/InstantTransactionMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/InstantTransactionMethodBinder.kt
index e121afb..9aaef20 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/InstantTransactionMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/InstantTransactionMethodBinder.kt
@@ -17,12 +17,11 @@
 package androidx.room.solver.transaction.binder
 
 import androidx.room.ext.N
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.transaction.result.TransactionMethodAdapter
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.FieldSpec
-import isNotVoid
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binder that knows how to write instant (blocking) transaction wrapper methods.
@@ -31,7 +30,7 @@
     adapter: TransactionMethodAdapter
 ) : TransactionMethodBinder(adapter) {
     override fun executeAndReturn(
-        returnType: TypeMirror,
+        returnType: XType,
         parameterNames: List<String>,
         daoName: ClassName,
         daoImplName: ClassName,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/TransactionMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/TransactionMethodBinder.kt
index a9b6d7c..f98d436 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/TransactionMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/TransactionMethodBinder.kt
@@ -16,11 +16,11 @@
 
 package androidx.room.solver.transaction.binder
 
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.transaction.result.TransactionMethodAdapter
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.FieldSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * Connects a transaction method, database and a [TransactionMethodAdapter].
@@ -36,7 +36,7 @@
      * transaction wrapper body that delegates to the non-abstract or default dao method.
      */
     abstract fun executeAndReturn(
-        returnType: TypeMirror,
+        returnType: XType,
         parameterNames: List<String>,
         daoName: ClassName,
         daoImplName: ClassName,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/transaction/result/TransactionMethodAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/transaction/result/TransactionMethodAdapter.kt
index 0df5ca1..579c5bd 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/transaction/result/TransactionMethodAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/transaction/result/TransactionMethodAdapter.kt
@@ -20,11 +20,10 @@
 import androidx.room.ext.L
 import androidx.room.ext.N
 import androidx.room.ext.T
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.vo.TransactionMethod
 import com.squareup.javapoet.ClassName
-import java.lang.IllegalStateException
-import javax.lang.model.type.TypeMirror
 
 /**
  * Class that knows how to generate the transaction method delegate statement.
@@ -34,7 +33,7 @@
     private val callType: TransactionMethod.CallType
 ) {
     fun createDelegateToSuperStatement(
-        returnType: TypeMirror,
+        returnType: XType,
         parameterNames: List<String>,
         daoName: ClassName,
         daoImplName: ClassName,
@@ -50,7 +49,7 @@
                         "Can't assign to var and return in the same statement.")
                 } else if (resultVar != null) {
                     append("$T $L = ")
-                    params.add(returnType)
+                    params.add(returnType.typeName)
                     params.add(resultVar)
                 } else if (returnStmt) {
                     append("return ")
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/BoxedBooleanToBoxedIntConverter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/BoxedBooleanToBoxedIntConverter.kt
index fd8d789..726cce8 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/BoxedBooleanToBoxedIntConverter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/BoxedBooleanToBoxedIntConverter.kt
@@ -17,17 +17,16 @@
 package androidx.room.solver.types
 
 import androidx.room.ext.L
-import androidx.room.ext.requireTypeMirror
+import androidx.room.processing.XProcessingEnv
 import androidx.room.solver.CodeGenScope
-import javax.annotation.processing.ProcessingEnvironment
 
 /**
  * int to boolean adapter.
  */
 object BoxedBooleanToBoxedIntConverter {
-    fun create(processingEnvironment: ProcessingEnvironment): List<TypeConverter> {
-        val tBoolean = processingEnvironment.requireTypeMirror("java.lang.Boolean")
-        val tInt = processingEnvironment.requireTypeMirror("java.lang.Integer")
+    fun create(processingEnvironment: XProcessingEnv): List<TypeConverter> {
+        val tBoolean = processingEnvironment.requireType("java.lang.Boolean")
+        val tInt = processingEnvironment.requireType("java.lang.Integer")
         return listOf(
                 object : TypeConverter(tBoolean, tInt) {
                     override fun convert(
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/BoxedPrimitiveColumnTypeAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/BoxedPrimitiveColumnTypeAdapter.kt
index 29c636d..646ada5 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/BoxedPrimitiveColumnTypeAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/BoxedPrimitiveColumnTypeAdapter.kt
@@ -17,27 +17,24 @@
 package androidx.room.solver.types
 
 import androidx.room.ext.L
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
-import box
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.type.TypeMirror
 
 /**
  * Adapters for all boxed primitives that has direct cursor mappings.
  */
 open class BoxedPrimitiveColumnTypeAdapter(
-    boxed: TypeMirror,
+    boxed: XType,
     val primitiveAdapter: PrimitiveColumnTypeAdapter
 ) : ColumnTypeAdapter(boxed, primitiveAdapter.typeAffinity) {
     companion object {
         fun createBoxedPrimitiveAdapters(
-            processingEnvironment: ProcessingEnvironment,
             primitiveAdapters: List<PrimitiveColumnTypeAdapter>
         ): List<ColumnTypeAdapter> {
 
             return primitiveAdapters.map {
                 BoxedPrimitiveColumnTypeAdapter(
-                    it.out.box(processingEnvironment.typeUtils),
+                    it.out.boxed(),
                     it
                 )
             }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/ByteArrayColumnTypeAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/ByteArrayColumnTypeAdapter.kt
index 5645a7b..690c9d1 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/ByteArrayColumnTypeAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/ByteArrayColumnTypeAdapter.kt
@@ -17,13 +17,12 @@
 package androidx.room.solver.types
 
 import androidx.room.ext.L
-import androidx.room.ext.getArrayType
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XProcessingEnv
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.TypeName
-import javax.annotation.processing.ProcessingEnvironment
 
-class ByteArrayColumnTypeAdapter(env: ProcessingEnvironment) : ColumnTypeAdapter(
+class ByteArrayColumnTypeAdapter(env: XProcessingEnv) : ColumnTypeAdapter(
         out = env.getArrayType(TypeName.BYTE),
         typeAffinity = SQLTypeAffinity.BLOB) {
     override fun readFromCursor(
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/ByteBufferColumnTypeAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/ByteBufferColumnTypeAdapter.kt
index 1289f08..8559a33 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/ByteBufferColumnTypeAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/ByteBufferColumnTypeAdapter.kt
@@ -18,15 +18,14 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.requireTypeMirror
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XProcessingEnv
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.TypeName
 import java.nio.ByteBuffer
-import javax.annotation.processing.ProcessingEnvironment
 
-class ByteBufferColumnTypeAdapter(env: ProcessingEnvironment) : ColumnTypeAdapter(
-    out = env.requireTypeMirror("java.nio.ByteBuffer"),
+class ByteBufferColumnTypeAdapter(env: XProcessingEnv) : ColumnTypeAdapter(
+    out = env.requireType("java.nio.ByteBuffer"),
     typeAffinity = SQLTypeAffinity.BLOB
 ) {
     override fun readFromCursor(
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/ColumnTypeAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/ColumnTypeAdapter.kt
index 8f6498f..b9f65cf 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/ColumnTypeAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/ColumnTypeAdapter.kt
@@ -16,17 +16,16 @@
 
 package androidx.room.solver.types
 
-import androidx.room.ext.typeName
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XType
 import com.squareup.javapoet.TypeName
-import javax.lang.model.type.TypeMirror
 
 /**
  * A code generator that can read a field from Cursor and write a field to a Statement
  */
-abstract class ColumnTypeAdapter(val out: TypeMirror, val typeAffinity: SQLTypeAffinity) :
+abstract class ColumnTypeAdapter(val out: XType, val typeAffinity: SQLTypeAffinity) :
         StatementValueBinder, CursorValueReader {
-    val outTypeName: TypeName by lazy { out.typeName() }
+    val outTypeName: TypeName by lazy { out.typeName }
     override fun typeMirror() = out
     override fun affinity(): SQLTypeAffinity = typeAffinity
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/CompositeAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/CompositeAdapter.kt
index 5c1a098..b616765 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/CompositeAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/CompositeAdapter.kt
@@ -18,15 +18,15 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
-import javax.lang.model.type.TypeMirror
 
 /**
  * A column adapter that uses a type converter to do the conversion. The type converter may be
  * a composite one.
  */
 class CompositeAdapter(
-    out: TypeMirror,
+    out: XType,
     val columnTypeAdapter: ColumnTypeAdapter,
     val intoStatementConverter: TypeConverter?,
     val fromCursorConverter: TypeConverter?
@@ -60,7 +60,7 @@
         }
         scope.builder().apply {
             val tmpVar = scope.getTmpVar()
-            addStatement("final $T $L", columnTypeAdapter.out, tmpVar)
+            addStatement("final $T $L", columnTypeAdapter.out.typeName, tmpVar)
             intoStatementConverter.convert(valueVarName, tmpVar, scope)
             columnTypeAdapter.bindToStmt(stmtName, indexVarName, tmpVar, scope)
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/CompositeTypeConverter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/CompositeTypeConverter.kt
index e233b50..450a6b6 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/CompositeTypeConverter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/CompositeTypeConverter.kt
@@ -18,7 +18,6 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 
 /**
@@ -29,7 +28,7 @@
     override fun convert(inputVarName: String, outputVarName: String, scope: CodeGenScope) {
         scope.builder().apply {
             val tmp = scope.getTmpVar()
-            addStatement("final $T $L", conv1.to.typeName(), tmp)
+            addStatement("final $T $L", conv1.to.typeName, tmp)
             conv1.convert(inputVarName, tmp, scope)
             conv2.convert(tmp, outputVarName, scope)
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/CursorValueReader.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/CursorValueReader.kt
index 4bf4785..c8cd2b9 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/CursorValueReader.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/CursorValueReader.kt
@@ -17,8 +17,8 @@
 package androidx.room.solver.types
 
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
-import javax.lang.model.type.TypeMirror
 
 /**
  * Reads value from a cursor at the given index.
@@ -26,7 +26,7 @@
  */
 interface CursorValueReader {
     fun affinity(): SQLTypeAffinity
-    fun typeMirror(): TypeMirror
+    fun typeMirror(): XType
     fun readFromCursor(
         outVarName: String,
         cursorVarName: String,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/NoOpConverter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/NoOpConverter.kt
index 352843c..fad7af7 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/NoOpConverter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/NoOpConverter.kt
@@ -17,8 +17,8 @@
 package androidx.room.solver.types
 
 import androidx.room.ext.L
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
-import javax.lang.model.type.TypeMirror
 
 /**
  * Yes, we need this when user input is the same as the desired output.
@@ -28,7 +28,7 @@
  * the query. Not having this would require us to special case handle String, String[], List<String>
  * etc.
  */
-class NoOpConverter(type: TypeMirror) : TypeConverter(
+class NoOpConverter(type: XType) : TypeConverter(
         type, type) {
     override fun convert(inputVarName: String, outputVarName: String, scope: CodeGenScope) {
         scope.builder()
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/PrimitiveBooleanToIntConverter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/PrimitiveBooleanToIntConverter.kt
index e2bfffe..bc0d7e1 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/PrimitiveBooleanToIntConverter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/PrimitiveBooleanToIntConverter.kt
@@ -17,18 +17,17 @@
 package androidx.room.solver.types
 
 import androidx.room.ext.L
-import androidx.room.ext.requireTypeMirror
+import androidx.room.processing.XProcessingEnv
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.TypeName
-import javax.annotation.processing.ProcessingEnvironment
 
 /**
  * int to boolean adapter.
  */
 object PrimitiveBooleanToIntConverter {
-    fun create(processingEnvironment: ProcessingEnvironment): List<TypeConverter> {
-        val tBoolean = processingEnvironment.requireTypeMirror(TypeName.BOOLEAN)
-        val tInt = processingEnvironment.requireTypeMirror(TypeName.INT)
+    fun create(processingEnvironment: XProcessingEnv): List<TypeConverter> {
+        val tBoolean = processingEnvironment.requireType(TypeName.BOOLEAN)
+        val tInt = processingEnvironment.requireType(TypeName.INT)
         return listOf(
                 object : TypeConverter(tBoolean, tInt) {
                     override fun convert(
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/PrimitiveColumnTypeAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/PrimitiveColumnTypeAdapter.kt
index b2d7e5d..3fe4b51 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/PrimitiveColumnTypeAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/PrimitiveColumnTypeAdapter.kt
@@ -17,10 +17,10 @@
 package androidx.room.solver.types
 
 import androidx.room.ext.L
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.typeName
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.parser.SQLTypeAffinity.REAL
+import androidx.room.processing.XProcessingEnv
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.TypeName.BYTE
 import com.squareup.javapoet.TypeName.CHAR
@@ -29,26 +29,24 @@
 import com.squareup.javapoet.TypeName.INT
 import com.squareup.javapoet.TypeName.LONG
 import com.squareup.javapoet.TypeName.SHORT
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.type.TypeMirror
 
 /**
  * Adapters for all primitives that has direct cursor mappings.
  */
 open class PrimitiveColumnTypeAdapter(
-    out: TypeMirror,
+    out: XType,
     val cursorGetter: String,
     val stmtSetter: String,
     typeAffinity: SQLTypeAffinity
 ) : ColumnTypeAdapter(out, typeAffinity) {
-    val cast = if (cursorGetter == "get${out.typeName().toString().capitalize()}")
+    val cast = if (cursorGetter == "get${out.typeName.toString().capitalize()}")
                     ""
                 else
-                    "(${out.typeName()}) "
+                    "(${out.typeName}) "
 
     companion object {
         fun createPrimitiveAdapters(
-            processingEnvironment: ProcessingEnvironment
+            processingEnvironment: XProcessingEnv
         ): List<PrimitiveColumnTypeAdapter> {
             return listOf(
                     Triple(INT, "getInt", "bindLong"),
@@ -60,7 +58,7 @@
                     Triple(DOUBLE, "getDouble", "bindDouble")
             ).map {
                 PrimitiveColumnTypeAdapter(
-                        out = processingEnvironment.requireTypeMirror(it.first),
+                        out = processingEnvironment.requireType(it.first),
                         cursorGetter = it.second,
                         stmtSetter = it.third,
                         typeAffinity = when (it.first) {
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/StatementValueBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/StatementValueBinder.kt
index 026ad25..f4f9a98 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/StatementValueBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/StatementValueBinder.kt
@@ -16,15 +16,15 @@
 
 package androidx.room.solver.types
 
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binds a value into a statement
  * see: CursorValueReader
  */
 interface StatementValueBinder {
-    fun typeMirror(): TypeMirror
+    fun typeMirror(): XType
     fun bindToStmt(
         stmtName: String,
         indexVarName: String,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/StringColumnTypeAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/StringColumnTypeAdapter.kt
index 2a8fa53..67ac944 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/StringColumnTypeAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/StringColumnTypeAdapter.kt
@@ -17,13 +17,12 @@
 package androidx.room.solver.types
 
 import androidx.room.ext.L
-import androidx.room.ext.requireTypeMirror
 import androidx.room.parser.SQLTypeAffinity.TEXT
+import androidx.room.processing.XProcessingEnv
 import androidx.room.solver.CodeGenScope
-import javax.annotation.processing.ProcessingEnvironment
 
-class StringColumnTypeAdapter(processingEnvironment: ProcessingEnvironment) :
-    ColumnTypeAdapter((processingEnvironment.requireTypeMirror(String::class)), TEXT) {
+class StringColumnTypeAdapter(processingEnvironment: XProcessingEnv) :
+    ColumnTypeAdapter((processingEnvironment.requireType(String::class)), TEXT) {
     override fun readFromCursor(
         outVarName: String,
         cursorVarName: String,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/TypeConverter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/TypeConverter.kt
index f967135..ed5f55c 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/TypeConverter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/TypeConverter.kt
@@ -16,12 +16,12 @@
 
 package androidx.room.solver.types
 
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
-import javax.lang.model.type.TypeMirror
 
 /**
  * A code generator that can convert from 1 type to another
  */
-abstract class TypeConverter(val from: TypeMirror, val to: TypeMirror) {
+abstract class TypeConverter(val from: XType, val to: XType) {
     abstract fun convert(inputVarName: String, outputVarName: String, scope: CodeGenScope)
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt b/room/compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt
index a57927b..8beb639 100644
--- a/room/compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.verifier
 
+import androidx.room.processing.XElement
 import androidx.room.processor.Context
 import androidx.room.vo.DatabaseView
 import androidx.room.vo.Entity
@@ -30,7 +31,6 @@
 import java.sql.Connection
 import java.sql.SQLException
 import java.util.regex.Pattern
-import javax.lang.model.element.Element
 
 /**
  * Builds an in-memory version of the database and verifies the queries against it.
@@ -99,7 +99,7 @@
          */
         fun create(
             context: Context,
-            element: Element,
+            element: XElement,
             entities: List<Entity>,
             views: List<DatabaseView>
         ): DatabaseVerifier? {
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Constructor.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Constructor.kt
index eee8a6a..016ac82 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Constructor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Constructor.kt
@@ -18,21 +18,17 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.isConstructor
-import androidx.room.ext.isMethod
-import androidx.room.ext.kindName
-import androidx.room.ext.name
-import androidx.room.ext.typeName
+import androidx.room.processing.XExecutableElement
+import androidx.room.processing.isConstructor
+import androidx.room.processing.isMethod
 import com.squareup.javapoet.CodeBlock
-import javax.lang.model.element.ExecutableElement
 
 /**
  * For each Entity / Pojo we process has a constructor. It might be the empty constructor or a
  * constructor with fields. It can also be a static factory method, such as in the case of an
  * AutoValue Pojo.
  */
-data class Constructor(val element: ExecutableElement, val params: List<Param>) {
+data class Constructor(val element: XExecutableElement, val params: List<Param>) {
 
     fun hasField(field: Field): Boolean {
         return params.any {
@@ -48,11 +44,11 @@
         when {
             element.isConstructor() -> {
                 builder.addStatement("$L = new $T($L)", outVar,
-                        element.enclosingElement.asDeclaredType().typeName(), args)
+                        element.enclosingElement.asDeclaredType().typeName, args)
             }
             element.isMethod() -> {
                 builder.addStatement("$L = $T.$L($L)", outVar,
-                        element.enclosingElement.asDeclaredType().typeName(),
+                        element.enclosingElement.asDeclaredType().typeName,
                         element.name, args)
             }
             else -> throw IllegalStateException("Invalid constructor kind ${element.kindName()}")
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/CustomTypeConverter.kt b/room/compiler/src/main/kotlin/androidx/room/vo/CustomTypeConverter.kt
index 986fa79..012b6a0 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/CustomTypeConverter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/CustomTypeConverter.kt
@@ -16,26 +16,23 @@
 
 package androidx.room.vo
 
-import androidx.room.ext.isStatic
-import androidx.room.ext.name
-import androidx.room.ext.typeName
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
 import com.squareup.javapoet.TypeName
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.TypeMirror
 
 /**
  * Generated when we parse a method annotated with TypeConverter.
  */
 data class CustomTypeConverter(
-    val enclosingClass: TypeMirror,
+    val enclosingClass: XType,
     val isEnclosingClassKotlinObject: Boolean,
-    val method: ExecutableElement,
-    val from: TypeMirror,
-    val to: TypeMirror
+    val method: XMethodElement,
+    val from: XType,
+    val to: XType
 ) {
-    val typeName: TypeName by lazy { enclosingClass.typeName() }
-    val fromTypeName: TypeName by lazy { from.typeName() }
-    val toTypeName: TypeName by lazy { to.typeName() }
+    val typeName: TypeName by lazy { enclosingClass.typeName }
+    val fromTypeName: TypeName by lazy { from.typeName }
+    val toTypeName: TypeName by lazy { to.typeName }
     val methodName by lazy { method.name }
     val isStatic by lazy { method.isStatic() }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Dao.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Dao.kt
index cb955f8..c65ef88 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Dao.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Dao.kt
@@ -16,16 +16,15 @@
 
 package androidx.room.vo
 
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.isType
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XTypeElement
+import androidx.room.processing.isType
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.TypeName
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
 
 data class Dao(
-    val element: TypeElement,
-    val type: DeclaredType,
+    val element: XTypeElement,
+    val type: XDeclaredType,
     val queryMethods: List<QueryMethod>,
     val rawQueryMethods: List<RawQueryMethod>,
     val insertionMethods: List<InsertionMethod>,
@@ -45,7 +44,7 @@
         this.suffix = if (newSuffix == "") "" else "_$newSuffix"
     }
 
-    val typeName: ClassName by lazy { ClassName.get(element) }
+    val typeName: ClassName by lazy { element.className }
 
     val shortcutMethods: List<ShortcutMethod> by lazy {
         deletionMethods + updateMethods
@@ -57,9 +56,9 @@
         }
         val path = arrayListOf<String>()
         var enclosing = element.enclosingElement
-        while (enclosing.isType()) {
-            path.add(ClassName.get(enclosing.asTypeElement()).simpleName())
-            enclosing = enclosing.enclosingElement
+        while (enclosing?.isType() == true) {
+            path.add(enclosing!!.name)
+            enclosing = enclosing!!.enclosingElement
         }
         path.reversed().joinToString("_") + "${typeName.simpleName()}${suffix}_Impl"
     }
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/DaoMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/DaoMethod.kt
index 9c52209b..13dfbfd 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/DaoMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/DaoMethod.kt
@@ -16,9 +16,9 @@
 
 package androidx.room.vo
 
-import javax.lang.model.element.ExecutableElement
+import androidx.room.processing.XMethodElement
 
 /**
  * References a method that returns a dao in a Database
  */
-data class DaoMethod(val element: ExecutableElement, val name: String, val dao: Dao)
+data class DaoMethod(val element: XMethodElement, val name: String, val dao: Dao)
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt
index 31cdba2..62faeac 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt
@@ -19,18 +19,18 @@
 import androidx.room.RoomMasterTable
 import androidx.room.migration.bundle.DatabaseBundle
 import androidx.room.migration.bundle.SchemaBundle
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
 import com.squareup.javapoet.ClassName
 import org.apache.commons.codec.digest.DigestUtils
 import java.io.File
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.TypeMirror
 
 /**
  * Holds information about a class annotated with Database.
  */
 data class Database(
-    val element: TypeElement,
-    val type: TypeMirror,
+    val element: XTypeElement,
+    val type: XType,
     val entities: List<Entity>,
     val views: List<DatabaseView>,
     val daoMethods: List<DaoMethod>,
@@ -38,7 +38,7 @@
     val exportSchema: Boolean,
     val enableForeignKeys: Boolean
 ) {
-    val typeName: ClassName by lazy { ClassName.get(element) }
+    val typeName: ClassName by lazy { element.className }
 
     private val implClassName by lazy {
         "${typeName.simpleNames().joinToString("_")}_Impl"
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/DatabaseView.kt b/room/compiler/src/main/kotlin/androidx/room/vo/DatabaseView.kt
index 6177e02..46d77c5 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/DatabaseView.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/DatabaseView.kt
@@ -19,14 +19,14 @@
 import androidx.room.migration.bundle.BundleUtil
 import androidx.room.migration.bundle.DatabaseViewBundle
 import androidx.room.parser.ParsedQuery
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XTypeElement
 
 class DatabaseView(
-    element: TypeElement,
+    element: XTypeElement,
     val viewName: String,
     val query: ParsedQuery,
-    type: DeclaredType,
+    type: XDeclaredType,
     fields: List<Field>,
     embeddedFields: List<EmbeddedField>,
     constructor: Constructor?
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/DeletionMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/DeletionMethod.kt
index c863479..61c9270 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/DeletionMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/DeletionMethod.kt
@@ -15,11 +15,11 @@
  */
 package androidx.room.vo
 
+import androidx.room.processing.XMethodElement
 import androidx.room.solver.shortcut.binder.DeleteOrUpdateMethodBinder
-import javax.lang.model.element.ExecutableElement
 
 class DeletionMethod(
-    element: ExecutableElement,
+    element: XMethodElement,
     name: String,
     entities: Map<String, ShortcutEntity>,
     parameters: List<ShortcutQueryParameter>,
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/EmbeddedField.kt b/room/compiler/src/main/kotlin/androidx/room/vo/EmbeddedField.kt
index 060fce12..6d98f81 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/EmbeddedField.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/EmbeddedField.kt
@@ -17,7 +17,6 @@
 package androidx.room.vo
 
 import androidx.annotation.NonNull
-import androidx.room.ext.hasAnnotation
 
 /**
  * Used when a field is embedded inside an Entity or Pojo.
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Entity.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Entity.kt
index d65a08c..c0e9756 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Entity.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Entity.kt
@@ -18,16 +18,16 @@
 
 import androidx.room.migration.bundle.BundleUtil
 import androidx.room.migration.bundle.EntityBundle
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XTypeElement
 
 /**
  * A Pojo with a mapping SQLite table.
  */
 open class Entity(
-    element: TypeElement,
+    element: XTypeElement,
     override val tableName: String,
-    type: DeclaredType,
+    type: XDeclaredType,
     fields: List<Field>,
     embeddedFields: List<EmbeddedField>,
     val primaryKey: PrimaryKey,
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Field.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Field.kt
index 3d9cf46..a71b42b 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Field.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Field.kt
@@ -16,23 +16,21 @@
 
 package androidx.room.vo
 
-import androidx.room.ext.isNonNull
-import androidx.room.ext.typeName
 import androidx.room.migration.bundle.FieldBundle
 import androidx.room.parser.Collate
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XElement
+import androidx.room.processing.XType
+import androidx.room.processing.XVariableElement
 import androidx.room.solver.types.CursorValueReader
 import androidx.room.solver.types.StatementValueBinder
 import com.squareup.javapoet.TypeName
-import javax.lang.model.element.Element
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.TypeMirror
 
 // used in cache matching, must stay as a data class or implement equals
 data class Field(
-    val element: VariableElement,
+    val element: XVariableElement,
     val name: String,
-    val type: TypeMirror,
+    val type: XType,
     var affinity: SQLTypeAffinity?,
     val collate: Collate? = null,
     val columnName: String = name,
@@ -51,7 +49,7 @@
     var statementBinder: StatementValueBinder? = null
     // reads this field from a cursor column
     var cursorValueReader: CursorValueReader? = null
-    val typeName: TypeName by lazy { type.typeName() }
+    val typeName: TypeName by lazy { type.typeName }
 
     override fun getIdKey(): String {
         return buildString {
@@ -150,7 +148,7 @@
     )
 
     companion object {
-        fun calcNonNull(element: Element, parent: EmbeddedField?): Boolean {
+        fun calcNonNull(element: XElement, parent: EmbeddedField?): Boolean {
             return element.isNonNull() && (parent == null || parent.isNonNullRecursively())
         }
     }
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/FieldGetter.kt b/room/compiler/src/main/kotlin/androidx/room/vo/FieldGetter.kt
index e3fe7c8..31e96f9 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/FieldGetter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/FieldGetter.kt
@@ -18,11 +18,10 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import com.squareup.javapoet.CodeBlock
-import javax.lang.model.type.TypeMirror
 
-data class FieldGetter(val name: String, val type: TypeMirror, val callType: CallType) {
+data class FieldGetter(val name: String, val type: XType, val callType: CallType) {
     fun writeGet(ownerVar: String, outVar: String, builder: CodeBlock.Builder) {
         val stmt = when (callType) {
             CallType.FIELD -> "final $T $L = $L.$L"
@@ -30,7 +29,7 @@
             CallType.CONSTRUCTOR -> null
         }
         stmt?.let {
-            builder.addStatement(stmt, type.typeName(), outVar, ownerVar, name)
+            builder.addStatement(stmt, type.typeName, outVar, ownerVar, name)
         }
     }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/FieldSetter.kt b/room/compiler/src/main/kotlin/androidx/room/vo/FieldSetter.kt
index 7c0001c..ba1bd679 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/FieldSetter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/FieldSetter.kt
@@ -17,10 +17,10 @@
 package androidx.room.vo
 
 import androidx.room.ext.L
+import androidx.room.processing.XType
 import com.squareup.javapoet.CodeBlock
-import javax.lang.model.type.TypeMirror
 
-data class FieldSetter(val name: String, val type: TypeMirror, val callType: CallType) {
+data class FieldSetter(val name: String, val type: XType, val callType: CallType) {
     fun writeSet(ownerVar: String, inVar: String, builder: CodeBlock.Builder) {
         val stmt = when (callType) {
             CallType.FIELD -> "$L.$L = $L"
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/ForeignKeyAction.kt b/room/compiler/src/main/kotlin/androidx/room/vo/ForeignKeyAction.kt
index 2d16827..5fbaf5c 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/ForeignKeyAction.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/ForeignKeyAction.kt
@@ -29,7 +29,7 @@
     CASCADE(ForeignKey.CASCADE, "CASCADE");
     companion object {
         private val mapping by lazy {
-            ForeignKeyAction.values().associateBy { it.annotationValue }
+            values().associateBy { it.annotationValue }
         }
         fun fromAnnotationValue(value: Int?) = mapping[value]
     }
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/FtsEntity.kt b/room/compiler/src/main/kotlin/androidx/room/vo/FtsEntity.kt
index ad21c50..e316f9d 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/FtsEntity.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/FtsEntity.kt
@@ -19,16 +19,16 @@
 import androidx.room.migration.bundle.BundleUtil
 import androidx.room.migration.bundle.FtsEntityBundle
 import androidx.room.parser.FtsVersion
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XTypeElement
 
 /**
  * An Entity with a mapping FTS table.
  */
 class FtsEntity(
-    element: TypeElement,
+    element: XTypeElement,
     tableName: String,
-    type: DeclaredType,
+    type: XDeclaredType,
     fields: List<Field>,
     embeddedFields: List<EmbeddedField>,
     primaryKey: PrimaryKey,
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/InsertionMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/InsertionMethod.kt
index f7ed330..9b969f7 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/InsertionMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/InsertionMethod.kt
@@ -17,16 +17,16 @@
 package androidx.room.vo
 
 import androidx.room.OnConflictStrategy
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
 import androidx.room.solver.shortcut.binder.InsertMethodBinder
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.TypeMirror
 
 data class InsertionMethod(
-    val element: ExecutableElement,
+    val element: XMethodElement,
     val name: String,
     @OnConflictStrategy val onConflict: Int,
     val entities: Map<String, ShortcutEntity>,
-    val returnType: TypeMirror,
+    val returnType: XType,
     val parameters: List<ShortcutQueryParameter>,
     val methodBinder: InsertMethodBinder
 )
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/KotlinDefaultMethodDelegate.kt b/room/compiler/src/main/kotlin/androidx/room/vo/KotlinDefaultMethodDelegate.kt
index 219c954..9b961ad 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/KotlinDefaultMethodDelegate.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/KotlinDefaultMethodDelegate.kt
@@ -16,13 +16,13 @@
 
 package androidx.room.vo
 
-import javax.lang.model.element.ExecutableElement
+import androidx.room.processing.XMethodElement
 
 /**
  * Represents a DAO method that delegates to a concrete implementation, such as a concrete function
  * in a Kotlin interface.
  */
 data class KotlinDefaultMethodDelegate(
-    val element: ExecutableElement,
-    val delegateElement: ExecutableElement
+    val element: XMethodElement,
+    val delegateElement: XMethodElement
 )
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/LanguageId.kt b/room/compiler/src/main/kotlin/androidx/room/vo/LanguageId.kt
index 58733ee..4a12c7d 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/LanguageId.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/LanguageId.kt
@@ -16,12 +16,12 @@
 
 package androidx.room.vo
 
-import javax.lang.model.element.Element
+import androidx.room.processing.XElement
 
 /**
  * Represents the 'languageid' column of an FTS entity.
  */
-data class LanguageId(val declaredIn: Element?, val field: Field?) {
+data class LanguageId(val declaredIn: XElement?, val field: Field?) {
 
     companion object {
         val MISSING = LanguageId(null, null)
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Pojo.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Pojo.kt
index 7eb34c19..43ebcd5 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Pojo.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Pojo.kt
@@ -16,26 +16,24 @@
 
 package androidx.room.vo
 
-import androidx.room.ext.toAnnotationBox
-import androidx.room.ext.typeName
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XTypeElement
 import androidx.room.processor.DatabaseViewProcessor
 import androidx.room.processor.EntityProcessor
 import com.squareup.javapoet.TypeName
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
 
 /**
  * A class is turned into a Pojo if it is used in a query response.
  */
 open class Pojo(
-    val element: TypeElement,
-    val type: DeclaredType,
+    val element: XTypeElement,
+    val type: XDeclaredType,
     fields: List<Field>,
     val embeddedFields: List<EmbeddedField>,
     val relations: List<Relation>,
     val constructor: Constructor? = null
 ) : HasFields {
-    val typeName: TypeName by lazy { type.typeName() }
+    val typeName: TypeName by lazy { type.typeName }
 
     override val fields = Fields(fields)
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/PojoMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/PojoMethod.kt
index 63f6436..fd678e4 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/PojoMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/PojoMethod.kt
@@ -16,14 +16,14 @@
 
 package androidx.room.vo
 
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.ExecutableType
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XMethodType
 
 /**
  * An executable element processed as member of a class (pojo or entity)
  */
 class PojoMethod(
-    val element: ExecutableElement,
-    val resolvedType: ExecutableType,
+    val element: XMethodElement,
+    val resolvedType: XMethodType,
     val name: String
 )
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/PrimaryKey.kt b/room/compiler/src/main/kotlin/androidx/room/vo/PrimaryKey.kt
index 236ee8e..671f5e8 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/PrimaryKey.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/PrimaryKey.kt
@@ -16,13 +16,13 @@
 package androidx.room.vo
 
 import androidx.room.migration.bundle.PrimaryKeyBundle
-import javax.lang.model.element.Element
+import androidx.room.processing.XElement
 
 /**
  * Represents a PrimaryKey for an Entity.
  */
 data class PrimaryKey(
-    val declaredIn: Element?,
+    val declaredIn: XElement?,
     override val fields: Fields,
     val autoGenerateId: Boolean
 ) : HasSchemaIdentity, HasFields {
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/QueryMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/QueryMethod.kt
index cc62b4c..2d9af9e 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/QueryMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/QueryMethod.kt
@@ -17,20 +17,20 @@
 package androidx.room.vo
 
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
 import androidx.room.solver.prepared.binder.PreparedQueryResultBinder
 import androidx.room.solver.query.result.QueryResultBinder
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.TypeMirror
 
 /**
  * A class that holds information about a QueryMethod.
  * It is self sufficient and must have all generics etc resolved once created.
  */
 sealed class QueryMethod(
-    val element: ExecutableElement,
+    val element: XMethodElement,
     val query: ParsedQuery,
     val name: String,
-    val returnType: TypeMirror,
+    val returnType: XType,
     val parameters: List<QueryParameter>
 ) {
     val sectionToParamMapping by lazy {
@@ -53,10 +53,10 @@
  * A query method who's query is a SELECT statement.
  */
 class ReadQueryMethod(
-    element: ExecutableElement,
+    element: XMethodElement,
     query: ParsedQuery,
     name: String,
-    returnType: TypeMirror,
+    returnType: XType,
     parameters: List<QueryParameter>,
     val inTransaction: Boolean,
     val queryResultBinder: QueryResultBinder
@@ -66,10 +66,10 @@
  * A query method who's query is a INSERT, UPDATE or DELETE statement.
  */
 class WriteQueryMethod(
-    element: ExecutableElement,
+    element: XMethodElement,
     query: ParsedQuery,
     name: String,
-    returnType: TypeMirror,
+    returnType: XType,
     parameters: List<QueryParameter>,
     val preparedQueryResultBinder: PreparedQueryResultBinder
 ) : QueryMethod(element, query, name, returnType, parameters)
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/QueryParameter.kt b/room/compiler/src/main/kotlin/androidx/room/vo/QueryParameter.kt
index 4187378..b3265ab 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/QueryParameter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/QueryParameter.kt
@@ -16,8 +16,8 @@
 
 package androidx.room.vo
 
+import androidx.room.processing.XType
 import androidx.room.solver.query.parameter.QueryParameterAdapter
-import javax.lang.model.type.TypeMirror
 
 /**
  * Holds the parameter for a {@link QueryMethod}.
@@ -27,6 +27,6 @@
     val name: String,
         // this is the name used in the query. Might be different for kotlin queries
     val sqlName: String,
-    val type: TypeMirror,
+    val type: XType,
     val queryParamAdapter: QueryParameterAdapter?
 )
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/RawQueryMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/RawQueryMethod.kt
index 0ffe998..fb4ad76 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/RawQueryMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/RawQueryMethod.kt
@@ -17,29 +17,27 @@
 package androidx.room.vo
 
 import androidx.room.ext.CommonTypeNames
-import androidx.room.ext.KotlinTypeNames
 import androidx.room.ext.SupportDbTypeNames
-import androidx.room.ext.typeName
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
 import androidx.room.solver.query.result.QueryResultBinder
 import com.squareup.javapoet.TypeName
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.TypeMirror
 
 /**
  * A class that holds information about a method annotated with RawQuery.
  * It is self sufficient and must have all generics etc resolved once created.
  */
 data class RawQueryMethod(
-    val element: ExecutableElement,
+    val element: XMethodElement,
     val name: String,
-    val returnType: TypeMirror,
+    val returnType: XType,
     val inTransaction: Boolean,
     val observedTableNames: Set<String>,
     val runtimeQueryParam: RuntimeQueryParameter?,
     val queryResultBinder: QueryResultBinder
 ) {
     val returnsValue by lazy {
-        returnType.typeName() != TypeName.VOID && returnType.typeName() != KotlinTypeNames.UNIT
+        returnType.isNotVoid() && !returnType.isKotlinUnit()
     }
 
     data class RuntimeQueryParameter(
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Relation.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Relation.kt
index 233a707..85d9ad1 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Relation.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Relation.kt
@@ -16,8 +16,7 @@
 
 package androidx.room.vo
 
-import androidx.room.ext.typeName
-import javax.lang.model.type.TypeMirror
+import androidx.room.processing.XType
 
 /**
  * Value object created from processing a @Relation annotation.
@@ -25,7 +24,7 @@
 class Relation(
     val entity: EntityOrView,
     // return type. e..g. String in @Relation List<String>
-    val pojoType: TypeMirror,
+    val pojoType: XType,
     // field in Pojo that holds these relations (e.g. List<Pet> pets)
     val field: Field,
     // the parent field referenced for matching
@@ -38,7 +37,7 @@
     // the projection for the query
     val projection: List<String>
 ) {
-    val pojoTypeName by lazy { pojoType.typeName() }
+    val pojoTypeName by lazy { pojoType.typeName }
 
     fun createLoadAllSql(): String {
         val resultFields = projection.toSet()
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/RelationCollector.kt b/room/compiler/src/main/kotlin/androidx/room/vo/RelationCollector.kt
index 86ff8bf..f58ef3d 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/RelationCollector.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/RelationCollector.kt
@@ -21,14 +21,10 @@
 import androidx.room.ext.L
 import androidx.room.ext.N
 import androidx.room.ext.T
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.findTypeElement
-import androidx.room.ext.requireTypeElement
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.parser.SqlParser
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors.cannotFindQueryResultAdapter
 import androidx.room.processor.ProcessorErrors.relationAffinityMismatch
@@ -49,7 +45,6 @@
 import java.nio.ByteBuffer
 import java.util.ArrayList
 import java.util.HashSet
-import javax.lang.model.type.TypeMirror
 
 /**
  * Internal class that is used to manage fetching 1/N to N relationships.
@@ -263,7 +258,7 @@
                 } else {
                     val keyTypeMirror = keyTypeMirrorFor(context, affinity)
                     val set = context.processingEnv.requireTypeElement("java.util.Set")
-                    val keySet = context.processingEnv.typeUtils.getDeclaredType(set, keyTypeMirror)
+                    val keySet = context.processingEnv.getDeclaredType(set, keyTypeMirror)
                     QueryParameter(
                             name = RelationCollectorMethodWriter.KEY_SET_VARIABLE,
                             sqlName = RelationCollectorMethodWriter.KEY_SET_VARIABLE,
@@ -413,13 +408,13 @@
         }
 
         // Gets the type mirror of the relationship key.
-        private fun keyTypeMirrorFor(context: Context, affinity: SQLTypeAffinity): TypeMirror {
+        private fun keyTypeMirrorFor(context: Context, affinity: SQLTypeAffinity): XType {
             val processingEnv = context.processingEnv
             return when (affinity) {
-                SQLTypeAffinity.INTEGER -> processingEnv.requireTypeMirror("java.lang.Long")
-                SQLTypeAffinity.REAL -> processingEnv.requireTypeMirror("java.lang.Double")
+                SQLTypeAffinity.INTEGER -> processingEnv.requireType("java.lang.Long")
+                SQLTypeAffinity.REAL -> processingEnv.requireType("java.lang.Double")
                 SQLTypeAffinity.TEXT -> context.COMMON_TYPES.STRING
-                SQLTypeAffinity.BLOB -> processingEnv.requireTypeMirror("java.nio.ByteBuffer")
+                SQLTypeAffinity.BLOB -> processingEnv.requireType("java.nio.ByteBuffer")
                 else -> {
                     context.COMMON_TYPES.STRING
                 }
@@ -435,7 +430,7 @@
                 SQLTypeAffinity.BLOB -> TypeName.get(ByteBuffer::class.java)
                 else -> {
                     // no affinity select from type
-                    context.COMMON_TYPES.STRING.typeName()
+                    context.COMMON_TYPES.STRING.typeName
                 }
             }
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/ShortcutMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/ShortcutMethod.kt
index 6595460..7acd642 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/ShortcutMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/ShortcutMethod.kt
@@ -16,14 +16,14 @@
 
 package androidx.room.vo
 
+import androidx.room.processing.XMethodElement
 import androidx.room.solver.shortcut.binder.DeleteOrUpdateMethodBinder
-import javax.lang.model.element.ExecutableElement
 
 /**
  * Base class for shortcut methods in @DAO.
  */
 abstract class ShortcutMethod(
-    val element: ExecutableElement,
+    val element: XMethodElement,
     val name: String,
     val entities: Map<String, ShortcutEntity>,
     val parameters: List<ShortcutQueryParameter>,
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/ShortcutQueryParameter.kt b/room/compiler/src/main/kotlin/androidx/room/vo/ShortcutQueryParameter.kt
index 59f5192..00d786c 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/ShortcutQueryParameter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/ShortcutQueryParameter.kt
@@ -16,17 +16,17 @@
 
 package androidx.room.vo
 
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.TypeMirror
+import androidx.room.processing.XType
+import androidx.room.processing.XVariableElement
 
 /**
  * Parameters used in DAO methods that are annotated with Insert, Delete, Update.
  */
 data class ShortcutQueryParameter(
-    val element: VariableElement,
+    val element: XVariableElement,
     val name: String,
-    val type: TypeMirror, // actual param type (List<Foo>, Set<Foo>, Foo, etc...)
-    val pojoType: TypeMirror?, // extracted type, never a Collection
+    val type: XType, // actual param type (List<Foo>, Set<Foo>, Foo, etc...)
+    val pojoType: XType?, // extracted type, never a Collection
     val isMultiple: Boolean
 ) {
     /**
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/TransactionMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/TransactionMethod.kt
index ff9af62..317fbe0 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/TransactionMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/TransactionMethod.kt
@@ -16,13 +16,13 @@
 
 package androidx.room.vo
 
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
 import androidx.room.solver.transaction.binder.TransactionMethodBinder
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.TypeMirror
 
 class TransactionMethod(
-    val element: ExecutableElement,
-    val returnType: TypeMirror,
+    val element: XMethodElement,
+    val returnType: XType,
     val parameterNames: List<String>,
     val callType: CallType,
     val methodBinder: TransactionMethodBinder
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/UpdateMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/UpdateMethod.kt
index 183dd6e..a4d921b 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/UpdateMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/UpdateMethod.kt
@@ -17,11 +17,11 @@
 package androidx.room.vo
 
 import androidx.room.OnConflictStrategy
+import androidx.room.processing.XMethodElement
 import androidx.room.solver.shortcut.binder.DeleteOrUpdateMethodBinder
-import javax.lang.model.element.ExecutableElement
 
 class UpdateMethod(
-    element: ExecutableElement,
+    element: XMethodElement,
     name: String,
     entities: Map<String, ShortcutEntity>,
     parameters: List<ShortcutQueryParameter>,
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Warning.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Warning.kt
index 6509b6f..d63b495 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Warning.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Warning.kt
@@ -46,7 +46,7 @@
     EXPAND_PROJECTION_WITH_REMOVE_UNUSED_COLUMNS("ROOM_EXPAND_PROJECTION_WITH_UNUSED_COLUMNS");
 
     companion object {
-        val PUBLIC_KEY_MAP = Warning.values().associateBy { it.publicKey }
+        val PUBLIC_KEY_MAP = values().associateBy { it.publicKey }
         fun fromPublicKey(publicKey: String): Warning? {
             return PUBLIC_KEY_MAP[publicKey.toUpperCase()]
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/ClassWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/ClassWriter.kt
index 0fdcd22..8ba34d2 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/ClassWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/ClassWriter.kt
@@ -18,8 +18,8 @@
 
 import androidx.room.RoomProcessor
 import androidx.room.ext.S
-import androidx.room.ext.getGeneratedAnnotation
 import androidx.room.ext.typeName
+import androidx.room.processing.XProcessingEnv
 import androidx.room.solver.CodeGenScope.Companion.CLASS_PROPERTY_PREFIX
 import com.squareup.javapoet.AnnotationSpec
 import com.squareup.javapoet.ClassName
@@ -28,7 +28,6 @@
 import com.squareup.javapoet.MethodSpec
 import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeSpec
-import javax.annotation.processing.ProcessingEnvironment
 
 /**
  * Base class for all writers that can produce a class.
@@ -41,7 +40,7 @@
 
     abstract fun createTypeSpecBuilder(): TypeSpec.Builder
 
-    fun write(processingEnv: ProcessingEnvironment) {
+    fun write(processingEnv: XProcessingEnv) {
         val builder = createTypeSpecBuilder()
         sharedFieldSpecs.values.forEach { builder.addField(it) }
         sharedMethodSpecs.values.forEach { builder.addMethod(it) }
@@ -53,7 +52,7 @@
     }
 
     private fun addSuppressWarnings(builder: TypeSpec.Builder) {
-        val suppressSpec = AnnotationSpec.builder(SuppressWarnings::class.typeName())
+        val suppressSpec = AnnotationSpec.builder(SuppressWarnings::class.typeName)
             .addMember(
                 "value",
                 "{$S, $S}",
@@ -64,11 +63,11 @@
 
     private fun addGeneratedAnnotationIfAvailable(
         adapterTypeSpecBuilder: TypeSpec.Builder,
-        processingEnv: ProcessingEnvironment
+        processingEnv: XProcessingEnv
     ) {
-        processingEnv.getGeneratedAnnotation()?.let {
+        processingEnv.findGeneratedAnnotation()?.let {
             val generatedAnnotationSpec =
-                AnnotationSpec.builder(ClassName.get(it))
+                AnnotationSpec.builder(it.className)
                     .addMember("value", S, RoomProcessor::class.java.canonicalName)
                     .build()
             adapterTypeSpecBuilder.addAnnotation(generatedAnnotationSpec)
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt
index 0955ff1..bfd8511 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt
@@ -21,9 +21,12 @@
 import androidx.room.ext.RoomTypeNames
 import androidx.room.ext.SupportDbTypeNames
 import androidx.room.ext.T
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.isInterface
-import androidx.room.ext.name
+import androidx.room.processing.MethodSpecHelper
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XElement
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XProcessingEnv
+import androidx.room.processing.addOriginatingElement
 import androidx.room.processor.OnConflictProcessor
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.KotlinDefaultMethodDelegateBinder
@@ -46,21 +49,17 @@
 import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeSpec
 import stripNonJava
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.element.Element
-import javax.lang.model.element.ExecutableElement
 import javax.lang.model.element.Modifier.FINAL
 import javax.lang.model.element.Modifier.PRIVATE
 import javax.lang.model.element.Modifier.PUBLIC
-import javax.lang.model.type.DeclaredType
 
 /**
  * Creates the implementation for a class annotated with Dao.
  */
 class DaoWriter(
     val dao: Dao,
-    private val dbElement: Element,
-    val processingEnv: ProcessingEnvironment
+    private val dbElement: XElement,
+    val processingEnv: XProcessingEnv
 ) :
     ClassWriter(dao.typeName) {
     private val declaredDao = dao.element.asDeclaredType()
@@ -213,7 +212,7 @@
                 addStatement("super($N)", dbParam)
             }
             addStatement("this.$N = $N", dbField, dbParam)
-            shortcutMethods.filterNot {
+            shortcutMethods.asSequence().filterNot {
                 it.fields.isEmpty()
             }.map {
                 it.fields.values
@@ -449,22 +448,10 @@
     }
 
     private fun overrideWithoutAnnotations(
-        elm: ExecutableElement,
-        owner: DeclaredType
+        elm: XMethodElement,
+        owner: XDeclaredType
     ): MethodSpec.Builder {
-        val baseSpec = MethodSpec.overriding(elm, owner, processingEnv.typeUtils)
-                .build()
-
-        // make all the params final
-        val params = baseSpec.parameters.map { it.toBuilder().addModifiers(FINAL).build() }
-
-        return MethodSpec.methodBuilder(baseSpec.name).apply {
-            addAnnotation(Override::class.java)
-            addModifiers(baseSpec.modifiers)
-            addParameters(params)
-            varargs(baseSpec.varargs)
-            returns(baseSpec.returnType)
-        }
+        return MethodSpecHelper.overridingWithFinalParams(elm, owner)
     }
 
     /**
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt
index 5f586be..1baca0e 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt
@@ -24,8 +24,9 @@
 import androidx.room.ext.S
 import androidx.room.ext.SupportDbTypeNames
 import androidx.room.ext.T
-import androidx.room.ext.asExecutableElement
 import androidx.room.ext.typeName
+import androidx.room.processing.MethodSpecHelper
+import androidx.room.processing.addOriginatingElement
 import androidx.room.solver.CodeGenScope
 import androidx.room.vo.DaoMethod
 import androidx.room.vo.Database
@@ -37,7 +38,6 @@
 import com.squareup.javapoet.TypeSpec
 import stripNonJava
 import java.util.Locale
-import javax.lang.model.element.Modifier
 import javax.lang.model.element.Modifier.FINAL
 import javax.lang.model.element.Modifier.PRIVATE
 import javax.lang.model.element.Modifier.PROTECTED
@@ -122,7 +122,7 @@
             addModifiers(PROTECTED)
             returns(RoomTypeNames.INVALIDATION_TRACKER)
             val shadowTablesVar = "_shadowTablesMap"
-            val shadowTablesTypeName = ParameterizedTypeName.get(HashMap::class.typeName(),
+            val shadowTablesTypeName = ParameterizedTypeName.get(HashMap::class.typeName,
                     CommonTypeNames.STRING, CommonTypeNames.STRING)
             val tableNames = database.entities.joinToString(",") {
                 "\"${it.tableName}\""
@@ -138,9 +138,9 @@
                 addStatement("$L.put($S, $S)", shadowTablesVar, tableName, shadowTableName)
             }
             val viewTablesVar = scope.getTmpVar("_viewTables")
-            val tablesType = ParameterizedTypeName.get(HashSet::class.typeName(),
+            val tablesType = ParameterizedTypeName.get(HashSet::class.typeName,
                     CommonTypeNames.STRING)
-            val viewTablesType = ParameterizedTypeName.get(HashMap::class.typeName(),
+            val viewTablesType = ParameterizedTypeName.get(HashMap::class.typeName,
                     CommonTypeNames.STRING,
                     ParameterizedTypeName.get(CommonTypeNames.SET,
                             CommonTypeNames.STRING))
@@ -176,7 +176,10 @@
     }
 
     private fun createDaoGetter(field: FieldSpec, method: DaoMethod): MethodSpec {
-        return MethodSpec.overriding(method.element.asExecutableElement()).apply {
+        return MethodSpecHelper.overridingWithFinalParams(
+            elm = method.element,
+            owner = database.element.type
+        ).apply {
             beginControlFlow("if ($N != null)", field).apply {
                 addStatement("return $N", field)
             }
@@ -197,7 +200,7 @@
     private fun createCreateOpenHelper(): MethodSpec {
         val scope = CodeGenScope(this)
         return MethodSpec.methodBuilder("createOpenHelper").apply {
-            addModifiers(Modifier.PROTECTED)
+            addModifiers(PROTECTED)
             addAnnotation(Override::class.java)
             returns(SupportDbTypeNames.SQLITE_OPEN_HELPER)
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/EntityDeletionAdapterWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/EntityDeletionAdapterWriter.kt
index fa83626..72de740 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/EntityDeletionAdapterWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/EntityDeletionAdapterWriter.kt
@@ -24,7 +24,6 @@
 import androidx.room.vo.FieldWithIndex
 import androidx.room.vo.Fields
 import androidx.room.vo.ShortcutEntity
-import androidx.room.vo.columnNames
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.MethodSpec
 import com.squareup.javapoet.ParameterSpec
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/EntityInsertionAdapterWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/EntityInsertionAdapterWriter.kt
index f2163b5..43adb6e 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/EntityInsertionAdapterWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/EntityInsertionAdapterWriter.kt
@@ -31,7 +31,6 @@
 import com.squareup.javapoet.ParameterizedTypeName
 import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeSpec
-import isPrimitive
 import javax.lang.model.element.Modifier.PUBLIC
 
 class EntityInsertionAdapterWriter private constructor(
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/FieldReadWriteWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/FieldReadWriteWriter.kt
index 4ffb54a..aa4e649 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/FieldReadWriteWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/FieldReadWriteWriter.kt
@@ -19,7 +19,6 @@
 import androidx.room.ext.L
 import androidx.room.ext.T
 import androidx.room.ext.defaultValue
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import androidx.room.vo.CallType
 import androidx.room.vo.Constructor
@@ -191,7 +190,7 @@
                     }.associateBy { fwi ->
                         FieldReadWriteWriter(fwi).readIntoTmpVar(
                             cursorVar,
-                            fwi.field.setter.type.typeName(),
+                            fwi.field.setter.type.typeName,
                             scope)
                     }
                     // read decomposed fields (e.g. embedded)
@@ -326,7 +325,7 @@
                         }
                         CallType.METHOD -> {
                             val tmpField = scope.getTmpVar("_tmp${field.name.capitalize()}")
-                            addStatement("final $T $L", field.setter.type.typeName(), tmpField)
+                            addStatement("final $T $L", field.setter.type.typeName, tmpField)
                             reader.readFromCursor(tmpField, cursorVar, indexVar, scope)
                             addStatement("$L.$L($L)", ownerVar, field.setter.name, tmpField)
                         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/FtsTableInfoValidationWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/FtsTableInfoValidationWriter.kt
index 6280baf..2d5ffa9 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/FtsTableInfoValidationWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/FtsTableInfoValidationWriter.kt
@@ -34,7 +34,7 @@
         val expectedInfoVar = scope.getTmpVar("_info$suffix")
         scope.builder().apply {
             val columnListVar = scope.getTmpVar("_columns$suffix")
-            val columnListType = ParameterizedTypeName.get(HashSet::class.typeName(),
+            val columnListType = ParameterizedTypeName.get(HashSet::class.typeName,
                     CommonTypeNames.STRING)
 
             addStatement("final $T $L = new $T($L)", columnListType, columnListVar,
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt
index c59c6ed..8b27b53 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt
@@ -103,7 +103,7 @@
                     }
                 }
 
-                addStatement("final $T $L = $L.toString()", String::class.typeName(),
+                addStatement("final $T $L = $L.toString()", String::class.typeName,
                         outSqlQueryName, stringBuilderVar)
                 if (outArgsName != null) {
                     val argCount = scope.getTmpVar("_argCount")
@@ -114,7 +114,7 @@
                             argCount)
                 }
             } else {
-                addStatement("final $T $L = $S", String::class.typeName(),
+                addStatement("final $T $L = $S", String::class.typeName,
                         outSqlQueryName, query.queryWithReplacedBindParams)
                 if (outArgsName != null) {
                     addStatement("final $T $L = $T.acquire($L, $L)",
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt
index 84bb9bd..578dd43 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt
@@ -44,7 +44,7 @@
         val expectedInfoVar = scope.getTmpVar("_info$suffix")
         scope.builder().apply {
             val columnListVar = scope.getTmpVar("_columns$suffix")
-            val columnListType = ParameterizedTypeName.get(HashMap::class.typeName(),
+            val columnListType = ParameterizedTypeName.get(HashMap::class.typeName,
                     CommonTypeNames.STRING, RoomTypeNames.TABLE_INFO_COLUMN)
 
             addStatement("final $T $L = new $T($L)", columnListType, columnListVar,
@@ -61,7 +61,7 @@
             }
 
             val foreignKeySetVar = scope.getTmpVar("_foreignKeys$suffix")
-            val foreignKeySetType = ParameterizedTypeName.get(HashSet::class.typeName(),
+            val foreignKeySetType = ParameterizedTypeName.get(HashSet::class.typeName,
                     RoomTypeNames.TABLE_INFO_FOREIGN_KEY)
             addStatement("final $T $L = new $T($L)", foreignKeySetType, foreignKeySetVar,
                     foreignKeySetType, entity.foreignKeys.size)
@@ -76,14 +76,14 @@
                         /*parent table*/ it.parentTable,
                         /*on delete*/ it.onDelete.sqlName,
                         /*on update*/ it.onUpdate.sqlName,
-                        Arrays::class.typeName(),
+                        Arrays::class.typeName,
                         /*parent names*/ myColumnNames,
-                        Arrays::class.typeName(),
+                        Arrays::class.typeName,
                         /*parent column names*/ refColumnNames)
             }
 
             val indicesSetVar = scope.getTmpVar("_indices$suffix")
-            val indicesType = ParameterizedTypeName.get(HashSet::class.typeName(),
+            val indicesType = ParameterizedTypeName.get(HashSet::class.typeName,
                     RoomTypeNames.TABLE_INFO_INDEX)
             addStatement("final $T $L = new $T($L)", indicesType, indicesSetVar,
                     indicesType, entity.indices.size)
@@ -94,7 +94,7 @@
                         RoomTypeNames.TABLE_INFO_INDEX,
                         index.name,
                         index.unique,
-                        Arrays::class.typeName(),
+                        Arrays::class.typeName,
                         columnNames)
             }
 
diff --git a/room/compiler/src/test/kotlin/androidx/room/ext/ElementExtTest.kt b/room/compiler/src/test/kotlin/androidx/room/ext/ElementExtTest.kt
index 0f5c55d..1beb56b 100644
--- a/room/compiler/src/test/kotlin/androidx/room/ext/ElementExtTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/ext/ElementExtTest.kt
@@ -16,7 +16,7 @@
 
 package androidx.room.ext
 
-import box
+import androidx.room.processing.XExecutableElement
 import com.google.common.truth.Truth.assertThat
 import com.google.testing.compile.JavaFileObjects
 import com.squareup.javapoet.ClassName
@@ -25,7 +25,6 @@
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import simpleRun
-import javax.lang.model.element.ExecutableElement
 
 @RunWith(JUnit4::class)
 class ElementExtTest {
@@ -65,7 +64,7 @@
             val parent = it.processingEnv.requireTypeElement("foo.bar.Parent")
             val child = it.processingEnv.requireTypeElement("foo.bar.Child")
             val objectMethods = it.processingEnv.requireTypeElement("java.lang.Object")
-                .getAllMethods(it.processingEnv).map {
+                .getAllMethods().map {
                     it.name
                 } - "registerNatives"
             val parentMethods = listOf(
@@ -77,9 +76,9 @@
                 "childStaticPublic", "overridden"
             )
             assertThat(parent.getDeclaredMethods()).containsExactlyElementsIn(parentMethods)
-            assertThat(parent.getAllMethods(it.processingEnv))
+            assertThat(parent.getAllMethods())
                 .containsExactlyElementsIn(parentMethods + objectMethods)
-            assertThat(parent.getAllNonPrivateInstanceMethods(it.processingEnv))
+            assertThat(parent.getAllNonPrivateInstanceMethods())
                 .containsExactlyElementsIn(
                     parentMethods + objectMethods -
                             listOf("parentPrivate", "parentStaticPrivate", "parentStaticPublic")
@@ -88,12 +87,12 @@
             assertThat(child.getDeclaredMethods()).containsExactlyElementsIn(
                 childMethods
             )
-            assertThat(child.getAllMethods(it.processingEnv)).containsExactlyElementsIn(
+            assertThat(child.getAllMethods()).containsExactlyElementsIn(
                 childMethods + parentMethods + objectMethods -
                         listOf("parentPrivate", "parentStaticPrivate", "overridden") +
                         "overridden" // add 1 overridden back
             )
-            assertThat(child.getAllNonPrivateInstanceMethods(it.processingEnv))
+            assertThat(child.getAllNonPrivateInstanceMethods())
                 .containsExactlyElementsIn(
                     childMethods + parentMethods + objectMethods -
                             listOf(
@@ -140,7 +139,7 @@
             val parent = it.processingEnv.requireTypeElement("foo.bar.Parent")
             val child = it.processingEnv.requireTypeElement("foo.bar.Child")
             val objectMethods = it.processingEnv.requireTypeElement("java.lang.Object")
-                .getAllMethods(it.processingEnv).map {
+                .getAllMethods().map {
                     it.name
                 } - listOf("registerNatives", "clone", "finalize")
             val parentMethods = listOf(
@@ -151,19 +150,19 @@
             )
             assertThat(parent.getDeclaredMethods())
                 .containsExactlyElementsIn(parentMethods)
-            assertThat(parent.getAllMethods(it.processingEnv))
+            assertThat(parent.getAllMethods())
                 .containsExactlyElementsIn(parentMethods + objectMethods)
-            assertThat(parent.getAllNonPrivateInstanceMethods(it.processingEnv))
+            assertThat(parent.getAllNonPrivateInstanceMethods())
                 .containsExactly("parentPublic", "overridden")
 
             assertThat(child.getDeclaredMethods())
                 .containsExactlyElementsIn(childMethods)
-            assertThat(child.getAllMethods(it.processingEnv)).containsExactlyElementsIn(
+            assertThat(child.getAllMethods()).containsExactlyElementsIn(
                 childMethods + parentMethods + objectMethods -
                         listOf("parentStaticPrivate", "parentStaticPublic", "overridden") +
                         "overridden" // add 1 overridden back
             )
-            assertThat(child.getAllNonPrivateInstanceMethods(it.processingEnv))
+            assertThat(child.getAllNonPrivateInstanceMethods())
                 .containsExactly(
                     "childPublic", "parentPublic", "overridden"
                 )
@@ -191,7 +190,7 @@
             jfos = *arrayOf(testCode)
         ) {
             val element = it.processingEnv.requireTypeElement("foo.bar.Baz")
-            val field = element.getAllFieldsIncludingPrivateSupers(it.processingEnv)
+            val field = element.getAllFieldsIncludingPrivateSupers()
                 .first {
                     it.name == "field"
                 }
@@ -199,9 +198,9 @@
                 .first {
                     it.name == "method"
                 }
-            assertThat(field.type.typeName()).isEqualTo(TypeName.INT)
-            assertThat(method.returnType.typeName()).isEqualTo(TypeName.INT)
-            assertThat(element.type.typeName()).isEqualTo(ClassName.get("foo.bar", "Baz"))
+            assertThat(field.type.typeName).isEqualTo(TypeName.INT)
+            assertThat(method.returnType.typeName).isEqualTo(TypeName.INT)
+            assertThat(element.type.typeName).isEqualTo(ClassName.get("foo.bar", "Baz"))
         }.compilesWithoutError()
     }
 
@@ -221,17 +220,17 @@
         simpleRun { invocation ->
             val processingEnv = invocation.processingEnv
             primitiveTypeNames.forEach { primitiveTypeName ->
-                val typeMirror = processingEnv.requireTypeMirror(primitiveTypeName)
-                assertThat(typeMirror.kind.isPrimitive).isTrue()
-                assertThat(typeMirror.typeName()).isEqualTo(primitiveTypeName)
+                val typeMirror = processingEnv.requireType(primitiveTypeName)
+                assertThat(typeMirror.isPrimitive()).isTrue()
+                assertThat(typeMirror.typeName).isEqualTo(primitiveTypeName)
                 assertThat(
-                    typeMirror.box(invocation.typeUtils).typeName()
+                    typeMirror.boxed().typeName
                 ).isEqualTo(primitiveTypeName.box())
             }
         }.compilesWithoutError()
     }
 
-    private fun assertThat(executables: Iterable<ExecutableElement>) = assertThat(
+    private fun assertThat(executables: Iterable<XExecutableElement>) = assertThat(
         executables.map { it.name }
     )
 }
\ No newline at end of file
diff --git a/room/compiler/src/test/kotlin/androidx/room/kotlin/JvmDescriptorUtilsTest.kt b/room/compiler/src/test/kotlin/androidx/room/kotlin/JvmDescriptorUtilsTest.kt
deleted file mode 100644
index 2ea893f..0000000
--- a/room/compiler/src/test/kotlin/androidx/room/kotlin/JvmDescriptorUtilsTest.kt
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- * Copyright 2019 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 androidx.room.kotlin
-
-import androidx.room.ext.isConstructor
-import androidx.room.ext.isMethod
-import androidx.room.ext.isField
-import androidx.room.testing.TestProcessor
-import com.google.common.truth.Truth
-import com.google.common.truth.Truth.assertThat
-import com.google.testing.compile.CompileTester
-import com.google.testing.compile.JavaSourcesSubjectFactory
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-import toJFO
-import javax.tools.JavaFileObject
-
-@RunWith(JUnit4::class)
-class JvmDescriptorUtilsTest {
-
-    private val describeAnnotation =
-        """
-        package androidx.room.test;
-
-        import java.lang.annotation.ElementType;
-        import java.lang.annotation.Target;
-
-        @Target({ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR})
-        public @interface Describe { }
-        """.toJFO("androidx.room.test.Describe")
-
-    @Test
-    fun descriptor_method_simple() {
-        singleRun(
-            """
-            package androidx.room.test;
-
-            public class DummyClass {
-                @Describe
-                public void emptyMethod() {
-                }
-            }
-            """.toJFO("androidx.room.test.DummyClass")
-        ) { descriptors ->
-            assertThat(descriptors.first())
-                .isEqualTo("emptyMethod()V")
-        }
-    }
-
-    @Test
-    fun descriptor_field() {
-        singleRun(
-            """
-            package androidx.room.test;
-
-            import java.util.List;
-
-            class DummyClass<T> {
-                @Describe
-                int field1;
-
-                @Describe
-                String field2;
-
-                @Describe
-                T field3;
-
-                @Describe
-                List<String> field4;
-            }
-            """.toJFO("androidx.room.test.DummyClass")
-        ) { descriptors ->
-            assertThat(descriptors).isEqualTo(
-                setOf(
-                    "field1:I",
-                    "field2:Ljava/lang/String;",
-                    "field3:Ljava/lang/Object;",
-                    "field4:Ljava/util/List;"
-                )
-            )
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun descriptor_method_erasured() {
-        singleRun(
-            """
-            package androidx.room.test;
-
-            import java.util.ArrayList;
-            import java.util.Collection;
-            import java.util.List;
-            import java.util.Map;
-
-            class DummyClass<T> {
-                @Describe
-                void method1(T something) { }
-
-                @Describe
-                T method2() { return null; }
-
-                @Describe
-                List<? extends String> method3() { return null; }
-
-                @Describe
-                Map<T, String> method4() { return null; }
-
-                @Describe
-                ArrayList<Map<T, String>> method5() { return null; }
-
-                @Describe
-                static <I, O extends I> O method6(I input) { return null; }
-
-                @Describe
-                static <I, O extends String> O method7(I input) { return null; }
-
-                @Describe
-                static <P extends Collection & Comparable> P method8() { return null; }
-
-                @Describe
-                static <P extends String & List<Character>> P method9() { return null; }
-            }
-            """.toJFO("androidx.room.test.DummyClass")
-        ) { descriptors ->
-            assertThat(descriptors).isEqualTo(
-                setOf(
-                    "method1(Ljava/lang/Object;)V",
-                    "method2()Ljava/lang/Object;",
-                    "method3()Ljava/util/List;",
-                    "method4()Ljava/util/Map;",
-                    "method5()Ljava/util/ArrayList;",
-                    "method6(Ljava/lang/Object;)Ljava/lang/Object;",
-                    "method7(Ljava/lang/Object;)Ljava/lang/String;",
-                    "method8()Ljava/util/Collection;",
-                    "method9()Ljava/lang/String;"
-                )
-            )
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun descriptor_method_primitiveParams() {
-        singleRun(
-            """
-            package androidx.room.test;
-
-            class DummyClass {
-                @Describe
-                void method1(boolean yesOrNo, int number) { }
-
-                @Describe
-                byte method2(char letter) { return 0; }
-
-                @Describe
-                void method3(double realNumber1, float realNummber2) { }
-
-                @Describe
-                void method4(long bigNumber, short littlerNumber) { }
-            }
-            """.toJFO("androidx.room.test.DummyClass")
-        ) { descriptors ->
-            assertThat(descriptors)
-                .isEqualTo(setOf("method1(ZI)V", "method2(C)B", "method3(DF)V", "method4(JS)V"))
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun descriptor_method_classParam_javaTypes() {
-        singleRun(
-            """
-            package androidx.room.test;
-
-            import java.util.ArrayList;
-            import java.util.List;
-            import java.util.Map;
-
-            class DummyClass {
-                @Describe
-                void method1(Object something) { }
-
-                @Describe
-                Object method2() { return null; }
-
-                @Describe
-                List<String> method3(ArrayList<Integer> list) { return null; }
-
-                @Describe
-                Map<String, Object> method4() { return null; }
-            }
-            """.toJFO("androidx.room.test.DummyClass")
-        ) { descriptors ->
-            assertThat(descriptors).isEqualTo(
-                setOf(
-                    "method1(Ljava/lang/Object;)V",
-                    "method2()Ljava/lang/Object;",
-                    "method3(Ljava/util/ArrayList;)Ljava/util/List;",
-                    "method4()Ljava/util/Map;"
-                )
-            )
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun descriptor_method_classParam_testClass() {
-        val extraJfo =
-            """
-            package androidx.room.test;
-
-            class DataClass { }
-            """.toJFO("androidx.room.test.DataClass")
-
-        singleRun(
-            """
-            package androidx.room.test;
-
-            class DummyClass {
-                @Describe
-                void method1(DataClass data) { }
-
-                @Describe
-                DataClass method2() { return null; }
-            }
-            """.toJFO("androidx.room.test.DummyClass"), extraJfo
-        ) { descriptors ->
-            assertThat(descriptors).isEqualTo(
-                setOf(
-                    "method1(Landroidx/room/test/DataClass;)V",
-                    "method2()Landroidx/room/test/DataClass;"
-                )
-            )
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun descriptor_method_classParam_innerTestClass() {
-        val extraJfo =
-            """
-            package androidx.room.test;
-
-            class DataClass {
-
-                class MemberInnerData { }
-
-                static class StaticInnerData { }
-
-                enum EnumData {
-                    VALUE1, VALUE2
-                }
-            }
-            """.toJFO("androidx.room.test.DataClass")
-
-        singleRun(
-            """
-            package androidx.room.test;
-
-            class DummyClass {
-                @Describe
-                void method1(DataClass.MemberInnerData data) { }
-
-                @Describe
-                void method2(DataClass.StaticInnerData data) { }
-
-                @Describe
-                void method3(DataClass.EnumData enumData) { }
-
-                @Describe
-                DataClass.StaticInnerData method4() { return null; }
-            }
-            """.toJFO("androidx.room.test.DummyClass"), extraJfo
-        ) { descriptors ->
-            assertThat(descriptors).isEqualTo(
-                setOf(
-                    "method1(Landroidx/room/test/DataClass\$MemberInnerData;)V",
-                    "method2(Landroidx/room/test/DataClass\$StaticInnerData;)V",
-                    "method3(Landroidx/room/test/DataClass\$EnumData;)V",
-                    "method4()Landroidx/room/test/DataClass\$StaticInnerData;"
-                )
-            )
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun descriptor_method_arrayParams() {
-        val extraJfo =
-            """
-            package androidx.room.test;
-
-            class DataClass { }
-            """.toJFO("androidx.room.test.DataClass")
-
-        singleRun(
-            """
-            package androidx.room.test;
-
-            class DummyClass {
-                @Describe
-                void method1(DataClass[] data) { }
-
-                @Describe
-                DataClass[] method2() { return null; }
-
-                @Describe
-                void method3(int[] array) { }
-
-                @Describe
-                void method4(int... array) { }
-            }
-            """.toJFO("androidx.room.test.DummyClass"), extraJfo
-        ) { descriptors ->
-            assertThat(descriptors).isEqualTo(
-                setOf(
-                    "method1([Landroidx/room/test/DataClass;)V",
-                    "method2()[Landroidx/room/test/DataClass;",
-                    "method3([I)V",
-                    "method4([I)V"
-                )
-            )
-        }.compilesWithoutError()
-    }
-
-    private fun singleRun(
-        vararg jfo: JavaFileObject,
-        handler: (Set<String>) -> Unit
-    ): CompileTester = Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
-        .that(listOf(describeAnnotation) + jfo)
-        .processedWith(TestProcessor.builder()
-            .nextRunHandler {
-                it.roundEnv.getElementsAnnotatedWith(it.annotations.first()).map { element ->
-                    when {
-                        element.isField() -> element.descriptor()
-                        element.isMethod() || element.isConstructor() -> element.descriptor()
-                        else -> error("Unsupported element to describe.")
-                    }
-                }.toSet().let(handler)
-                true
-            }
-            .forAnnotations("androidx.room.test.Describe")
-            .build())
-}
\ No newline at end of file
diff --git a/room/compiler/src/test/kotlin/androidx/room/kotlin/KotlinMetadataElementTest.kt b/room/compiler/src/test/kotlin/androidx/room/kotlin/KotlinMetadataElementTest.kt
deleted file mode 100644
index 66d1152..0000000
--- a/room/compiler/src/test/kotlin/androidx/room/kotlin/KotlinMetadataElementTest.kt
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright 2019 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 androidx.room.kotlin
-
-import androidx.room.ext.asExecutableElement
-import androidx.room.ext.getConstructors
-import androidx.room.ext.getDeclaredMethods
-import androidx.room.ext.name
-import androidx.room.ext.requireTypeElement
-import androidx.room.processor.Context
-import androidx.room.testing.TestInvocation
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-import simpleRun
-import kotlin.reflect.KClass
-
-@RunWith(JUnit4::class)
-class KotlinMetadataElementTest {
-
-    @Test
-    fun getParameterNames() {
-        simpleRun { invocation ->
-            val (testClassElement, metadataElement) = getMetadataElement(
-                invocation,
-                TestData::class
-            )
-            assertThat(testClassElement.getDeclaredMethods()
-                .first { it.name == "functionWithParams" }
-                .let { metadataElement.getParameterNames(it.asExecutableElement()) }
-            ).isEqualTo(
-                listOf("param1", "yesOrNo", "number")
-            )
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun findPrimaryConstructorSignature() {
-        simpleRun { invocation ->
-            val (testClassElement, metadataElement) = getMetadataElement(
-                invocation,
-                TestData::class
-            )
-            assertThat(
-                testClassElement.getConstructors().map {
-                    val desc = it.asExecutableElement().descriptor()
-                    desc to (desc == metadataElement.findPrimaryConstructorSignature())
-                }
-            ).containsExactly(
-                "<init>(Ljava/lang/String;)V" to true,
-                "<init>()V" to false
-            )
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun isSuspendFunction() {
-        simpleRun { invocation ->
-            val (testClassElement, metadataElement) = getMetadataElement(
-                invocation,
-                TestData::class
-            )
-            assertThat(testClassElement.getDeclaredMethods().map {
-                val executableElement = it.asExecutableElement()
-                executableElement.name to metadataElement.isSuspendFunction(
-                    executableElement
-                )
-            }).containsExactly(
-                "emptyFunction" to false,
-                "suspendFunction" to true,
-                "functionWithParams" to false,
-                "getConstructorParam" to false
-            )
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun isObject() {
-        simpleRun { invocation ->
-            val (_, objectTypeMetadata) = getMetadataElement(invocation, ObjectType::class)
-            assertThat(objectTypeMetadata.isObject()).isTrue()
-            val (_, testDataMetadata) = getMetadataElement(invocation, TestData::class)
-            assertThat(testDataMetadata.isObject()).isFalse()
-        }.compilesWithoutError()
-    }
-
-    private fun getMetadataElement(invocation: TestInvocation, klass: KClass<*>) =
-        invocation.processingEnv.requireTypeElement(klass).let {
-            it to KotlinMetadataElement.createFor(Context(invocation.processingEnv), it)!!
-        }
-
-    @Suppress("unused")
-    private class TestData(val constructorParam: String) {
-
-        constructor() : this("anything")
-
-        fun emptyFunction() {}
-
-        suspend fun suspendFunction() {}
-
-        @Suppress("UNUSED_PARAMETER")
-        fun functionWithParams(param1: String, yesOrNo: Boolean, number: Int) {
-        }
-    }
-
-    object ObjectType {
-        val foo: String = ""
-    }
-}
\ No newline at end of file
diff --git a/room/compiler/src/test/kotlin/androidx/room/log/RLogTest.kt b/room/compiler/src/test/kotlin/androidx/room/log/RLogTest.kt
index d5ee6e0..271df55 100644
--- a/room/compiler/src/test/kotlin/androidx/room/log/RLogTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/log/RLogTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.log
 
+import androidx.room.processing.XMessager
 import androidx.room.vo.Warning
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -25,7 +26,7 @@
 @RunWith(JUnit4::class)
 class RLogTest {
 
-    val messager = mock(RLog.Messager::class.java)
+    val messager = mock(XMessager::class.java)
 
     @Test
     fun testSafeFormat() {
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt
index 408a633..d549ae8 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt
@@ -2,8 +2,6 @@
 
 import COMMON
 import androidx.room.ext.RoomTypeNames
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.requireTypeElement
 import androidx.room.vo.Dao
 import androidx.room.writer.DaoWriter
 import com.google.testing.compile.JavaFileObjects
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt
index d2cf838..3520da9 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt
@@ -18,7 +18,6 @@
 
 import androidx.annotation.NonNull
 import androidx.room.Embedded
-import androidx.room.ext.asTypeElement
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.vo.Entity
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt
index 703c3f2..91c53cb 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt
@@ -20,7 +20,6 @@
 import androidx.room.Embedded
 import androidx.room.Fts3
 import androidx.room.Fts4
-import androidx.room.ext.asTypeElement
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.vo.FtsEntity
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/CustomConverterProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/CustomConverterProcessorTest.kt
index 5fef51b..fe9215e 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/CustomConverterProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/CustomConverterProcessorTest.kt
@@ -17,7 +17,6 @@
 package androidx.room.processor
 
 import androidx.room.TypeConverter
-import androidx.room.ext.requireTypeElement
 import androidx.room.ext.typeName
 import androidx.room.processor.ProcessorErrors.TYPE_CONVERTER_EMPTY_CLASS
 import androidx.room.processor.ProcessorErrors.TYPE_CONVERTER_MISSING_NOARG_CONSTRUCTOR
@@ -92,8 +91,8 @@
 
     @Test
     fun nonNullButNotBoxed() {
-        val string = String::class.typeName()
-        val date = Date::class.typeName()
+        val string = String::class.typeName
+        val date = Date::class.typeName
         singleClass(createConverter(string, date)) { converter, _ ->
             assertThat(converter?.fromTypeName, `is`(string as TypeName))
             assertThat(converter?.toTypeName, `is`(date as TypeName))
@@ -103,9 +102,9 @@
     @Test
     fun parametrizedTypeUnbound() {
         val typeVarT = TypeVariableName.get("T")
-        val list = ParameterizedTypeName.get(List::class.typeName(), typeVarT)
+        val list = ParameterizedTypeName.get(List::class.typeName, typeVarT)
         val typeVarK = TypeVariableName.get("K")
-        val map = ParameterizedTypeName.get(Map::class.typeName(), typeVarK, typeVarT)
+        val map = ParameterizedTypeName.get(Map::class.typeName, typeVarK, typeVarT)
         singleClass(createConverter(list, map, listOf(typeVarK, typeVarT))) {
             _, _ ->
         }.failsToCompile().withErrorContaining(TYPE_CONVERTER_UNBOUND_GENERIC)
@@ -113,10 +112,10 @@
 
     @Test
     fun parametrizedTypeSpecific() {
-        val string = String::class.typeName()
-        val date = Date::class.typeName()
-        val list = ParameterizedTypeName.get(List::class.typeName(), string)
-        val map = ParameterizedTypeName.get(Map::class.typeName(), string, date)
+        val string = String::class.typeName
+        val date = Date::class.typeName
+        val list = ParameterizedTypeName.get(List::class.typeName, string)
+        val map = ParameterizedTypeName.get(Map::class.typeName, string, date)
         singleClass(createConverter(list, map)) { converter, _ ->
             assertThat(converter?.fromTypeName, `is`(list as TypeName))
             assertThat(converter?.toTypeName, `is`(map as TypeName))
@@ -192,9 +191,9 @@
     @Test
     fun parametrizedTypeBoundViaParent() {
         val typeVarT = TypeVariableName.get("T")
-        val list = ParameterizedTypeName.get(List::class.typeName(), typeVarT)
+        val list = ParameterizedTypeName.get(List::class.typeName, typeVarT)
         val typeVarK = TypeVariableName.get("K")
-        val map = ParameterizedTypeName.get(Map::class.typeName(), typeVarK, typeVarT)
+        val map = ParameterizedTypeName.get(Map::class.typeName, typeVarK, typeVarT)
 
         val baseConverter = createConverter(list, map, listOf(typeVarT, typeVarK))
         val extendingQName = "foo.bar.Extending"
@@ -202,8 +201,8 @@
                 "package foo.bar;\n" +
                         TypeSpec.classBuilder(ClassName.bestGuess(extendingQName)).apply {
                             superclass(
-                                    ParameterizedTypeName.get(CONVERTER, String::class.typeName(),
-                                    Integer::class.typeName()))
+                                    ParameterizedTypeName.get(CONVERTER, String::class.typeName,
+                                    Integer::class.typeName))
                         }.build().toString())
 
         simpleRun(baseConverter, extendingClass) { invocation ->
@@ -211,10 +210,10 @@
             val converter = CustomConverterProcessor(invocation.context, element)
                     .process().firstOrNull()
             assertThat(converter?.fromTypeName, `is`(ParameterizedTypeName.get(
-                    List::class.typeName(), String::class.typeName()) as TypeName
+                    List::class.typeName, String::class.typeName) as TypeName
             ))
-            assertThat(converter?.toTypeName, `is`(ParameterizedTypeName.get(Map::class.typeName(),
-                    Integer::class.typeName(), String::class.typeName()) as TypeName
+            assertThat(converter?.toTypeName, `is`(ParameterizedTypeName.get(Map::class.typeName,
+                    Integer::class.typeName, String::class.typeName) as TypeName
             ))
         }.compilesWithoutError()
     }
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
index 68e8bf9..e757ca2 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
@@ -18,15 +18,12 @@
 
 import COMMON
 import androidx.room.ext.RoomTypeNames
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.requireTypeMirror
+import androidx.room.processing.asDeclaredType
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.vo.Dao
 import androidx.room.vo.ReadQueryMethod
 import androidx.room.vo.Warning
-import asDeclaredType
 import com.google.common.truth.Truth
 import com.google.testing.compile.CompileTester
 import com.google.testing.compile.JavaFileObjects
@@ -171,7 +168,7 @@
             }
             """) { dao, invocation ->
             val dbType = invocation.context.processingEnv
-                    .requireTypeMirror(RoomTypeNames.ROOM_DB).asDeclaredType()
+                    .requireType(RoomTypeNames.ROOM_DB).asDeclaredType()
             val daoProcessor =
                 DaoProcessor(invocation.context, dao.element, dbType, null)
 
@@ -200,7 +197,7 @@
             }
             """) { dao, invocation ->
             val dbType = invocation.context.processingEnv
-                    .requireTypeMirror(RoomTypeNames.ROOM_DB).asDeclaredType()
+                    .requireType(RoomTypeNames.ROOM_DB).asDeclaredType()
             val daoProcessor =
                 DaoProcessor(invocation.context, dao.element, dbType, null)
             assertThat(daoProcessor.context.logger
@@ -330,7 +327,7 @@
                                 null
                             }
                             val dbType = invocation.context.processingEnv
-                                            .requireTypeMirror(RoomTypeNames.ROOM_DB)
+                                            .requireType(RoomTypeNames.ROOM_DB)
                                 .asDeclaredType()
                             val parser = DaoProcessor(invocation.context,
                                     dao.asTypeElement(), dbType, dbVerifier)
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
index 1556fbe..d23b8c9 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
@@ -18,10 +18,11 @@
 
 import COMMON
 import androidx.room.RoomProcessor
-import androidx.room.ext.asTypeElement
 import androidx.room.parser.ParsedQuery
 import androidx.room.parser.QueryType
 import androidx.room.parser.Table
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XTypeElement
 import androidx.room.solver.query.result.EntityRowAdapter
 import androidx.room.solver.query.result.PojoRowAdapter
 import androidx.room.testing.TestInvocation
@@ -49,8 +50,6 @@
 import org.junit.runners.JUnit4
 import org.mockito.Mockito.mock
 import java.io.File
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
 import javax.tools.JavaFileObject
 import javax.tools.StandardLocation
 
@@ -913,14 +912,14 @@
 
                     val list = views.map { (viewName, names) ->
                         DatabaseView(
-                            element = mock(TypeElement::class.java),
+                            element = mock(XTypeElement::class.java),
                             viewName = viewName,
                             query = ParsedQuery(
                                 "", QueryType.SELECT, emptyList(),
                                 names.map { Table(it, it) }.toSet(),
                                 emptyList(), false
                             ),
-                            type = mock(DeclaredType::class.java),
+                            type = mock(XDeclaredType::class.java),
                             fields = emptyList(),
                             embeddedFields = emptyList(),
                             constructor = null
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt
index 7837244..94b3f84 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt
@@ -17,7 +17,6 @@
 package androidx.room.processor
 
 import androidx.annotation.NonNull
-import androidx.room.ext.asTypeElement
 import androidx.room.parser.ParserErrors
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.testing.TestInvocation
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DeletionMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DeletionMethodProcessorTest.kt
index e484fcf..027287d 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DeletionMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DeletionMethodProcessorTest.kt
@@ -16,13 +16,13 @@
 package androidx.room.processor
 
 import androidx.room.Delete
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
 import androidx.room.processor.ProcessorErrors.CANNOT_FIND_DELETE_RESULT_ADAPTER
 import androidx.room.processor.ProcessorErrors.DELETION_MISSING_PARAMS
 import androidx.room.vo.DeletionMethod
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
 
 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
 @RunWith(JUnit4::class)
@@ -33,8 +33,8 @@
 
     override fun process(
         baseContext: Context,
-        containing: DeclaredType,
-        executableElement: ExecutableElement
+        containing: XDeclaredType,
+        executableElement: XMethodElement
     ): DeletionMethod {
         return DeletionMethodProcessor(baseContext, containing, executableElement).process()
     }
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/EntityNameMatchingVariationsTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/EntityNameMatchingVariationsTest.kt
index 0596817..f8cf008 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/EntityNameMatchingVariationsTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/EntityNameMatchingVariationsTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.requireTypeMirror
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.vo.CallType
 import androidx.room.vo.Field
@@ -28,7 +27,6 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
-import javax.lang.model.type.TypeKind.INT
 
 @RunWith(Parameterized::class)
 class EntityNameMatchingVariationsTest(triple: Triple<String, String, String>) :
@@ -64,7 +62,7 @@
             assertThat(entity.type.toString(), `is`("foo.bar.MyEntity"))
             assertThat(entity.fields.size, `is`(1))
             val field = entity.fields.first()
-            val intType = invocation.processingEnv.requireTypeMirror(TypeName.INT)
+            val intType = invocation.processingEnv.requireType(TypeName.INT)
             assertThat(field, `is`(Field(
                     element = field.element,
                     name = fieldName,
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt
index 6fe96ea..f2e3fed 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt
@@ -17,19 +17,13 @@
 package androidx.room.processor
 
 import androidx.room.Entity
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.asVariableElement
-import androidx.room.ext.getAllFieldsIncludingPrivateSupers
-import androidx.room.ext.getArrayType
-import androidx.room.ext.requireTypeMirror
 import androidx.room.parser.Collate
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XVariableElement
 import androidx.room.solver.types.ColumnTypeAdapter
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.vo.Field
-import box
 import com.google.common.truth.Truth
 import com.google.testing.compile.CompileTester
 import com.google.testing.compile.JavaFileObjects
@@ -44,7 +38,6 @@
 import org.junit.runners.JUnit4
 import org.mockito.Mockito.mock
 import simpleRun
-import javax.lang.model.element.VariableElement
 
 @Suppress("HasPlatformType")
 @RunWith(JUnit4::class)
@@ -97,10 +90,10 @@
         }
 
         private fun TypeName.box(invocation: TestInvocation) =
-            typeMirror(invocation).box(invocation.typeUtils)
+            typeMirror(invocation).boxed()
 
         private fun TypeName.typeMirror(invocation: TestInvocation) =
-            invocation.processingEnv.requireTypeMirror(this)
+            invocation.processingEnv.requireType(this)
     }
 
     @Test
@@ -248,7 +241,7 @@
     @Test
     fun nameVariations() {
         simpleRun {
-            val variableElement = mock(VariableElement::class.java)
+            val variableElement = mock(XVariableElement::class.java)
             assertThat(Field(variableElement, "x", TypeName.INT.typeMirror(it),
                     SQLTypeAffinity.INTEGER).nameWithVariations, `is`(arrayListOf("x")))
             assertThat(Field(variableElement, "x", TypeName.BOOLEAN.typeMirror(it),
@@ -261,7 +254,7 @@
 
     @Test
     fun nameVariations_is() {
-        val elm = mock(VariableElement::class.java)
+        val elm = mock(XVariableElement::class.java)
         simpleRun {
             assertThat(Field(elm, "isX", TypeName.BOOLEAN.typeMirror(it),
                     SQLTypeAffinity.INTEGER).nameWithVariations, `is`(arrayListOf("isX", "x")))
@@ -277,7 +270,7 @@
 
     @Test
     fun nameVariations_has() {
-        val elm = mock(VariableElement::class.java)
+        val elm = mock(XVariableElement::class.java)
         simpleRun {
             assertThat(Field(elm, "hasX", TypeName.BOOLEAN.typeMirror(it),
                     SQLTypeAffinity.INTEGER).nameWithVariations, `is`(arrayListOf("hasX", "x")))
@@ -293,7 +286,7 @@
 
     @Test
     fun nameVariations_m() {
-        val elm = mock(VariableElement::class.java)
+        val elm = mock(XVariableElement::class.java)
         simpleRun {
             assertThat(Field(elm, "mall", TypeName.BOOLEAN.typeMirror(it),
                     SQLTypeAffinity.INTEGER).nameWithVariations, `is`(arrayListOf("mall")))
@@ -314,7 +307,7 @@
 
     @Test
     fun nameVariations_underscore() {
-        val elm = mock(VariableElement::class.java)
+        val elm = mock(XVariableElement::class.java)
         simpleRun {
             assertThat(Field(elm, "_all", TypeName.BOOLEAN.typeMirror(it),
                     SQLTypeAffinity.INTEGER).nameWithVariations, `is`(arrayListOf("_all", "all")))
@@ -431,9 +424,7 @@
                                     .getElementsAnnotatedWith(Entity::class.java)
                                     .map {
                                         Pair(it, it.asTypeElement()
-                                            .getAllFieldsIncludingPrivateSupers(
-                                                invocation.processingEnv
-                                            ).firstOrNull())
+                                            .getAllFieldsIncludingPrivateSupers().firstOrNull())
                                     }
                                     .first { it.second != null }
                             val entityContext =
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/Fts3TableEntityProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/Fts3TableEntityProcessorTest.kt
index cfd4511e..7147a29 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/Fts3TableEntityProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/Fts3TableEntityProcessorTest.kt
@@ -33,7 +33,6 @@
 package androidx.room.processor
 
 import androidx.room.FtsOptions
-import androidx.room.ext.requireTypeMirror
 import androidx.room.parser.FtsVersion
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.vo.CallType
@@ -42,7 +41,6 @@
 import androidx.room.vo.FieldSetter
 import androidx.room.vo.Fields
 import com.squareup.javapoet.TypeName
-import org.hamcrest.CoreMatchers
 import org.hamcrest.CoreMatchers.`is`
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.Test
@@ -64,16 +62,17 @@
                 public void setRowId(int id) { this.rowId = rowId; }
             """
         ) { entity, invocation ->
-            assertThat(entity.type.toString(), CoreMatchers.`is`("foo.bar.MyEntity"))
-            assertThat(entity.fields.size, CoreMatchers.`is`(1))
+            assertThat(entity.type.toString(), `is`("foo.bar.MyEntity"))
+            assertThat(entity.fields.size, `is`(1))
             val field = entity.fields.first()
-            val intType = invocation.processingEnv.requireTypeMirror(TypeName.INT)
-            assertThat(field, CoreMatchers.`is`(Field(
+            val intType = invocation.processingEnv.requireType(TypeName.INT)
+            assertThat(field, `is`(Field(
                     element = field.element,
                     name = "rowId",
                     type = intType,
                     columnName = "rowid",
-                    affinity = SQLTypeAffinity.INTEGER)))
+                    affinity = SQLTypeAffinity.INTEGER))
+            )
             assertThat(field.setter, `is`(FieldSetter("setRowId", intType, CallType.METHOD)))
             assertThat(field.getter, `is`(FieldGetter("getRowId", intType, CallType.METHOD)))
             assertThat(entity.primaryKey.fields, `is`(Fields(field)))
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/Fts4TableEntityProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/Fts4TableEntityProcessorTest.kt
index ed9f9db..1888c6f 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/Fts4TableEntityProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/Fts4TableEntityProcessorTest.kt
@@ -18,8 +18,6 @@
 
 import androidx.room.Fts4
 import androidx.room.FtsOptions
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.requireTypeMirror
 import androidx.room.parser.FtsVersion
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.vo.CallType
@@ -29,7 +27,6 @@
 import androidx.room.vo.Fields
 import com.google.testing.compile.JavaFileObjects
 import com.squareup.javapoet.TypeName
-import org.hamcrest.CoreMatchers
 import org.hamcrest.CoreMatchers.`is`
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.Test
@@ -52,16 +49,17 @@
                 public void setRowId(int id) { this.rowId = rowId; }
             """
         ) { entity, invocation ->
-            assertThat(entity.type.toString(), CoreMatchers.`is`("foo.bar.MyEntity"))
-            assertThat(entity.fields.size, CoreMatchers.`is`(1))
+            assertThat(entity.type.toString(), `is`("foo.bar.MyEntity"))
+            assertThat(entity.fields.size, `is`(1))
             val field = entity.fields.first()
-            val intType = invocation.processingEnv.requireTypeMirror(TypeName.INT)
-            assertThat(field, CoreMatchers.`is`(Field(
+            val intType = invocation.processingEnv.requireType(TypeName.INT)
+            assertThat(field, `is`(Field(
                     element = field.element,
                     name = "rowId",
                     type = intType,
                     columnName = "rowid",
-                    affinity = SQLTypeAffinity.INTEGER)))
+                    affinity = SQLTypeAffinity.INTEGER))
+            )
             assertThat(field.setter, `is`(FieldSetter("setRowId", intType, CallType.METHOD)))
             assertThat(field.getter, `is`(FieldGetter("getRowId", intType, CallType.METHOD)))
             assertThat(entity.primaryKey.fields, `is`(Fields(field)))
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/InsertionMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/InsertionMethodProcessorTest.kt
index e146b71..011428c 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/InsertionMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/InsertionMethodProcessorTest.kt
@@ -23,12 +23,6 @@
 import androidx.room.ext.CommonTypeNames
 import androidx.room.ext.RxJava2TypeNames
 import androidx.room.ext.RxJava3TypeNames
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asExecutableElement
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.typeName
 import androidx.room.solver.shortcut.result.InsertMethodAdapter
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
@@ -77,7 +71,7 @@
                 """) { insertion, _ ->
             assertThat(insertion.name, `is`("foo"))
             assertThat(insertion.parameters.size, `is`(0))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.VOID))
             assertThat(insertion.entities.size, `is`(0))
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.INSERTION_DOES_NOT_HAVE_ANY_PARAMETERS_TO_INSERT)
@@ -93,12 +87,12 @@
             assertThat(insertion.name, `is`("foo"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
-            assertThat(param.type.typeName(), `is`(USER_TYPE_NAME))
-            assertThat(param.pojoType?.typeName(), `is`(USER_TYPE_NAME))
+            assertThat(param.type.typeName, `is`(USER_TYPE_NAME))
+            assertThat(param.pojoType?.typeName, `is`(USER_TYPE_NAME))
             assertThat(insertion.entities["user"]?.isPartialEntity, `is`(false))
             assertThat(insertion.entities["user"]?.pojo?.typeName,
                     `is`(ClassName.get("foo.bar", "User") as TypeName))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.LONG))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.LONG))
         }.compilesWithoutError()
     }
 
@@ -128,14 +122,14 @@
 
             assertThat(insertion.parameters.size, `is`(2))
             insertion.parameters.forEach {
-                assertThat(it.type.typeName(), `is`(USER_TYPE_NAME))
-                assertThat(it.pojoType?.typeName(), `is`(USER_TYPE_NAME))
+                assertThat(it.type.typeName, `is`(USER_TYPE_NAME))
+                assertThat(it.pojoType?.typeName, `is`(USER_TYPE_NAME))
             }
             assertThat(insertion.entities.size, `is`(2))
             assertThat(insertion.entities["u1"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
             assertThat(insertion.entities["u2"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
             assertThat(insertion.parameters.map { it.name }, `is`(listOf("u1", "u2")))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.VOID))
         }.compilesWithoutError()
     }
 
@@ -149,14 +143,14 @@
             assertThat(insertion.name, `is`("insertUsers"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ParameterizedTypeName.get(
                             ClassName.get("java.util", "List"),
                             USER_TYPE_NAME) as TypeName))
-            assertThat(param.pojoType?.typeName(), `is`(USER_TYPE_NAME))
+            assertThat(param.pojoType?.typeName, `is`(USER_TYPE_NAME))
             assertThat(insertion.entities.size, `is`(1))
             assertThat(insertion.entities["users"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
-            assertThat(insertion.returnType.typeName(), `is`(
+            assertThat(insertion.returnType.typeName, `is`(
                     ParameterizedTypeName.get(
                             ClassName.get("java.util", "List"),
                             ClassName.get("java.lang", "Long")) as TypeName
@@ -174,11 +168,11 @@
             assertThat(insertion.name, `is`("insertUsers"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ArrayTypeName.of(COMMON.USER_TYPE_NAME) as TypeName))
             assertThat(insertion.entities.size, `is`(1))
             assertThat(insertion.entities["users"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.VOID))
         }.compilesWithoutError()
     }
 
@@ -192,13 +186,13 @@
             assertThat(insertion.name, `is`("insertUsers"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ParameterizedTypeName.get(
                             ClassName.get("java.util", "Set"),
                             COMMON.USER_TYPE_NAME) as TypeName))
             assertThat(insertion.entities.size, `is`(1))
             assertThat(insertion.entities["users"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.VOID))
         }.compilesWithoutError()
     }
 
@@ -212,13 +206,13 @@
             assertThat(insertion.name, `is`("insertUsers"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ParameterizedTypeName.get(
                             ClassName.get("java.util", "Queue"),
                             USER_TYPE_NAME) as TypeName))
             assertThat(insertion.entities.size, `is`(1))
             assertThat(insertion.entities["users"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.VOID))
         }.compilesWithoutError()
     }
 
@@ -231,13 +225,13 @@
             assertThat(insertion.name, `is`("insert"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ParameterizedTypeName.get(
                             ClassName.get("java.lang", "Iterable"),
                             USER_TYPE_NAME) as TypeName))
             assertThat(insertion.entities.size, `is`(1))
             assertThat(insertion.entities["users"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.VOID))
         }.compilesWithoutError()
     }
 
@@ -251,12 +245,12 @@
             assertThat(insertion.name, `is`("insert"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
-            assertThat(param.type.typeName(), `is`(ParameterizedTypeName.get(
+            assertThat(param.type.typeName, `is`(ParameterizedTypeName.get(
                     ClassName.get("foo.bar", "MyClass.MyList"),
                     CommonTypeNames.STRING, USER_TYPE_NAME) as TypeName))
             assertThat(insertion.entities.size, `is`(1))
             assertThat(insertion.entities["users"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.VOID))
         }.compilesWithoutError()
     }
 
@@ -268,12 +262,12 @@
                 abstract public void foo(User u1, Book b1);
                 """) { insertion, _ ->
             assertThat(insertion.parameters.size, `is`(2))
-            assertThat(insertion.parameters[0].type.typeName().toString(),
+            assertThat(insertion.parameters[0].type.typeName.toString(),
                     `is`("foo.bar.User"))
-            assertThat(insertion.parameters[1].type.typeName().toString(),
+            assertThat(insertion.parameters[1].type.typeName.toString(),
                     `is`("foo.bar.Book"))
             assertThat(insertion.parameters.map { it.name }, `is`(listOf("u1", "b1")))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.VOID))
             assertThat(insertion.entities.size, `is`(2))
             assertThat(insertion.entities["u1"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
             assertThat(insertion.entities["b1"]?.pojo?.typeName, `is`(BOOK_TYPE_NAME))
@@ -470,8 +464,8 @@
             assertThat(insertion.name, `is`("foo"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
-            assertThat(param.type.typeName(), `is`(USERNAME_TYPE_NAME))
-            assertThat(param.pojoType?.typeName(), `is`(USERNAME_TYPE_NAME))
+            assertThat(param.type.typeName, `is`(USERNAME_TYPE_NAME))
+            assertThat(param.pojoType?.typeName, `is`(USERNAME_TYPE_NAME))
             assertThat(insertion.entities.size, `is`(1))
             assertThat(insertion.entities["username"]?.isPartialEntity, `is`(true))
             assertThat(insertion.entities["username"]?.entityTypeName, `is`(USER_TYPE_NAME))
@@ -765,17 +759,15 @@
                                 .getElementsAnnotatedWith(Dao::class.java)
                                 .map {
                                     Pair(it,
-                                        it.asTypeElement().getAllMethods(
-                                            invocation.processingEnv
-                                        ).filter {
-                                            it.hasAnnotation(Insert::class.java)
+                                        it.asTypeElement().getAllMethods().filter {
+                                            it.hasAnnotation(Insert::class)
                                         }
                                     )
                                 }.first { it.second.isNotEmpty() }
                             val processor = InsertionMethodProcessor(
                                     baseContext = invocation.context,
                                     containing = owner.asDeclaredType(),
-                                    executableElement = methods.first().asExecutableElement())
+                                    executableElement = methods.first())
                             val processed = processor.process()
                             handler(processed, invocation)
                             true
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTargetMethodTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTargetMethodTest.kt
index ccd4956..61ada5a 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTargetMethodTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTargetMethodTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.requireTypeElement
 import com.google.testing.compile.CompileTester
 import com.squareup.javapoet.ClassName
 import org.junit.Test
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
index cd2edcd..d2bdde9 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
@@ -18,8 +18,8 @@
 
 import COMMON
 import androidx.room.Embedded
-import androidx.room.ext.requireTypeElement
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XVariableElement
 import androidx.room.processor.ProcessorErrors.CANNOT_FIND_GETTER_FOR_FIELD
 import androidx.room.processor.ProcessorErrors.CANNOT_FIND_TYPE
 import androidx.room.processor.ProcessorErrors.POJO_FIELD_HAS_DUPLICATE_COLUMN_NAME
@@ -53,7 +53,6 @@
 import simpleRun
 import toJFO
 import java.io.File
-import javax.lang.model.element.VariableElement
 import javax.tools.JavaFileObject
 
 /**
@@ -872,8 +871,8 @@
             assertThat(pojo5, sameInstance(pojo4))
 
             val type = invocation.context.COMMON_TYPES.STRING
-            val mockElement = mock(VariableElement::class.java)
-            doReturn(type).`when`(mockElement).asType()
+            val mockElement = mock(XVariableElement::class.java)
+            doReturn(type).`when`(mockElement).type
             val fakeField = Field(
                     element = mockElement,
                     name = "foo",
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/ProjectionExpanderTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/ProjectionExpanderTest.kt
index 399fe55..03f627f 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/ProjectionExpanderTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/ProjectionExpanderTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.asTypeElement
 import androidx.room.parser.SqlParser
 import androidx.room.parser.expansion.ProjectionExpander
 import androidx.room.testing.TestInvocation
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt
index c5e251f..4f421f4 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt
@@ -23,16 +23,11 @@
 import androidx.room.ext.KotlinTypeNames
 import androidx.room.ext.LifecyclesTypeNames
 import androidx.room.ext.PagingTypeNames
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asExecutableElement
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.getArrayType
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.requireTypeMirror
 import androidx.room.ext.typeName
 import androidx.room.parser.QueryType
 import androidx.room.parser.Table
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.ProcessorErrors.cannotFindQueryResultAdapter
 import androidx.room.solver.query.result.DataSourceFactoryQueryResultBinder
 import androidx.room.solver.query.result.ListQueryResultAdapter
@@ -71,8 +66,6 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 import org.mockito.Mockito
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 import javax.tools.JavaFileObject
 
 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
@@ -113,7 +106,7 @@
                 """) { parsedQuery, _ ->
             assertThat(parsedQuery.name, `is`("foo"))
             assertThat(parsedQuery.parameters.size, `is`(0))
-            assertThat(parsedQuery.returnType.typeName(),
+            assertThat(parsedQuery.returnType.typeName,
                     `is`(ArrayTypeName.of(TypeName.INT) as TypeName))
         }.compilesWithoutError()
     }
@@ -126,13 +119,13 @@
                 abstract public long foo(int x);
                 """) { parsedQuery, invocation ->
             assertThat(parsedQuery.name, `is`("foo"))
-            assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.LONG))
+            assertThat(parsedQuery.returnType.typeName, `is`(TypeName.LONG))
             assertThat(parsedQuery.parameters.size, `is`(1))
             val param = parsedQuery.parameters.first()
             assertThat(param.name, `is`("x"))
             assertThat(param.sqlName, `is`("x"))
             assertThat(param.type,
-                    `is`(invocation.processingEnv.requireTypeMirror(TypeName.INT)))
+                    `is`(invocation.processingEnv.requireType(TypeName.INT)))
         }.compilesWithoutError()
     }
 
@@ -144,14 +137,14 @@
                 abstract public long foo(int... ids);
                 """) { parsedQuery, invocation ->
             assertThat(parsedQuery.name, `is`("foo"))
-            assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.LONG))
+            assertThat(parsedQuery.returnType.typeName, `is`(TypeName.LONG))
             assertThat(parsedQuery.parameters.size, `is`(1))
             val param = parsedQuery.parameters.first()
             assertThat(param.name, `is`("ids"))
             assertThat(param.sqlName, `is`("ids"))
             val env = invocation.processingEnv
             assertThat(param.type,
-                    `is`(env.getArrayType(TypeName.INT) as TypeMirror))
+                    `is`(env.getArrayType(TypeName.INT) as XType))
         }.compilesWithoutError()
     }
 
@@ -286,7 +279,7 @@
                 """) { parsedQuery, _ ->
             val expected: TypeName = ParameterizedTypeName.get(ClassName.get(List::class.java),
                     TypeVariableName.get("T"))
-            assertThat(parsedQuery.returnType.typeName(), `is`(expected))
+            assertThat(parsedQuery.returnType.typeName, `is`(expected))
         }.failsToCompile()
                 .withErrorContaining(ProcessorErrors.CANNOT_USE_UNBOUND_GENERICS_IN_QUERY_METHODS)
     }
@@ -357,7 +350,7 @@
                 static abstract class ExtendingModel extends BaseModel<Integer> {
                 }
                 """) { parsedQuery, _ ->
-            assertThat(parsedQuery.returnType.typeName(),
+            assertThat(parsedQuery.returnType.typeName,
                     `is`(ClassName.get(Integer::class.java) as TypeName))
         }.compilesWithoutError()
     }
@@ -376,7 +369,7 @@
                 """) { parsedQuery, invocation ->
             assertThat(parsedQuery.parameters.first().type,
                     `is`(invocation.processingEnv
-                            .requireTypeMirror("java.lang.Integer")))
+                            .requireType("java.lang.Integer")))
         }.compilesWithoutError()
     }
 
@@ -401,7 +394,7 @@
                 """) { parsedQuery, _ ->
             assertThat(parsedQuery.name, `is`("foo"))
             assertThat(parsedQuery.parameters.size, `is`(1))
-            assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.INT))
+            assertThat(parsedQuery.returnType.typeName, `is`(TypeName.INT))
         }.compilesWithoutError()
     }
 
@@ -414,7 +407,7 @@
                 """) { parsedQuery, _ ->
             assertThat(parsedQuery.name, `is`("foo"))
             assertThat(parsedQuery.parameters.size, `is`(1))
-            assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(parsedQuery.returnType.typeName, `is`(TypeName.VOID))
         }.compilesWithoutError()
     }
 
@@ -427,9 +420,9 @@
                 """) { parsedQuery, invocation ->
             assertThat(parsedQuery.name, `is`("updateAllNames"))
             assertThat(parsedQuery.parameters.size, `is`(1))
-            assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.VOID))
-            assertThat(parsedQuery.parameters.first().type.typeName(),
-                    `is`(invocation.context.COMMON_TYPES.STRING.typeName()))
+            assertThat(parsedQuery.returnType.typeName, `is`(TypeName.VOID))
+            assertThat(parsedQuery.parameters.first().type.typeName,
+                    `is`(invocation.context.COMMON_TYPES.STRING.typeName))
         }.compilesWithoutError()
     }
 
@@ -442,9 +435,9 @@
                 """) { parsedQuery, invocation ->
             assertThat(parsedQuery.name, `is`("insertUsername"))
             assertThat(parsedQuery.parameters.size, `is`(1))
-            assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.VOID))
-            assertThat(parsedQuery.parameters.first().type.typeName(),
-                `is`(invocation.context.COMMON_TYPES.STRING.typeName()))
+            assertThat(parsedQuery.returnType.typeName, `is`(TypeName.VOID))
+            assertThat(parsedQuery.parameters.first().type.typeName,
+                `is`(invocation.context.COMMON_TYPES.STRING.typeName))
         }.compilesWithoutError()
     }
 
@@ -457,9 +450,9 @@
                 """) { parsedQuery, invocation ->
             assertThat(parsedQuery.name, `is`("insertUsername"))
             assertThat(parsedQuery.parameters.size, `is`(1))
-            assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.LONG))
-            assertThat(parsedQuery.parameters.first().type.typeName(),
-                `is`(invocation.context.COMMON_TYPES.STRING.typeName()))
+            assertThat(parsedQuery.returnType.typeName, `is`(TypeName.LONG))
+            assertThat(parsedQuery.parameters.first().type.typeName,
+                `is`(invocation.context.COMMON_TYPES.STRING.typeName))
         }.compilesWithoutError()
     }
 
@@ -470,7 +463,7 @@
                 @Query("insert into user (name) values (:name)")
                 abstract public int insert(String name);
                 """) { parsedQuery, _ ->
-            assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.INT))
+            assertThat(parsedQuery.returnType.typeName, `is`(TypeName.INT))
         }.failsToCompile().withErrorContaining(
             ProcessorErrors.cannotFindPreparedQueryResultAdapter("int", QueryType.INSERT)
         )
@@ -484,9 +477,9 @@
                 abstract ${LifecyclesTypeNames.LIVE_DATA}<String> nameLiveData(String id);
                 """
         ) { parsedQuery, _ ->
-            assertThat(parsedQuery.returnType.typeName(),
+            assertThat(parsedQuery.returnType.typeName,
                     `is`(ParameterizedTypeName.get(LifecyclesTypeNames.LIVE_DATA,
-                            String::class.typeName()) as TypeName))
+                            String::class.typeName) as TypeName))
             assertThat(parsedQuery.queryResultBinder,
                     instanceOf(LiveDataQueryResultBinder::class.java))
         }.compilesWithoutError()
@@ -527,9 +520,9 @@
                 nameDataSourceFactory();
                 """
         ) { parsedQuery, _ ->
-            assertThat(parsedQuery.returnType.typeName(),
+            assertThat(parsedQuery.returnType.typeName,
                     `is`(ParameterizedTypeName.get(PagingTypeNames.DATA_SOURCE_FACTORY,
-                            Integer::class.typeName(), String::class.typeName()) as TypeName))
+                            Integer::class.typeName, String::class.typeName) as TypeName))
             assertThat(parsedQuery.queryResultBinder,
                     instanceOf(DataSourceFactoryQueryResultBinder::class.java))
             val tableNames =
@@ -548,9 +541,9 @@
                 nameDataSourceFactory();
                 """
         ) { parsedQuery, _ ->
-            assertThat(parsedQuery.returnType.typeName(),
+            assertThat(parsedQuery.returnType.typeName,
                     `is`(ParameterizedTypeName.get(PagingTypeNames.DATA_SOURCE_FACTORY,
-                            Integer::class.typeName(), String::class.typeName()) as TypeName))
+                            Integer::class.typeName, String::class.typeName) as TypeName))
             assertThat(parsedQuery.queryResultBinder,
                     instanceOf(DataSourceFactoryQueryResultBinder::class.java))
             val tableNames =
@@ -637,7 +630,7 @@
                 """) { parsedQuery, _ ->
             assertThat(parsedQuery.name, `is`("foo"))
             assertThat(parsedQuery.parameters.size, `is`(0))
-            assertThat(parsedQuery.returnType.typeName(),
+            assertThat(parsedQuery.returnType.typeName,
                     `is`(ArrayTypeName.of(TypeName.INT) as TypeName))
         }.compilesWithoutError()
     }
@@ -652,7 +645,7 @@
             assertThat(
                 QueryMethodProcessor(
                     baseContext = invocation.context,
-                    containing = Mockito.mock(DeclaredType::class.java),
+                    containing = Mockito.mock(XDeclaredType::class.java),
                     executableElement = method.element,
                     dbVerifier = null
                 ).context.logger.suppressedWarnings,
@@ -985,9 +978,7 @@
                         .getElementsAnnotatedWith(Dao::class.java)
                         .map {
                             Pair(it,
-                                it.asTypeElement().getAllMethods(
-                                    invocation.processingEnv
-                                ).filter {
+                                it.asTypeElement().getAllMethods().filter {
                                     it.hasAnnotation(Query::class)
                                 }
                             )
@@ -1002,7 +993,7 @@
                     val parser = QueryMethodProcessor(
                         baseContext = invocation.context,
                         containing = owner.asDeclaredType(),
-                        executableElement = methods.first().asExecutableElement(),
+                        executableElement = methods.first(),
                         dbVerifier = verifier
                     )
                     val parsedQuery = parser.process()
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/RawQueryMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/RawQueryMethodProcessorTest.kt
index 60f2877..1f247e9 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/RawQueryMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/RawQueryMethodProcessorTest.kt
@@ -25,14 +25,6 @@
 import androidx.room.RawQuery
 import androidx.room.ext.PagingTypeNames
 import androidx.room.ext.SupportDbTypeNames
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asExecutableElement
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.getDeclaredMethods
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.requireTypeElement
-import androidx.room.ext.typeName
 import androidx.room.processor.ProcessorErrors.RAW_QUERY_STRING_PARAMETER_REMOVED
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
@@ -65,7 +57,7 @@
                             type = SupportDbTypeNames.QUERY
                     )
             ))
-            assertThat(query.returnType.typeName(),
+            assertThat(query.returnType.typeName,
                     `is`(ArrayTypeName.of(TypeName.INT) as TypeName))
         }.compilesWithoutError()
     }
@@ -174,7 +166,7 @@
                             type = SupportDbTypeNames.QUERY
                     )
             ))
-            assertThat(query.returnType.typeName(), `is`(pojo))
+            assertThat(query.returnType.typeName, `is`(pojo))
             assertThat(query.observedTableNames, `is`(emptySet()))
         }.compilesWithoutError()
     }
@@ -316,9 +308,7 @@
                                     .getElementsAnnotatedWith(Dao::class.java)
                                     .map {
                                         Pair(it,
-                                                it.asTypeElement().getAllMethods(
-                                                    invocation.processingEnv
-                                                ).filter {
+                                                it.asTypeElement().getAllMethods().filter {
                                                     it.hasAnnotation(RawQuery::class)
                                                 }
                                         )
@@ -326,7 +316,7 @@
                             val parser = RawQueryMethodProcessor(
                                     baseContext = invocation.context,
                                     containing = owner.asDeclaredType(),
-                                    executableElement = methods.first().asExecutableElement())
+                                    executableElement = methods.first())
                             val parsedQuery = parser.process()
                             handler(parsedQuery, invocation)
                             true
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/ShortcutMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/ShortcutMethodProcessorTest.kt
index c534f7a..8ee23dd 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/ShortcutMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/ShortcutMethodProcessorTest.kt
@@ -22,12 +22,8 @@
 import androidx.room.ext.GuavaUtilConcurrentTypeNames
 import androidx.room.ext.RxJava2TypeNames
 import androidx.room.ext.RxJava3TypeNames
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asExecutableElement
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.typeName
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.vo.ShortcutMethod
@@ -43,8 +39,6 @@
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.Test
 import toJFO
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
 import javax.tools.JavaFileObject
 import kotlin.reflect.KClass
 
@@ -92,8 +86,8 @@
             assertThat(shortcut.name, `is`("foo"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
-            assertThat(param.type.typeName(), `is`(USER_TYPE_NAME))
-            assertThat(param.pojoType?.typeName(), `is`(USER_TYPE_NAME))
+            assertThat(param.type.typeName, `is`(USER_TYPE_NAME))
+            assertThat(param.pojoType?.typeName, `is`(USER_TYPE_NAME))
             assertThat(shortcut.entities.size, `is`(1))
             assertThat(shortcut.entities["user"]?.isPartialEntity, `is`(false))
             assertThat(shortcut.entities["user"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
@@ -126,8 +120,8 @@
 
             assertThat(shortcut.parameters.size, `is`(2))
             shortcut.parameters.forEach {
-                assertThat(it.type.typeName(), `is`(USER_TYPE_NAME))
-                assertThat(it.pojoType?.typeName(), `is`(USER_TYPE_NAME))
+                assertThat(it.type.typeName, `is`(USER_TYPE_NAME))
+                assertThat(it.pojoType?.typeName, `is`(USER_TYPE_NAME))
             }
             assertThat(shortcut.entities.size, `is`(2))
             assertThat(shortcut.entities["u1"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
@@ -158,10 +152,10 @@
                 assertThat(shortcut.name, `is`("users"))
                 assertThat(shortcut.parameters.size, `is`(1))
                 val param = shortcut.parameters.first()
-                assertThat(param.type.typeName(), `is`(
+                assertThat(param.type.typeName, `is`(
                         ParameterizedTypeName.get(
                                 ClassName.get("java.util", "List"), USER_TYPE_NAME) as TypeName))
-                assertThat(param.pojoType?.typeName(), `is`(USER_TYPE_NAME))
+                assertThat(param.pojoType?.typeName, `is`(USER_TYPE_NAME))
                 assertThat(shortcut.entities.size, `is`(1))
                 assertThat(shortcut.entities["users"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
             }.compilesWithoutError()
@@ -178,7 +172,7 @@
             assertThat(shortcut.name, `is`("users"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ArrayTypeName.of(COMMON.USER_TYPE_NAME) as TypeName))
             assertThat(shortcut.entities.size, `is`(1))
             assertThat(shortcut.entities["users"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
@@ -195,7 +189,7 @@
             assertThat(shortcut.name, `is`("modifyUsers"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ParameterizedTypeName.get(
                             ClassName.get("java.util", "Set"),
                             COMMON.USER_TYPE_NAME
@@ -215,7 +209,7 @@
             assertThat(shortcut.name, `is`("modifyUsers"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ParameterizedTypeName.get(ClassName.get("java.lang", "Iterable"),
                             COMMON.USER_TYPE_NAME) as TypeName))
             assertThat(shortcut.entities.size, `is`(1))
@@ -234,7 +228,7 @@
             assertThat(shortcut.name, `is`("modifyUsers"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ParameterizedTypeName.get(ClassName.get("foo.bar", "MyClass.MyList"),
                             CommonTypeNames.STRING, COMMON.USER_TYPE_NAME) as TypeName))
             assertThat(shortcut.entities.size, `is`(1))
@@ -262,9 +256,9 @@
                 abstract public $type foo(User u1, Book b1);
                 """) { shortcut, _ ->
                 assertThat(shortcut.parameters.size, `is`(2))
-                assertThat(shortcut.parameters[0].type.typeName().toString(),
+                assertThat(shortcut.parameters[0].type.typeName.toString(),
                         `is`("foo.bar.User"))
-                assertThat(shortcut.parameters[1].type.typeName().toString(),
+                assertThat(shortcut.parameters[1].type.typeName.toString(),
                         `is`("foo.bar.Book"))
                 assertThat(shortcut.parameters.map { it.name }, `is`(listOf("u1", "b1")))
                 assertThat(shortcut.entities.size, `is`(2))
@@ -319,8 +313,8 @@
             assertThat(shortcut.name, `is`("foo"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
-            assertThat(param.type.typeName(), `is`(USERNAME_TYPE_NAME))
-            assertThat(param.pojoType?.typeName(), `is`(USERNAME_TYPE_NAME))
+            assertThat(param.type.typeName, `is`(USERNAME_TYPE_NAME))
+            assertThat(param.pojoType?.typeName, `is`(USERNAME_TYPE_NAME))
             assertThat(shortcut.entities.size, `is`(1))
             assertThat(shortcut.entities["username"]?.isPartialEntity, `is`(true))
             assertThat(shortcut.entities["username"]?.entityTypeName, `is`(USER_TYPE_NAME))
@@ -450,8 +444,8 @@
 
     abstract fun process(
         baseContext: Context,
-        containing: DeclaredType,
-        executableElement: ExecutableElement
+        containing: XDeclaredType,
+        executableElement: XMethodElement
     ): T
 
     fun singleShortcutMethod(
@@ -474,9 +468,7 @@
                                     .getElementsAnnotatedWith(Dao::class.java)
                                     .map {
                                         Pair(it,
-                                            it.asTypeElement().getAllMethods(
-                                                invocation.processingEnv
-                                            ).filter {
+                                            it.asTypeElement().getAllMethods().filter {
                                                 it.hasAnnotation(annotation)
                                             }
                                         )
@@ -484,7 +476,7 @@
                             val processed = process(
                                     baseContext = invocation.context,
                                     containing = owner.asDeclaredType(),
-                                    executableElement = methods.first().asExecutableElement())
+                                    executableElement = methods.first())
                             handler(processed, invocation)
                             true
                         }
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
index 9611aba..62a30e5 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
@@ -17,8 +17,6 @@
 package androidx.room.processor
 
 import COMMON
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.typeName
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.processor.ProcessorErrors.RELATION_IN_ENTITY
 import androidx.room.vo.CallType
@@ -53,7 +51,7 @@
             assertThat(entity.type.toString(), `is`("foo.bar.MyEntity"))
             assertThat(entity.fields.size, `is`(1))
             val field = entity.fields.first()
-            val intType = invocation.processingEnv.requireTypeMirror(TypeName.INT)
+            val intType = invocation.processingEnv.requireType(TypeName.INT)
             assertThat(field, `is`(Field(
                     element = field.element,
                     name = "id",
@@ -154,8 +152,8 @@
             val idField = entity.fields.first()
             val cursorValueReader = idField.cursorValueReader
                 ?: throw AssertionError("must have a cursor value reader")
-            assertThat(cursorValueReader.typeMirror().typeName(),
-                `is`(invocation.processingEnv.requireTypeMirror(TypeName.INT).typeName()))
+            assertThat(cursorValueReader.typeMirror().typeName,
+                `is`(invocation.processingEnv.requireType(TypeName.INT).typeName))
         }.compilesWithoutError()
             .withWarningContaining(
                 ProcessorErrors.mismatchedSetter(
@@ -178,8 +176,8 @@
             val idField = entity.fields.first()
             val statementBinder = idField.statementBinder
                 ?: throw AssertionError("must have a statement binder")
-            assertThat(statementBinder.typeMirror().typeName(),
-                `is`(invocation.processingEnv.requireTypeMirror(TypeName.INT).typeName()))
+            assertThat(statementBinder.typeMirror().typeName,
+                `is`(invocation.processingEnv.requireType(TypeName.INT).typeName))
         }.compilesWithoutError()
     }
 
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/TransactionMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/TransactionMethodProcessorTest.kt
index 1bdcf39..0b17a05 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/TransactionMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/TransactionMethodProcessorTest.kt
@@ -19,12 +19,6 @@
 import COMMON
 import androidx.room.Dao
 import androidx.room.Transaction
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asExecutableElement
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.name
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.vo.TransactionMethod
@@ -242,9 +236,7 @@
                                     .getElementsAnnotatedWith(Dao::class.java)
                                     .map {
                                         Pair(it,
-                                            it.asTypeElement().getAllMethods(
-                                                invocation.processingEnv
-                                            ).filter {
+                                            it.asTypeElement().getAllMethods().filter {
                                                 it.hasAnnotation(Transaction::class)
                                             }
                                         )
@@ -252,7 +244,7 @@
                             val processor = TransactionMethodProcessor(
                                     baseContext = invocation.context,
                                     containing = owner.asDeclaredType(),
-                                    executableElement = methods.first().asExecutableElement())
+                                    executableElement = methods.first())
                             val processed = processor.process()
                             handler(processed, invocation)
                             true
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/UpdateMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/UpdateMethodProcessorTest.kt
index 9d8874c..ecc252d 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/UpdateMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/UpdateMethodProcessorTest.kt
@@ -17,6 +17,8 @@
 
 import androidx.room.OnConflictStrategy
 import androidx.room.Update
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
 import androidx.room.processor.ProcessorErrors.CANNOT_FIND_UPDATE_RESULT_ADAPTER
 import androidx.room.processor.ProcessorErrors.UPDATE_MISSING_PARAMS
 import androidx.room.vo.UpdateMethod
@@ -26,8 +28,6 @@
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import toJFO
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
 
 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
 @RunWith(JUnit4::class)
@@ -38,8 +38,8 @@
 
     override fun process(
         baseContext: Context,
-        containing: DeclaredType,
-        executableElement: ExecutableElement
+        containing: XDeclaredType,
+        executableElement: XMethodElement
     ): UpdateMethod {
         return UpdateMethodProcessor(baseContext, containing, executableElement).process()
     }
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegateTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegateTest.kt
index c9122a4..0daa352 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegateTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegateTest.kt
@@ -16,8 +16,6 @@
 
 package androidx.room.processor.autovalue
 
-import androidx.room.ext.isMethod
-import androidx.room.ext.requireTypeElement
 import androidx.room.processor.FieldProcessor
 import androidx.room.processor.PojoProcessor
 import androidx.room.processor.ProcessorErrors
@@ -28,6 +26,7 @@
 import com.squareup.javapoet.ClassName
 import compileLibrarySources
 import org.hamcrest.CoreMatchers.`is`
+import org.hamcrest.CoreMatchers.notNullValue
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -84,7 +83,7 @@
         ) { pojo ->
             assertThat(pojo.type.toString(), `is`("foo.bar.MyPojo"))
             assertThat(pojo.fields.size, `is`(1))
-            assertThat(pojo.constructor?.element?.isMethod(), `is`(true))
+            assertThat(pojo.constructor?.element, `is`(notNullValue()))
         }.compilesWithoutError().withWarningCount(0)
     }
 
diff --git a/room/compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt b/room/compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt
index 3bee5af..1d6e7d6 100644
--- a/room/compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt
@@ -16,11 +16,10 @@
 
 package androidx.room.solver
 
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.typeName
+import androidx.room.processing.XProcessingEnv
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.testing.TestInvocation
-import box
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.JavaFile
@@ -34,8 +33,6 @@
 import org.junit.runners.Parameterized
 import simpleRun
 import testCodeGenScope
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.type.TypeMirror
 
 @RunWith(Parameterized::class)
 class BasicColumnTypeAdaptersTest(
@@ -146,8 +143,8 @@
         val spec = TypeSpec.classBuilder("OutClass")
             .addField(FieldSpec.builder(SQLITE_STMT, "st").build())
             .addField(FieldSpec.builder(CURSOR, "crs").build())
-            .addField(FieldSpec.builder(typeMirror.typeName(), "out").build())
-            .addField(FieldSpec.builder(typeMirror.typeName(), "inp").build())
+            .addField(FieldSpec.builder(typeMirror.typeName, "out").build())
+            .addField(FieldSpec.builder(typeMirror.typeName, "inp").build())
             .addMethod(
                 MethodSpec.methodBuilder("foo")
                     .addCode(scope.builder().build())
@@ -195,14 +192,12 @@
     }
 
     data class Input(val typeName: TypeName) {
-        fun getTypeMirror(processingEnv: ProcessingEnvironment): TypeMirror {
-            return processingEnv.requireTypeMirror(typeName)
+        fun getTypeMirror(processingEnv: XProcessingEnv): XType {
+            return processingEnv.requireType(typeName)
         }
 
-        fun getBoxedTypeMirror(processingEnv: ProcessingEnvironment): TypeMirror {
-            return getTypeMirror(processingEnv).box(
-                processingEnv.typeUtils
-            )
+        fun getBoxedTypeMirror(processingEnv: XProcessingEnv): XType {
+            return getTypeMirror(processingEnv).boxed()
         }
     }
 }
diff --git a/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt b/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
index c1309b5..4c4a252 100644
--- a/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
@@ -29,11 +29,9 @@
 import androidx.room.ext.RxJava2TypeNames
 import androidx.room.ext.RxJava3TypeNames
 import androidx.room.ext.T
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.requireTypeElement
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.typeName
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XProcessingEnv
+import androidx.room.processing.asDeclaredType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.binderprovider.DataSourceFactoryQueryResultBinderProvider
@@ -49,7 +47,6 @@
 import androidx.room.solver.types.TypeConverter
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
-import asDeclaredType
 import com.google.common.truth.Truth
 import com.google.testing.compile.CompileTester
 import com.google.testing.compile.JavaFileObjects
@@ -65,7 +62,6 @@
 import org.junit.runners.JUnit4
 import simpleRun
 import testCodeGenScope
-import javax.annotation.processing.ProcessingEnvironment
 
 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
 @RunWith(JUnit4::class)
@@ -78,7 +74,7 @@
     fun testDirect() {
         singleRun { invocation ->
             val store = TypeAdapterStore.create(Context(invocation.processingEnv))
-            val primitiveType = invocation.processingEnv.requireTypeMirror(TypeName.INT)
+            val primitiveType = invocation.processingEnv.requireType(TypeName.INT)
             val adapter = store.findColumnTypeAdapter(primitiveType, null)
             assertThat(adapter, notNullValue())
         }.compilesWithoutError()
@@ -90,14 +86,14 @@
             val store = TypeAdapterStore.create(Context(invocation.processingEnv))
             val boolean = invocation
                     .processingEnv
-                    .requireTypeMirror("java.lang.Boolean")
+                    .requireType("java.lang.Boolean")
             val adapter = store.findColumnTypeAdapter(boolean, null)
             assertThat(adapter, notNullValue())
             assertThat(adapter, instanceOf(CompositeAdapter::class.java))
             val composite = adapter as CompositeAdapter
-            assertThat(composite.intoStatementConverter?.from?.typeName(),
+            assertThat(composite.intoStatementConverter?.from?.typeName,
                     `is`(TypeName.BOOLEAN.box()))
-            assertThat(composite.columnTypeAdapter.out.typeName(),
+            assertThat(composite.columnTypeAdapter.out.typeName,
                     `is`(TypeName.INT.box()))
         }.compilesWithoutError()
     }
@@ -106,7 +102,7 @@
     fun testVia1TypeAdapter() {
         singleRun { invocation ->
             val store = TypeAdapterStore.create(Context(invocation.processingEnv))
-            val booleanType = invocation.processingEnv.requireTypeMirror(TypeName.BOOLEAN)
+            val booleanType = invocation.processingEnv.requireType(TypeName.BOOLEAN)
             val adapter = store.findColumnTypeAdapter(booleanType, null)
             assertThat(adapter, notNullValue())
             assertThat(adapter, instanceOf(CompositeAdapter::class.java))
@@ -133,7 +129,7 @@
         singleRun { invocation ->
             val store = TypeAdapterStore.create(Context(invocation.processingEnv),
                     pointTypeConverters(invocation.processingEnv))
-            val pointType = invocation.processingEnv.requireTypeMirror("foo.bar.Point")
+            val pointType = invocation.processingEnv.requireType("foo.bar.Point")
             val adapter = store.findColumnTypeAdapter(pointType, null)
             assertThat(adapter, notNullValue())
             assertThat(adapter, instanceOf(CompositeAdapter::class.java))
@@ -165,7 +161,7 @@
         singleRun { (processingEnv) ->
             val store = TypeAdapterStore.create(Context(processingEnv),
                     dateTypeConverters(processingEnv))
-            val tDate = processingEnv.requireTypeMirror("java.util.Date")
+            val tDate = processingEnv.requireType("java.util.Date")
             val adapter = store.findCursorValueReader(tDate, SQLTypeAffinity.INTEGER)
             assertThat(adapter, notNullValue())
             assertThat(adapter?.typeMirror(), `is`(tDate))
@@ -442,8 +438,8 @@
         simpleRun { invocation ->
             val pagingSourceElement = invocation.processingEnv
                 .requireTypeElement(PagingSource::class)
-            val intType = invocation.processingEnv.requireTypeMirror(Integer::class)
-            val pagingSourceIntIntType = invocation.processingEnv.typeUtils
+            val intType = invocation.processingEnv.requireType(Integer::class)
+            val pagingSourceIntIntType = invocation.processingEnv
                 .getDeclaredType(pagingSourceElement, intType, intType)
 
             assertThat(pagingSourceIntIntType, notNullValue())
@@ -457,8 +453,8 @@
         simpleRun { invocation ->
             val pagingSourceElement = invocation.processingEnv
                 .requireTypeElement(PagingSource::class)
-            val stringType = invocation.processingEnv.requireTypeMirror(String::class)
-            val pagingSourceIntIntType = invocation.processingEnv.typeUtils
+            val stringType = invocation.processingEnv.requireType(String::class)
+            val pagingSourceIntIntType = invocation.processingEnv
                 .getDeclaredType(pagingSourceElement, stringType, stringType)
 
             assertThat(pagingSourceIntIntType, notNullValue())
@@ -504,9 +500,9 @@
     }
 
     private fun createIntListToStringBinders(invocation: TestInvocation): List<TypeConverter> {
-        val intType = invocation.processingEnv.requireTypeMirror(Integer::class)
+        val intType = invocation.processingEnv.requireType(Integer::class)
         val listElement = invocation.processingEnv.requireTypeElement(java.util.List::class)
-        val listOfInts = invocation.processingEnv.typeUtils.getDeclaredType(listElement, intType)
+        val listOfInts = invocation.processingEnv.getDeclaredType(listElement, intType)
 
         val intListConverter = object : TypeConverter(listOfInts,
                 invocation.context.COMMON_TYPES.STRING) {
@@ -576,9 +572,9 @@
                         .build())
     }
 
-    fun pointTypeConverters(env: ProcessingEnvironment): List<TypeConverter> {
-        val tPoint = env.requireTypeMirror("foo.bar.Point")
-        val tBoolean = env.requireTypeMirror(TypeName.BOOLEAN)
+    fun pointTypeConverters(env: XProcessingEnv): List<TypeConverter> {
+        val tPoint = env.requireType("foo.bar.Point")
+        val tBoolean = env.requireType(TypeName.BOOLEAN)
         return listOf(
                 object : TypeConverter(tPoint, tBoolean) {
                     override fun convert(
@@ -587,7 +583,8 @@
                         scope: CodeGenScope
                     ) {
                         scope.builder().apply {
-                            addStatement("$L = $T.toBoolean($L)", outputVarName, from, inputVarName)
+                            addStatement("$L = $T.toBoolean($L)", outputVarName, from.typeName,
+                                inputVarName)
                         }
                     }
                 },
@@ -598,7 +595,7 @@
                         scope: CodeGenScope
                     ) {
                         scope.builder().apply {
-                            addStatement("$L = $T.fromBoolean($L)", outputVarName, tPoint,
+                            addStatement("$L = $T.fromBoolean($L)", outputVarName, tPoint.typeName,
                                     inputVarName)
                         }
                     }
@@ -606,9 +603,9 @@
         )
     }
 
-    fun dateTypeConverters(env: ProcessingEnvironment): List<TypeConverter> {
-        val tDate = env.requireTypeMirror("java.util.Date")
-        val tLong = env.requireTypeMirror("java.lang.Long")
+    fun dateTypeConverters(env: XProcessingEnv): List<TypeConverter> {
+        val tDate = env.requireType("java.util.Date")
+        val tLong = env.requireType("java.lang.Long")
         return listOf(
                 object : TypeConverter(tDate, tLong) {
                     override fun convert(
diff --git a/room/compiler/src/test/kotlin/androidx/room/solver/TypeAssignmentTest.kt b/room/compiler/src/test/kotlin/androidx/room/solver/TypeAssignmentTest.kt
index c85dd25..b7e94e3 100644
--- a/room/compiler/src/test/kotlin/androidx/room/solver/TypeAssignmentTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/solver/TypeAssignmentTest.kt
@@ -16,20 +16,14 @@
 
 package androidx.room.solver
 
-import androidx.room.ext.getAllFieldsIncludingPrivateSupers
-import androidx.room.ext.isAssignableFromWithoutVariance
-import androidx.room.ext.name
-import androidx.room.ext.requireTypeElement
-import androidx.room.ext.type
+import androidx.room.processing.XTypeElement
+import androidx.room.processing.XVariableElement
 import androidx.room.testing.TestInvocation
 import com.google.testing.compile.JavaFileObjects
 import org.hamcrest.CoreMatchers.`is`
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.Test
 import simpleRun
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.element.TypeElement
-import javax.lang.model.element.VariableElement
 
 class TypeAssignmentTest {
     companion object {
@@ -55,10 +49,10 @@
     fun basic() {
         runTest {
             val testObject = processingEnv.requireTypeElement("foo.bar.MyObject")
-            val string = testObject.getField(processingEnv, "mString")
-            val integer = testObject.getField(processingEnv, "mInteger")
+            val string = testObject.getField("mString")
+            val integer = testObject.getField("mInteger")
             assertThat( integer.type
-                .isAssignableFromWithoutVariance(typeUtils, string.type),
+                .isAssignableFromWithoutVariance(string.type),
                     `is`(false))
         }
     }
@@ -67,10 +61,10 @@
     fun generics() {
         runTest {
             val testObject = processingEnv.requireTypeElement("foo.bar.MyObject")
-            val set = testObject.getField(processingEnv, "mSet").type
-            val hashSet = testObject.getField(processingEnv, "mHashSet").type
-            assertThat(hashSet.isAssignableFromWithoutVariance(typeUtils, set), `is`(false))
-            assertThat(set.isAssignableFromWithoutVariance(typeUtils, hashSet), `is`(true))
+            val set = testObject.getField("mSet").type
+            val hashSet = testObject.getField("mHashSet").type
+            assertThat(hashSet.isAssignableFromWithoutVariance(set), `is`(false))
+            assertThat(set.isAssignableFromWithoutVariance(hashSet), `is`(true))
         }
     }
 
@@ -84,10 +78,10 @@
          */
         runTest {
             val testObject = processingEnv.requireTypeElement("foo.bar.MyObject")
-            val set = testObject.getField(processingEnv, "mSet").type
-            val varianceSet = testObject.getField(processingEnv, "mVarianceSet").type
-            assertThat(varianceSet.isAssignableFromWithoutVariance(typeUtils, set), `is`(true))
-            assertThat(set.isAssignableFromWithoutVariance(typeUtils, varianceSet), `is`(true))
+            val set = testObject.getField("mSet").type
+            val varianceSet = testObject.getField("mVarianceSet").type
+            assertThat(varianceSet.isAssignableFromWithoutVariance(set), `is`(true))
+            assertThat(set.isAssignableFromWithoutVariance(varianceSet), `is`(true))
         }
     }
 
@@ -95,18 +89,17 @@
     fun unboundedVariance() {
         runTest {
             val testObject = processingEnv.requireTypeElement("foo.bar.MyObject")
-            val unbounded = testObject.getField(processingEnv, "mUnboundedMap").type
-            val objectMap = testObject.getField(processingEnv, "mStringMap").type
-            assertThat(objectMap.isAssignableFromWithoutVariance(typeUtils, unbounded), `is`(false))
-            assertThat(unbounded.isAssignableFromWithoutVariance(typeUtils, objectMap), `is`(true))
+            val unbounded = testObject.getField("mUnboundedMap").type
+            val objectMap = testObject.getField("mStringMap").type
+            assertThat(objectMap.isAssignableFromWithoutVariance(unbounded), `is`(false))
+            assertThat(unbounded.isAssignableFromWithoutVariance(objectMap), `is`(true))
         }
     }
 
-    private fun TypeElement.getField(
-        env: ProcessingEnvironment,
+    private fun XTypeElement.getField(
         name: String
-    ): VariableElement {
-        return getAllFieldsIncludingPrivateSupers(env).first {
+    ): XVariableElement {
+        return getAllFieldsIncludingPrivateSupers().first {
             it.name == name
         }
     }
diff --git a/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt b/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
index 793b2de..0634281 100644
--- a/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
@@ -20,11 +20,6 @@
 import androidx.room.Query
 import androidx.room.ext.RoomTypeNames.ROOM_SQL_QUERY
 import androidx.room.ext.RoomTypeNames.STRING_UTIL
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asExecutableElement
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.hasAnnotation
 import androidx.room.processor.QueryMethodProcessor
 import androidx.room.testing.TestProcessor
 import androidx.room.writer.QueryWriter
@@ -306,9 +301,7 @@
                                     .getElementsAnnotatedWith(Dao::class.java)
                                     .map {
                                         Pair(it,
-                                            it.asTypeElement().getAllMethods(
-                                                invocation.processingEnv
-                                            ).filter {
+                                            it.asTypeElement().getAllMethods().filter {
                                                 it.hasAnnotation(Query::class)
                                             }
                                         )
@@ -316,7 +309,7 @@
                             val parser = QueryMethodProcessor(
                                     baseContext = invocation.context,
                                     containing = owner.asDeclaredType(),
-                                    executableElement = methods.first().asExecutableElement())
+                                    executableElement = methods.first())
                             val method = parser.process()
                             handler(QueryWriter(method))
                             true
diff --git a/room/compiler/src/test/kotlin/androidx/room/testing/TestInvocation.kt b/room/compiler/src/test/kotlin/androidx/room/testing/TestInvocation.kt
index 79acd1d..e32b344 100644
--- a/room/compiler/src/test/kotlin/androidx/room/testing/TestInvocation.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/testing/TestInvocation.kt
@@ -16,17 +16,22 @@
 
 package androidx.room.testing
 
+import androidx.room.processing.XProcessingEnv
+import androidx.room.processing.XRoundEnv
+import androidx.room.processing.XTypeElement
 import androidx.room.processor.Context
-import javax.annotation.processing.ProcessingEnvironment
 import javax.annotation.processing.RoundEnvironment
-import javax.lang.model.element.TypeElement
 
 data class TestInvocation(
-    val processingEnv: ProcessingEnvironment,
-    val annotations: MutableSet<out TypeElement>,
-    val roundEnv: RoundEnvironment
+    val processingEnv: XProcessingEnv,
+    val annotations: Set<XTypeElement>,
+    val roundEnv: XRoundEnv
 ) {
-    val context = Context(processingEnv)
+    constructor(
+        processingEnv: XProcessingEnv,
+        annotations: Set<XTypeElement>,
+        roundEnv: RoundEnvironment
+    ) : this(processingEnv, annotations, XRoundEnv.create(processingEnv, roundEnv))
 
-    val typeUtils by lazy { processingEnv.typeUtils }
+    val context = Context(processingEnv)
 }
diff --git a/room/compiler/src/test/kotlin/androidx/room/testing/TestProcessor.kt b/room/compiler/src/test/kotlin/androidx/room/testing/TestProcessor.kt
index 29106e0..6496fec 100644
--- a/room/compiler/src/test/kotlin/androidx/room/testing/TestProcessor.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/testing/TestProcessor.kt
@@ -16,24 +16,21 @@
 
 package androidx.room.testing
 
+import androidx.room.processing.JavacTestProcessor
+import androidx.room.processing.XRoundEnv
+import androidx.room.processing.XTypeElement
 import androidx.room.processor.Context
-import javax.annotation.processing.AbstractProcessor
-import javax.annotation.processing.RoundEnvironment
 import javax.lang.model.SourceVersion
-import javax.lang.model.element.TypeElement
 import kotlin.reflect.KClass
 
 class TestProcessor(
     val handlers: List<(TestInvocation) -> Boolean>,
     val annotations: MutableSet<String>
-) : AbstractProcessor() {
+) : JavacTestProcessor() {
     var count = 0
-    override fun process(
-        annotations: MutableSet<out TypeElement>,
-        roundEnv: RoundEnvironment
-    ): Boolean {
+    override fun doProcess(annotations: Set<XTypeElement>, roundEnv: XRoundEnv): Boolean {
         return handlers.getOrNull(count++)?.invoke(
-                    TestInvocation(processingEnv, annotations, roundEnv)) ?: true
+            TestInvocation(xProcessingEnv, annotations, roundEnv)) ?: true
     }
 
     override fun getSupportedSourceVersion(): SourceVersion {
diff --git a/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt b/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt
index 96333e8..f7cab4d 100644
--- a/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt
@@ -26,7 +26,9 @@
 import androidx.room.ext.RoomRxJava3TypeNames
 import androidx.room.ext.RxJava2TypeNames
 import androidx.room.ext.RxJava3TypeNames
-import androidx.room.ext.asTypeElement
+import androidx.room.processing.XElement
+import androidx.room.processing.XType
+import androidx.room.processing.XVariableElement
 import androidx.room.processor.DatabaseViewProcessor
 import androidx.room.processor.TableEntityProcessor
 import androidx.room.solver.CodeGenScope
@@ -41,16 +43,11 @@
 import com.google.testing.compile.JavaFileObjects
 import com.google.testing.compile.JavaSourcesSubjectFactory
 import com.squareup.javapoet.ClassName
-import org.mockito.Mockito
 import org.mockito.Mockito.doReturn
 import org.mockito.Mockito.mock
 import java.io.File
 import java.nio.charset.StandardCharsets.UTF_8
 import java.util.Locale
-import javax.lang.model.element.Element
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.TypeKind
-import javax.lang.model.type.TypeMirror
 import javax.tools.JavaFileObject
 import javax.tools.StandardLocation
 import javax.tools.ToolProvider.getSystemJavaCompiler
@@ -188,7 +185,7 @@
     }
 }
 fun testCodeGenScope(): CodeGenScope {
-    return CodeGenScope(Mockito.mock(ClassWriter::class.java))
+    return CodeGenScope(mock(ClassWriter::class.java))
 }
 
 fun simpleRun(
@@ -220,7 +217,7 @@
 }
 
 fun createVerifierFromEntitiesAndViews(invocation: TestInvocation): DatabaseVerifier {
-    return DatabaseVerifier.create(invocation.context, Mockito.mock(Element::class.java),
+    return DatabaseVerifier.create(invocation.context, mock(XElement::class.java),
             invocation.getEntities(), invocation.getViews())!!
 }
 
@@ -238,14 +235,13 @@
 }
 
 /**
- * Create mocks of [Element] and [TypeMirror] so that they can be used for instantiating a fake
+ * Create mocks of [XElement] and [XType] so that they can be used for instantiating a fake
  * [androidx.room.vo.Field].
  */
-fun mockElementAndType(): Pair<VariableElement, TypeMirror> {
-    val element = mock(VariableElement::class.java)
-    val type = mock(TypeMirror::class.java)
-    doReturn(TypeKind.DECLARED).`when`(type).kind
-    doReturn(type).`when`(element).asType()
+fun mockElementAndType(): Pair<XVariableElement, XType> {
+    val element = mock(XVariableElement::class.java)
+    val type = mock(XType::class.java)
+    doReturn(type).`when`(element).type
     return element to type
 }
 
diff --git a/room/compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt b/room/compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt
index 8ae3d2e..bbe2969 100644
--- a/room/compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt
@@ -16,11 +16,15 @@
 
 package androidx.room.verifier
 
-import androidx.room.ext.requireTypeElement
-import androidx.room.ext.requireTypeMirror
 import androidx.room.parser.Collate
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.parser.SqlParser
+import androidx.room.processing.XConstructorElement
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XElement
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
+import androidx.room.processing.XVariableElement
 import androidx.room.processor.Context
 import androidx.room.testing.TestInvocation
 import androidx.room.vo.CallType
@@ -48,12 +52,6 @@
 import org.mockito.Mockito.mock
 import simpleRun
 import java.sql.Connection
-import javax.lang.model.element.Element
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 @RunWith(Parameterized::class)
 class DatabaseVerifierTest(private val useLocalizedCollation: Boolean) {
@@ -74,7 +72,7 @@
 
     private fun createVerifier(invocation: TestInvocation): DatabaseVerifier {
         val db = userDb(invocation)
-        return DatabaseVerifier.create(invocation.context, mock(Element::class.java),
+        return DatabaseVerifier.create(invocation.context, mock(XElement::class.java),
                 db.entities, db.views)!!
     }
 
@@ -238,7 +236,7 @@
                 ),
                 emptyList()
             )
-            val element = mock(Element::class.java)
+            val element = mock(XElement::class.java)
             DatabaseVerifier.create(invocation.context, element, db.entities, db.views)!!
         }.failsToCompile().withErrorContaining("default value of column [name]")
     }
@@ -276,8 +274,8 @@
 
     private fun database(entities: List<Entity>, views: List<DatabaseView>): Database {
         return Database(
-                element = mock(TypeElement::class.java),
-                type = mock(TypeMirror::class.java),
+                element = mock(XTypeElement::class.java),
+                type = mock(XType::class.java),
                 entities = entities,
                 views = views,
                 daoMethods = emptyList(),
@@ -295,37 +293,37 @@
         return Entity(
             element = element,
             tableName = tableName,
-            type = mock(DeclaredType::class.java),
+            type = mock(XDeclaredType::class.java),
             fields = fields.toList(),
             embeddedFields = emptyList(),
             indices = emptyList(),
             primaryKey = PrimaryKey(null, Fields(fields.take(1)), false),
             foreignKeys = emptyList(),
-            constructor = Constructor(mock(ExecutableElement::class.java), emptyList()),
+            constructor = Constructor(mock(XConstructorElement::class.java), emptyList()),
             shadowTableName = null
         )
     }
 
     private fun view(viewName: String, query: String, vararg fields: Field): DatabaseView {
         return DatabaseView(
-                element = mock(TypeElement::class.java),
+                element = mock(XTypeElement::class.java),
                 viewName = viewName,
-                type = mock(DeclaredType::class.java),
+                type = mock(XDeclaredType::class.java),
                 fields = fields.toList(),
                 embeddedFields = emptyList(),
                 query = SqlParser.parse(query),
-                constructor = Constructor(mock(ExecutableElement::class.java), emptyList())
+                constructor = Constructor(mock(XConstructorElement::class.java), emptyList())
         )
     }
 
     private fun field(
         name: String,
-        type: TypeMirror,
+        type: XType,
         affinity: SQLTypeAffinity,
         defaultValue: String? = null
     ): Field {
-        val element = mock(VariableElement::class.java)
-        doReturn(type).`when`(element).asType()
+        val element = mock(XVariableElement::class.java)
+        doReturn(type).`when`(element).type
         val f = Field(
             element = element,
             name = name,
@@ -343,13 +341,13 @@
         return f
     }
 
-    private fun assignGetterSetter(f: Field, name: String, type: TypeMirror) {
+    private fun assignGetterSetter(f: Field, name: String, type: XType) {
         f.getter = FieldGetter(name, type, CallType.FIELD)
         f.setter = FieldSetter(name, type, CallType.FIELD)
     }
 
-    private fun primitive(context: Context, typeName: TypeName): TypeMirror {
-        return context.processingEnv.requireTypeMirror(typeName)
+    private fun primitive(context: Context, typeName: TypeName): XType {
+        return context.processingEnv.requireType(typeName)
     }
 
     private fun getPrimaryKeys(connection: Connection, tableName: String): List<String> {
diff --git a/room/compiler/src/test/kotlin/androidx/room/vo/DatabaseTest.kt b/room/compiler/src/test/kotlin/androidx/room/vo/DatabaseTest.kt
index 41f070b..b9f67e0 100644
--- a/room/compiler/src/test/kotlin/androidx/room/vo/DatabaseTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/vo/DatabaseTest.kt
@@ -16,17 +16,17 @@
 
 package androidx.room.vo
 
+import androidx.room.processing.XConstructorElement
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XElement
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
 import org.apache.commons.codec.digest.DigestUtils
 import org.junit.Assert.assertEquals
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import org.mockito.Mockito.mock
-import javax.lang.model.element.Element
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 @RunWith(JUnit4::class)
 class DatabaseTest {
@@ -34,16 +34,16 @@
     @Test
     fun indexLegacyHash() {
         val database = Database(
-            element = mock(TypeElement::class.java),
-            type = mock(TypeMirror::class.java),
+            element = mock(XTypeElement::class.java),
+            type = mock(XType::class.java),
             entities = listOf(
                 Entity(
-                    mock(TypeElement::class.java),
+                    mock(XTypeElement::class.java),
                     tableName = "TheTable",
-                    type = mock(DeclaredType::class.java),
+                    type = mock(XDeclaredType::class.java),
                     fields = emptyList(),
                     embeddedFields = emptyList(),
-                    primaryKey = PrimaryKey(mock(Element::class.java), Fields(), false),
+                    primaryKey = PrimaryKey(mock(XElement::class.java), Fields(), false),
                     indices = listOf(
                         Index(
                             name = "leIndex",
@@ -55,7 +55,7 @@
                             fields = Fields())
                     ),
                     foreignKeys = emptyList(),
-                    constructor = Constructor(mock(ExecutableElement::class.java), emptyList()),
+                    constructor = Constructor(mock(XConstructorElement::class.java), emptyList()),
                     shadowTableName = null
                 )
             ),
diff --git a/room/compiler/src/test/kotlin/androidx/room/vo/EntityTest.kt b/room/compiler/src/test/kotlin/androidx/room/vo/EntityTest.kt
index fe3ba67..5d81dc1 100644
--- a/room/compiler/src/test/kotlin/androidx/room/vo/EntityTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/vo/EntityTest.kt
@@ -16,16 +16,16 @@
 
 package androidx.room.vo
 
+import androidx.room.processing.XConstructorElement
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XElement
+import androidx.room.processing.XTypeElement
 import org.hamcrest.CoreMatchers.`is`
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import org.mockito.Mockito.mock
-import javax.lang.model.element.Element
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
 
 @RunWith(JUnit4::class)
 class EntityTest {
@@ -72,15 +72,15 @@
         foreignKeys: List<ForeignKey> = emptyList()
     ): Entity {
         return Entity(
-                element = mock(TypeElement::class.java),
+                element = mock(XTypeElement::class.java),
                 tableName = tableName,
-                type = mock(DeclaredType::class.java),
+                type = mock(XDeclaredType::class.java),
                 fields = emptyList(),
                 embeddedFields = emptyList(),
-                primaryKey = PrimaryKey(mock(Element::class.java), Fields(), false),
+                primaryKey = PrimaryKey(mock(XElement::class.java), Fields(), false),
                 indices = emptyList(),
                 foreignKeys = foreignKeys,
-                constructor = Constructor(mock(ExecutableElement::class.java), emptyList()),
+                constructor = Constructor(mock(XConstructorElement::class.java), emptyList()),
                 shadowTableName = null)
     }
 
diff --git a/room/compiler/src/test/kotlin/androidx/room/vo/FtsEntityTest.kt b/room/compiler/src/test/kotlin/androidx/room/vo/FtsEntityTest.kt
index ca7c58d..acc4574 100644
--- a/room/compiler/src/test/kotlin/androidx/room/vo/FtsEntityTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/vo/FtsEntityTest.kt
@@ -17,6 +17,9 @@
 package androidx.room.vo
 
 import androidx.room.parser.FtsVersion
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XElement
+import androidx.room.processing.XTypeElement
 import mockElementAndType
 import org.hamcrest.CoreMatchers.`is`
 import org.hamcrest.MatcherAssert.assertThat
@@ -24,9 +27,6 @@
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import org.mockito.Mockito.mock
-import javax.lang.model.element.Element
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
 
 @RunWith(JUnit4::class)
 class FtsEntityTest {
@@ -39,14 +39,14 @@
         val dontIndexMe1Field = createField("dontIndexMe1")
         val dontIndexMe2Field = createField("dontIndexMe2")
         val entity = FtsEntity(
-                element = mock(TypeElement::class.java),
+                element = mock(XTypeElement::class.java),
                 tableName = "Mail",
-                type = mock(DeclaredType::class.java),
+                type = mock(XDeclaredType::class.java),
                 fields = listOf(primaryKeyField, bodyField, languageIdField, dontIndexMe1Field,
                         dontIndexMe2Field),
                 embeddedFields = emptyList(),
                 primaryKey = PrimaryKey(
-                        declaredIn = mock(Element::class.java),
+                        declaredIn = mock(XElement::class.java),
                         fields = Fields(primaryKeyField),
                         autoGenerateId = true),
                 constructor = null,
@@ -84,13 +84,13 @@
         val primaryKeyField = createField("rowid")
         val bodyField = createField("body")
         val entity = FtsEntity(
-            element = mock(TypeElement::class.java),
+            element = mock(XTypeElement::class.java),
             tableName = "Mail",
-            type = mock(DeclaredType::class.java),
+            type = mock(XDeclaredType::class.java),
             fields = listOf(primaryKeyField, bodyField),
             embeddedFields = emptyList(),
             primaryKey = PrimaryKey(
-                declaredIn = mock(Element::class.java),
+                declaredIn = mock(XElement::class.java),
                 fields = Fields(primaryKeyField),
                 autoGenerateId = true),
             constructor = null,
@@ -120,13 +120,13 @@
         val primaryKeyField = createField("rowid")
         val bodyField = createField("body")
         val entity = FtsEntity(
-            element = mock(TypeElement::class.java),
+            element = mock(XTypeElement::class.java),
             tableName = "Mail",
-            type = mock(DeclaredType::class.java),
+            type = mock(XDeclaredType::class.java),
             fields = listOf(primaryKeyField, bodyField),
             embeddedFields = emptyList(),
             primaryKey = PrimaryKey(
-                declaredIn = mock(Element::class.java),
+                declaredIn = mock(XElement::class.java),
                 fields = Fields(primaryKeyField),
                 autoGenerateId = true),
             constructor = null,
@@ -155,13 +155,13 @@
         val primaryKeyField = createField("rowid")
         val bodyField = createField("body")
         val entity = FtsEntity(
-            element = mock(TypeElement::class.java),
+            element = mock(XTypeElement::class.java),
             tableName = "Mail",
-            type = mock(DeclaredType::class.java),
+            type = mock(XDeclaredType::class.java),
             fields = listOf(primaryKeyField, bodyField),
             embeddedFields = emptyList(),
             primaryKey = PrimaryKey(
-                declaredIn = mock(Element::class.java),
+                declaredIn = mock(XElement::class.java),
                 fields = Fields(primaryKeyField),
                 autoGenerateId = true),
             constructor = null,
@@ -191,13 +191,13 @@
         val primaryKeyField = createField("rowid")
         val bodyField = createField("body")
         val entity = FtsEntity(
-            element = mock(TypeElement::class.java),
+            element = mock(XTypeElement::class.java),
             tableName = "Mail",
-            type = mock(DeclaredType::class.java),
+            type = mock(XDeclaredType::class.java),
             fields = listOf(primaryKeyField, bodyField),
             embeddedFields = emptyList(),
             primaryKey = PrimaryKey(
-                declaredIn = mock(Element::class.java),
+                declaredIn = mock(XElement::class.java),
                 fields = Fields(primaryKeyField),
                 autoGenerateId = true),
             constructor = null,
diff --git a/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt b/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
index 7be4e69..4370c29 100644
--- a/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
@@ -18,9 +18,6 @@
 
 import COMMON
 import androidx.room.ext.RoomTypeNames
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.requireTypeElement
 import androidx.room.processor.DaoProcessor
 import androidx.room.testing.TestProcessor
 import com.google.common.truth.Truth
diff --git a/room/compiler/src/test/kotlin/androidx/room/writer/SQLiteOpenHelperWriterTest.kt b/room/compiler/src/test/kotlin/androidx/room/writer/SQLiteOpenHelperWriterTest.kt
index 581ff9d..72cfd81 100644
--- a/room/compiler/src/test/kotlin/androidx/room/writer/SQLiteOpenHelperWriterTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/writer/SQLiteOpenHelperWriterTest.kt
@@ -17,7 +17,6 @@
 package androidx.room.writer
 
 import androidx.annotation.NonNull
-import androidx.room.ext.asTypeElement
 import androidx.room.processor.DatabaseProcessor
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor