koin-annotations icon indicating copy to clipboard operation
koin-annotations copied to clipboard

Default Module is generated twice

Open mslalith opened this issue 8 months ago • 3 comments
trafficstars

Describe the bug I was trying to write a KSP code gen for Circuit with Koin. I was able to generate code properly but looks like somehow default module is being generated twice. Not really sure what could be causing this.

My KSP generated code

package dev.mslalith.freya.ui.root.splashpage

import com.slack.circuit.runtime.CircuitContext
import com.slack.circuit.runtime.screen.Screen
import com.slack.circuit.runtime.ui.Ui
import com.slack.circuit.runtime.ui.ui
import dev.mslalith.freya.core.screens.SplashScreen
import org.koin.core.`annotation`.Factory

@Factory
public class SplashPageFactory : Ui.Factory {
  override fun create(screen: Screen, context: CircuitContext): Ui<*>? = when (screen) {
    SplashScreen -> ui<SplashPageUiState> { state, modifier -> SplashPage(state = state, modifier = modifier) }
    else -> null
  }
}

Koin generated code

import org.koin.core.module.Module
import org.koin.dsl.*

import org.koin.meta.annotations.ExternalDefinition
import org.koin.core.definition.KoinDefinition
@ExternalDefinition("dev.mslalith.freya.ui.root.splashpage")
public fun Module.defineDevMslalithFreyaUiRootSplashpageSplashPageFactory() : KoinDefinition<*> = factory() { _ -> dev.mslalith.freya.ui.root.splashpage.SplashPageFactory() } bind(com.slack.circuit.runtime.ui.Ui.Factory::class)

public val _defaultModule : Module get() = module {
	defineDevMslalithFreyaUiRootSplashpageSplashPageFactory()
}
public val defaultModule : org.koin.core.module.Module get() = _defaultModule
public fun org.koin.core.KoinApplication.defaultModule(): org.koin.core.KoinApplication = modules(defaultModule)

Expected behavior Default module should be generated once

Koin project used and used version (please complete the following information): koin = "4.0.2" koin-annotations = "2.0.0"

Additional moduleDefinition Add any other moduleDefinition about the problem here.

@Module(
    includes = [
        RootModule::class,
        CircuitModule::class
    ]
)
@ComponentScan("dev.mslalith.freya.ui")
class UiModule

@Module
class CircuitModule {

    @Single
    fun provideCircuit(
        uiFactories: List<Ui.Factory>,
        presenterFactories: List<Presenter.Factory>
    ): Circuit = Circuit.Builder()
        .addUiFactories(uiFactories)
        .addPresenterFactories(presenterFactories)
        .build()
}

mslalith avatar Feb 26 '25 08:02 mslalith

Looks like issue occurs when there are multiple @CircuitInject and @Factory annotations present in a module. For now, I've separated to multiple sub modules and it's working.

mslalith avatar Mar 01 '25 06:03 mslalith

Are you looking to make Koin Annotations integration for Circuit?

arnaudgiuliani avatar Mar 26 '25 16:03 arnaudgiuliani

Yes. I'm planning to do it locally at the moment.

mslalith avatar Mar 26 '25 17:03 mslalith

can say again what is missing/failing here?

arnaudgiuliani avatar Apr 07 '25 16:04 arnaudgiuliani

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

stale[bot] avatar Sep 05 '25 01:09 stale[bot]