From 6f45ff4017fc5bfafb355469089871aea82cb9ed Mon Sep 17 00:00:00 2001 From: Ross Anderson Date: Thu, 27 Aug 2026 12:51:11 +0100 Subject: [PATCH] Fix: project container/broadcast Publisher params as out to match Active BindActiveContainer and BindBroadcast generated Publisher> /Publisher> parameters without the use-site out that BindActive already applies, so a caller's Publisher> didn't fit despite ContainerEvent/BroadcastEvent being covariant. --- buildSrc/src/main/kotlin/ActiveContainer.kt | 11 ++++++++--- buildSrc/src/main/kotlin/Broadcast.kt | 6 +++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/buildSrc/src/main/kotlin/ActiveContainer.kt b/buildSrc/src/main/kotlin/ActiveContainer.kt index 50bb053..8100342 100644 --- a/buildSrc/src/main/kotlin/ActiveContainer.kt +++ b/buildSrc/src/main/kotlin/ActiveContainer.kt @@ -7,6 +7,7 @@ import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy import com.squareup.kotlinpoet.PropertySpec import com.squareup.kotlinpoet.STRING import com.squareup.kotlinpoet.TypeName +import com.squareup.kotlinpoet.WildcardTypeName import com.squareup.kotlinpoet.asClassName object ActiveContainer : FunctionProvider { @@ -37,10 +38,14 @@ object ActiveContainer : FunctionProvider { .defaultValue("ConfigBlock {}") .build() + val projectedContainerEventTypeName = + if (publisherType.requiresProjection) WildcardTypeName.producerOf(containerEventTypeName) + else containerEventTypeName + val publisherParameter = ParameterSpec.builder( "publisher", - publisherType.className.parameterizedBy(containerEventTypeName), + publisherType.className.parameterizedBy(projectedContainerEventTypeName), ) .build() @@ -48,7 +53,7 @@ object ActiveContainer : FunctionProvider { ParameterSpec.builder( "supplier", requestSupplierClassName.parameterizedBy( - publisherType.className.parameterizedBy(containerEventTypeName), + publisherType.className.parameterizedBy(projectedContainerEventTypeName), ), ) .build() @@ -97,7 +102,7 @@ object ActiveContainer : FunctionProvider { ParameterSpec.builder( "supplier", pathVariablesSupplierClassName.parameterizedBy( - publisherType.className.parameterizedBy(containerEventTypeName), + publisherType.className.parameterizedBy(projectedContainerEventTypeName), ), ) .build() diff --git a/buildSrc/src/main/kotlin/Broadcast.kt b/buildSrc/src/main/kotlin/Broadcast.kt index 03af4d7..60da63a 100644 --- a/buildSrc/src/main/kotlin/Broadcast.kt +++ b/buildSrc/src/main/kotlin/Broadcast.kt @@ -29,10 +29,14 @@ object Broadcast : FunctionProvider { .defaultValue("ConfigBlock {}") .build() + val projectedBroadcastEvent = + if (publisherType.requiresProjection) WildcardTypeName.producerOf(broadcastEvent) + else broadcastEvent + val broadcastEventPublisherParameter = ParameterSpec.builder( "publisher", - publisherType.className.parameterizedBy(broadcastEvent), + publisherType.className.parameterizedBy(projectedBroadcastEvent), ) .build()