1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package androidx.room.solver.types
18 
19 import androidx.room.ext.L
20 import androidx.room.solver.CodeGenScope
21 import com.google.auto.common.MoreTypes
22 import javax.annotation.processing.ProcessingEnvironment
23 import javax.lang.model.type.TypeMirror
24 
25 /**
26  * Adapters for all boxed primitives that has direct cursor mappings.
27  */
28 open class BoxedPrimitiveColumnTypeAdapter(
29         boxed: TypeMirror,
30         val primitiveAdapter: PrimitiveColumnTypeAdapter
31 ) : ColumnTypeAdapter(boxed, primitiveAdapter.typeAffinity) {
32     companion object {
createBoxedPrimitiveAdaptersnull33         fun createBoxedPrimitiveAdapters(
34                 processingEnvironment: ProcessingEnvironment,
35                 primitiveAdapters: List<PrimitiveColumnTypeAdapter>
36         ): List<ColumnTypeAdapter> {
37 
38             return primitiveAdapters.map {
39                 BoxedPrimitiveColumnTypeAdapter(
40                         processingEnvironment.typeUtils
41                                 .boxedClass(MoreTypes.asPrimitiveType(it.out)).asType(),
42                         it
43                 )
44             }
45         }
46     }
47 
bindToStmtnull48     override fun bindToStmt(stmtName: String, indexVarName: String, valueVarName: String,
49                             scope: CodeGenScope) {
50         scope.builder().apply {
51             beginControlFlow("if ($L == null)", valueVarName).apply {
52                 addStatement("$L.bindNull($L)", stmtName, indexVarName)
53             }
54             nextControlFlow("else").apply {
55                 primitiveAdapter.bindToStmt(stmtName, indexVarName, valueVarName, scope)
56             }
57             endControlFlow()
58         }
59     }
60 
readFromCursornull61     override fun readFromCursor(outVarName: String, cursorVarName: String, indexVarName: String,
62                                 scope: CodeGenScope) {
63         scope.builder().apply {
64             beginControlFlow("if ($L.isNull($L))", cursorVarName, indexVarName).apply {
65                 addStatement("$L = null", outVarName)
66             }
67             nextControlFlow("else").apply {
68                 primitiveAdapter.readFromCursor(outVarName, cursorVarName, indexVarName, scope)
69             }
70             endControlFlow()
71         }
72     }
73 }
74