Hildebrandt Tobias
04/17/2024, 10:25 AMException during IR lowering
error and am a little bit stumped.
The relevant error part is this I presume:
Caused by: java.lang.RuntimeException: Exception while generating code for:
FUN GENERATED_DATA_CLASS_MEMBER name:copy visibility:public modality:FINAL <> ($this:<redacted>.server.domain.system.events.StreamUpdate.New<T of <redacted>.server.domain.system.events.StreamUpdate.New>, new:T of <redacted>.server.domain.system.events.StreamUpdate.New) returnType:<redacted>.server.domain.system.events.StreamUpdate.New<T of <redacted>.server.domain.system.events.StreamUpdate.New>
$this: VALUE_PARAMETER name:<this> type:<redacted>.server.domain.system.events.StreamUpdate.New<T of <redacted>.server.domain.system.events.StreamUpdate.New>
VALUE_PARAMETER name:new index:0 type:T of <redacted>.server.domain.system.events.StreamUpdate.New
EXPRESSION_BODY
ERROR_EXPR 'Default Stub' type=T of <redacted>.server.domain.system.events.StreamUpdate.New
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun copy (new: T of <redacted>.server.domain.system.events.StreamUpdate.New): <redacted>.server.domain.system.events.StreamUpdate.New<T of <redacted>.server.domain.system.events.StreamUpdate.New> declared in <redacted>.server.domain.system.events.StreamUpdate.New'
CONSTRUCTOR_CALL 'public constructor <init> ($context_receiver_0: <redacted>.server.domain.BaseService<T of <redacted>.server.domain.system.events.StreamUpdate.New>, new: T of <redacted>.server.domain.system.events.StreamUpdate.New) [primary] declared in <redacted>.server.domain.system.events.StreamUpdate.New' type=<redacted>.server.domain.system.events.StreamUpdate.New<T of <redacted>.server.domain.system.events.StreamUpdate.New> origin=null
<class: T>: T of <redacted>.server.domain.system.events.StreamUpdate.New
$context_receiver_0: GET_VAR 'new: T of <redacted>.server.domain.system.events.StreamUpdate.New declared in <redacted>.server.domain.system.events.StreamUpdate.New.copy' type=T of <redacted>.server.domain.system.events.StreamUpdate.New origin=null
Relevant Code:
enum class UpdateType {
NEW,
UPDATE,
MOVE,
REMOVE
}
sealed class StreamUpdate<T: Any>(val type: UpdateType, open val old: T? = null) {
context(BaseService<T>)
data class New<T: Any>(val new: T): StreamUpdate<T>(UpdateType.NEW)
context(BaseService<T>)
data class Update<T: Any>(val new: T, override val old: T? = null): StreamUpdate<T>(UpdateType.UPDATE, old ?: getRepository().getEntity(new))
// data class Move<T: Any>(val old: T, val new: T): MqttUpdate<T>(UpdateType.MOVE) // We might need this later
context(BaseService<T>)
data class Remove<T: Any>(override val old: T): StreamUpdate<T>(UpdateType.REMOVE, old)
}
object EventStream {
val logger = KotlinLogging.logger { }
val triggerMap = mutableMapOf<KType, PublishSubject<StreamUpdate<*>>>()
inline fun <reified T : Any>publish(update: StreamUpdate<T>) =
triggerMap
.getOrPut(typeOf<T>()) { PublishSubject.create() }
.onNext(update)
@Suppress("UNCHECKED_CAST")
inline fun <reified T : Any> subscribe(): Flowable<StreamUpdate<T>> =
triggerMap
.getOrPut(typeOf<T>()) { PublishSubject.create() }
.toFlowable(BackpressureStrategy.LATEST)
.filter {
// We don't need updates without changes.
if(it is StreamUpdate.Update)
it.old != it.new
else
true
}
.map { it as StreamUpdate<T> }
.distinctUntilChanged()
.doOnError { logger.error("StreamUpdate Error on Trigger ${typeOf<T>()}:", it) }
}
Sam
04/17/2024, 10:38 AMHildebrandt Tobias
04/17/2024, 10:39 AMHildebrandt Tobias
04/17/2024, 10:55 AMcontext(BaseService<T>)
from New
and Remove
it works.
I can keep it on Update
, it seems when the compiler has a problem when then receiver is unused.Sam
04/17/2024, 11:06 AMHildebrandt Tobias
04/17/2024, 11:16 AM