import kotlin.contracts.* class FirAnnotationArgumentMappingBuilder { val mapping: MutableMap = mutableMapOf() fun build(): FirAnnotationArgumentMapping { return FirAnnotationArgumentMapping(mapping) } } @OptIn(ExperimentalContracts::class) fun buildAnnotationArgumentMapping(init: FirAnnotationArgumentMappingBuilder.() -> Unit): FirAnnotationArgumentMapping { contract { callsInPlace(init, InvocationKind.EXACTLY_ONCE) } return FirAnnotationArgumentMappingBuilder().apply(init).build() } class FirAnnotationArgumentMapping(mapping: Map) class ValueParameter(val name: String) class Argument(val name: String) fun createArgumentMapping( valueParameters: List?, arguments: List ): FirAnnotationArgumentMapping { return buildAnnotationArgumentMapping build@{ val parameterByName: Map? by lazy { val valueParameters = valueParameters ?: return@lazy null valueParameters.associateBy { it.name } } arguments.mapNotNull { val name = it.name val value = parameterByName?.get(name)?.name ?: return@mapNotNull null name to value }.toMap(mapping) } }