sqldelight icon indicating copy to clipboard operation
sqldelight copied to clipboard

Table dependency not working. Getter not implemented on the final merged interface implementation

Open ursusursus opened this issue 3 years ago • 2 comments

:app

sqldelight {
    AppDatabase {
        packageName = "sk.foo.app"
        dependency project(":install:impl")
    }
}
import sk.foo.install.AppDatabase as AppDatabase0

interface AppDatabase : Transacter, AppDatabase0 {
  val dummyQueries: DummyQueries

  companion object {
    val Schema: SqlDriver.Schema
      get() = AppDatabase::class.schema

    operator fun invoke(driver: SqlDriver): AppDatabase = AppDatabase::class.newInstance(driver)}
}
internal val KClass<AppDatabase>.schema: SqlDriver.Schema
  get() = AppDatabaseImpl.Schema

internal fun KClass<AppDatabase>.newInstance(driver: SqlDriver): AppDatabase =
    AppDatabaseImpl(driver)

private class AppDatabaseImpl(
  driver: SqlDriver
) : TransacterImpl(driver), AppDatabase {
  override val dummyQueries: DummyQueriesImpl = DummyQueriesImpl(this, driver)

  ///////// installdQueries missing here ///////////////

  object Schema : SqlDriver.Schema {
    override val version: Int
      get() = 1

    override fun create(driver: SqlDriver) {
      driver.execute(null, """
          |CREATE TABLE dummy (
          |    value TEXT
          |)
          """.trimMargin(), 0)
    }

    override fun migrate(
      driver: SqlDriver,
      oldVersion: Int,
      newVersion: Int
    ) {
    }
  }
}

private class DummyQueriesImpl(
  private val database: AppDatabaseImpl,
  private val driver: SqlDriver
) : TransacterImpl(driver), DummyQueries

:install:impl

sqldelight {
    AppDatabase {
        packageName = "sk.foo.install"
    }
}
package sk.foo.install

import com.squareup.sqldelight.Transacter
import com.squareup.sqldelight.db.SqlDriver
import sk.o2.install.impl.newInstance
import sk.o2.install.impl.schema

interface AppDatabase : Transacter {
  val installIdQueries: InstallIdQueries

  companion object {
    val Schema: SqlDriver.Schema
      get() = AppDatabase::class.schema

    operator fun invoke(driver: SqlDriver): AppDatabase = AppDatabase::class.newInstance(driver)}
}

The final AppDatabase implementa AppDatabase0 correctly. However the AppDatabaseImpl doesnt implement the AppDatabase0 getter

Class 'AppDatabaseImpl' is not abstract and does not implement abstract member public abstract val installIdQueries: InstallIdQueries defined in sk.foo.app.AppDatabase

Am I doing something wrong?

ursusursus avatar Oct 27 '20 03:10 ursusursus

I figured out the cause. It's flavors. Whenever I add this

flavorDimensions "api"
    productFlavors {
        mock {
            dimension "api"
        }

        tst {
            dimension "api"
        }
    }

the error above manifests itself. (as you can see the flavors don't do anything really, don't change package name etc so it seems like a bug in the compiler)

ursusursus avatar Oct 28 '20 00:10 ursusursus

This seems to be a duplicate of #1360 (but this report is more detailed).

Also I discovered the same error when using dependencies in a multiplatform project. Not sure if I should report it separately.

dimsuz avatar Jan 07 '22 13:01 dimsuz