Skip to content

Instantly share code, notes, and snippets.

View AlecKazakova's full-sized avatar
🐢
busy, slower to respond

Alec Kazakova AlecKazakova

🐢
busy, slower to respond
View GitHub Profile
import android.os.Looper
import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.Adapter
import androidx.recyclerview.widget.RecyclerView.NO_POSITION
import androidx.recyclerview.widget.RecyclerView.ViewHolder
class ComposableAdapter: Adapter<ViewHolder>() {
private val adapterForViewType = LinkedHashMap<Int, Adapter<ViewHolder>>()
class SqlDelightParserDefinition: SqliteParserDefinition() {
init {
setParserOverride(object : CustomSqliteParser() {
override fun columnDef(builder: PsiBuilder, level: Int, column_def: Parser): Boolean {
return SqlDelightParser.column_def(builder, level)
}
})
}
}
column_def ::= <<column_name_real>> type_name [ 'AS' ('@' annotation) * java_type_name ] ( <<column_constraint_real>> ) * {
implements=[
"com.alecstrong.sqlite.psi.core.psi.SqliteColumnDef";
"com.squareup.sqldelight.core.lang.psi.TypedColumn"
]
extends="com.squareup.sqldelight.core.lang.psi.ColumnDefMixin"
}
public interface SqliteCreateTableStmt extends TableElement {
@NotNull
List<SqliteColumnDef> getColumnDefList();
@Nullable
SqliteCompoundSelectStmt getCompoundSelectStmt();
@Nullable
SqliteDatabaseName getDatabaseName();
open class CustomSqliteParser {
open fun createElement(node: ASTNode): PsiElement = SqliteTypes.Factory.createElement(node)
open fun typeName(
builder: PsiBuilder,
level: Int,
type_name: GeneratedParserUtilBase.Parser
): Boolean = type_name.parse(builder, level)
}
internal object SqliteParserUtil : ModuleParserUtil() {
internal var customSqliteParser: CustomSqliteParser = CustomSqliteParser()
@JvmStatic
fun typeNameExt(
builder: PsiBuilder,
level: Int,
type_name: Parser
): Boolean = customSqliteParser.typeName(builder, level, type_name)
}
fake column_def ::= column_name type_name ( column_constraint ) *
column_def_real ::= <<columnNameExt column_name_real>> <<typeNameExt type_name_real>> ( <<columnConstraintExt column_constraint_real>> ) * {
elementType = column_def
}
fake type_name ::= identifier [ '(' signed_number ')' | '(' signed_number ',' signed_number ')' ]
type_name_real ::= <<identifierExt identifier_real>> [ '(' <<signedNumberExt signed_number_real>> ')' | '(' <<signedNumberExt signed_number_real>> ',' <<signedNumberExt signed_number_real>> ')' ] {
elementType = type_name
}
@AlecKazakova
AlecKazakova / BriteDatabaseUtils.kt
Last active February 7, 2021 15:36
Extension functions on SQLBrite's BriteDatabase to make working with SQLDelight easier
fun BriteDatabase.createQuery(query: SqlDelightStatement) = createQuery(query.tables, query.statement, *query.args)
inline fun <T: SqlDelightCompiledStatement> BriteDatabase.bindAndExecute(compiledStatement: T, bind: T.() -> Unit): Long {
synchronized(compiledStatement) {
compiledStatement.bind()
return when (compiledStatement) {
is SqlDelightCompiledStatement.Insert -> {
executeInsert(compiledStatement.table, compiledStatement.program)
}
is SqlDelightCompiledStatement.Update -> {