From 5f625f3c167ad09a5f5989d88a66ae0020721f3a Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 11 Oct 2021 15:16:46 +0300 Subject: [PATCH] [FIR] Fail with error if multiple plugins generated classes with same classId In future we can turn this failure to some proper diagnostic --- .../extensions/FirExtensionDeclarationsSymbolProvider.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtensionDeclarationsSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtensionDeclarationsSymbolProvider.kt index a7008e97e83..ed519bef919 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtensionDeclarationsSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/extensions/FirExtensionDeclarationsSymbolProvider.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.caches.FirCachesFactory import org.jetbrains.kotlin.fir.caches.firCachesFactory import org.jetbrains.kotlin.fir.caches.getValue import org.jetbrains.kotlin.fir.declarations.validate +import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals import org.jetbrains.kotlin.fir.symbols.impl.* @@ -53,8 +54,12 @@ class FirExtensionDeclarationsSymbolProvider private constructor( // ------------------------------------------ generators ------------------------------------------ private fun generateClassLikeDeclaration(classId: ClassId): FirClassLikeSymbol<*>? { - // TODO: what we should do if multiple extensions want to generate class with same classId? - return extensions.firstNotNullOfOrNull { it.generateClassLikeDeclaration(classId) }?.also { it.fir.validate() } + val generatedClasses = extensions.mapNotNull { it.generateClassLikeDeclaration(classId) }.onEach { it.fir.validate() } + return when (generatedClasses.size) { + 0 -> null + 1 -> generatedClasses.first() + else -> error("Multiple plugins generated classes with same classId $classId\n${generatedClasses.joinToString("\n") { it.fir.render() }}") + } } private fun generateTopLevelFunctions(callableId: CallableId): List {