-
Notifications
You must be signed in to change notification settings - Fork 496
/
FooDialect.kt
49 lines (43 loc) · 2.01 KB
/
FooDialect.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package foo
import app.cash.sqldelight.dialect.api.DialectType
import app.cash.sqldelight.dialect.api.IntermediateType
import app.cash.sqldelight.dialect.api.SqlDelightDialect
import app.cash.sqldelight.dialect.api.TypeResolver
import app.cash.sqldelight.dialect.api.encapsulatingType
import app.cash.sqldelight.dialects.sqlite_3_18.SqliteDialect
import app.cash.sqldelight.dialects.sqlite_3_18.SqliteTypeResolver
import com.alecstrong.sql.psi.core.psi.SqlFunctionExpr
import com.alecstrong.sql.psi.core.psi.SqlTypeName
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.MemberName
import com.squareup.kotlinpoet.TypeName
class FooDialect : SqlDelightDialect by SqliteDialect() {
override fun typeResolver(parentResolver: TypeResolver) = CustomResolver(parentResolver)
class CustomResolver(private val parentResolver: TypeResolver) : TypeResolver by SqliteTypeResolver(parentResolver) {
override fun functionType(functionExpr: SqlFunctionExpr): IntermediateType? {
return when (functionExpr.functionName.text.lowercase()) {
"foo" -> encapsulatingType(functionExpr.exprList, ExtensionType).asNonNullable()
else -> parentResolver.functionType(functionExpr)
}
}
override fun definitionType(typeName: SqlTypeName): IntermediateType {
return when (typeName) { else -> IntermediateType(ExtensionType) }
}
}
private object ExtensionType : DialectType {
override val javaType: TypeName = ClassName("kotlin.time", "Duration")
override fun cursorGetter(columnIndex: Int, cursorName: String): CodeBlock {
return CodeBlock.builder()
.add(
"$cursorName.getLong($columnIndex)?.%M(%M)",
MemberName("kotlin.time", "toDuration", isExtension = true),
MemberName("kotlin.time.DurationUnit", "SECONDS")
)
.build()
}
override fun prepareStatementBinder(columnIndex: String, value: CodeBlock): CodeBlock {
return CodeBlock.of("""TODO("Not yet implemented")""")
}
}
}