Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,9 @@ private fun KSFunctionDeclaration.assistedParameters(
)
}
}
type.isInstanceOf(symbols.circuitContext) -> {
addOrError(AssistedType("context", type.toTypeName(), param.name!!.getShortName()))
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ internal class CircuitSymbols private constructor(resolver: Resolver) {
val circuitUiState = resolver.loadKSType(CircuitNames.CIRCUIT_UI_STATE.canonicalName)
val screen = resolver.loadKSType(CircuitNames.SCREEN.canonicalName)
val navigator = resolver.loadKSType(CircuitNames.NAVIGATOR.canonicalName)
val circuitContext = resolver.loadKSType(CircuitNames.CIRCUIT_CONTEXT.canonicalName)

private fun Resolver.loadKSType(name: String): KSType =
loadOptionalKSType(name) ?: error("Could not find $name in classpath")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@ class CircuitSymbolProcessorTest {
package test

import com.slack.circuit.codegen.annotations.CircuitInject
import com.slack.circuit.runtime.CircuitContext
import com.slack.circuit.runtime.ui.Ui
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
Expand All @@ -543,11 +544,12 @@ class CircuitSymbolProcessorTest {

class Favorites @AssistedInject constructor(
@Assisted private val screen: FavoritesScreen,
@Assisted private val circuitContext: CircuitContext,
) : Ui<FavoritesScreen.State> {
@CircuitInject(FavoritesScreen::class, AppScope::class)
@AssistedFactory
fun interface Factory {
fun create(screen: FavoritesScreen): Favorites
fun create(screen: FavoritesScreen, circuitContext: CircuitContext): Favorites
}

@Composable
Expand All @@ -574,7 +576,7 @@ class CircuitSymbolProcessorTest {
private val factory: Favorites.Factory,
) : Ui.Factory {
override fun create(screen: Screen, context: CircuitContext): Ui<*>? = when (screen) {
is FavoritesScreen -> factory.create(screen = screen)
is FavoritesScreen -> factory.create(screen = screen, circuitContext = context)
else -> null
}
}
Expand Down Expand Up @@ -962,6 +964,73 @@ class CircuitSymbolProcessorTest {
)
}

@Test
fun presenterClass_assistedInjectionWithCircuitContext() {
assertGeneratedFile(
sourceFile =
kotlin(
"TestPresenter.kt",
"""
package test

import com.slack.circuit.codegen.annotations.CircuitInject
import com.slack.circuit.runtime.CircuitContext
import com.slack.circuit.runtime.Navigator
import com.slack.circuit.runtime.presenter.Presenter
import androidx.compose.runtime.Composable
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject

class FavoritesPresenter @AssistedInject constructor(
@Assisted private val screen: FavoritesScreen,
@Assisted private val navigator: Navigator,
@Assisted private val circuitContext: CircuitContext
) : Presenter<FavoritesScreen.State> {
@CircuitInject(FavoritesScreen::class, AppScope::class)
@AssistedFactory
fun interface Factory {
fun create(screen: FavoritesScreen, navigator: Navigator, circuitContext: CircuitContext): FavoritesPresenter
}

@Composable
override fun present(): FavoritesScreen.State {
throw NotImplementedError()
}
}
"""
.trimIndent(),
),
generatedFilePath = "test/FavoritesPresenterFactory.kt",
expectedContent =
"""
package test

import com.slack.circuit.runtime.CircuitContext
import com.slack.circuit.runtime.Navigator
import com.slack.circuit.runtime.presenter.Presenter
import com.slack.circuit.runtime.screen.Screen
import com.squareup.anvil.annotations.ContributesMultibinding
import javax.inject.Inject

@ContributesMultibinding(AppScope::class)
public class FavoritesPresenterFactory @Inject constructor(
private val factory: FavoritesPresenter.Factory,
) : Presenter.Factory {
override fun create(
screen: Screen,
navigator: Navigator,
context: CircuitContext,
): Presenter<*>? = when (screen) {
is FavoritesScreen -> factory.create(screen = screen, navigator = navigator, circuitContext = context)
else -> null
}
}
"""
.trimIndent(),
)
}

@Test
fun hiltCodegenMode_skipsAnvilBinding() {
assertGeneratedFile(
Expand Down
Loading