diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/IntermediateType.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/IntermediateType.kt index 3c3d3e920f9..04384f3d1c1 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/IntermediateType.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/IntermediateType.kt @@ -89,7 +89,7 @@ internal fun IntermediateType.cursorGetter(columnIndex: Int): CodeBlock { var cursorGetter = dialectType.cursorGetter(columnIndex, CURSOR_NAME) if (!javaType.isNullable) { - cursorGetter = CodeBlock.of("$cursorGetter!!") + cursorGetter = CodeBlock.of("%L!!", cursorGetter) } return (column?.columnType as ColumnTypeMixin?)?.adapter()?.let { adapter -> diff --git a/sqldelight-gradle-plugin/src/test/custom-dialect/dialect/src/main/kotlin/foo/FooDialect.kt b/sqldelight-gradle-plugin/src/test/custom-dialect/dialect/src/main/kotlin/foo/FooDialect.kt index b75e0c4514d..f6b097c4ac2 100644 --- a/sqldelight-gradle-plugin/src/test/custom-dialect/dialect/src/main/kotlin/foo/FooDialect.kt +++ b/sqldelight-gradle-plugin/src/test/custom-dialect/dialect/src/main/kotlin/foo/FooDialect.kt @@ -1,13 +1,18 @@ package foo +import app.cash.sqldelight.dialect.api.DialectType import app.cash.sqldelight.dialect.api.IntermediateType -import app.cash.sqldelight.dialect.api.PrimitiveType 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) @@ -15,9 +20,30 @@ class FooDialect : SqlDelightDialect by SqliteDialect() { 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, PrimitiveType.INTEGER) + "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")""") + } } }