diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 0295c7f5624..97d3ce9e651 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -245,10 +245,10 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList { group("Redeclarations") { val MANY_COMPANION_OBJECTS by error() val CONFLICTING_OVERLOADS by error(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) { - parameter("conflictingOverloads") // TODO use Collection instead of String + parameter>>("conflictingOverloads") } val REDECLARATION by error() { - parameter("conflictingDeclaration") // TODO use Collection instead of String + parameter>>("conflictingDeclarations") } val ANY_METHOD_IMPLEMENTED_IN_INTERFACE by error() } diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 3c2f2f618f8..43d304be839 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -178,8 +178,8 @@ object FirErrors { // Redeclarations val MANY_COMPANION_OBJECTS by error0() - val CONFLICTING_OVERLOADS by error1(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) - val REDECLARATION by error1() + val CONFLICTING_OVERLOADS by error1>>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) + val REDECLARATION by error1>>() val ANY_METHOD_IMPLEMENTED_IN_INTERFACE by error0() // Invalid local declarations diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConflictsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConflictsChecker.kt index 4613251a767..76b4cd225ee 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConflictsChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConflictsChecker.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration +import org.jetbrains.kotlin.fir.FirSymbolOwner import org.jetbrains.kotlin.fir.analysis.checkers.FirDeclarationInspector import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter @@ -13,6 +14,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol object FirConflictsChecker : FirBasicDeclarationChecker() { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { @@ -24,22 +26,22 @@ object FirConflictsChecker : FirBasicDeclarationChecker() { else -> return } - inspector.functionDeclarations.forEachNonSingle { it, hint -> - reporter.reportOn(it.source, FirErrors.CONFLICTING_OVERLOADS, hint, context) + inspector.functionDeclarations.forEachNonSingle { it, symbols -> + reporter.reportOn(it.source, FirErrors.CONFLICTING_OVERLOADS, symbols, context) } - inspector.otherDeclarations.forEachNonSingle { it, hint -> - reporter.reportOn(it.source, FirErrors.REDECLARATION, hint, context) + inspector.otherDeclarations.forEachNonSingle { it, symbols -> + reporter.reportOn(it.source, FirErrors.REDECLARATION, symbols, context) } } - private fun Map>.forEachNonSingle(action: (FirDeclaration, String) -> Unit) { + private fun Map>.forEachNonSingle(action: (FirDeclaration, Collection>) -> Unit) { for (value in values) { if (value.size > 1) { - val hint = value.joinToString { that -> that.toString() } + val symbols = value.mapNotNull { (it as? FirSymbolOwner<*>)?.symbol } value.forEach { - action(it, hint) + action(it, symbols) } } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt index e2bcc0e751c..02a7a799985 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt @@ -402,8 +402,8 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension { // Redeclarations map.put(MANY_COMPANION_OBJECTS, "Only one companion object is allowed per class") - map.put(CONFLICTING_OVERLOADS, "Conflicting overloads: {0}", TO_STRING) // * - map.put(REDECLARATION, "Conflicting declarations: {0}", TO_STRING) // * + map.put(CONFLICTING_OVERLOADS, "Conflicting overloads: {0}", SYMBOLS) // * + map.put(REDECLARATION, "Conflicting declarations: {0}", SYMBOLS) // * map.put(ANY_METHOD_IMPLEMENTED_IN_INTERFACE, "An interface may not implement a method of 'Any'") // & // Invalid local declarations diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt index b0627cd5e12..4f8c8b6b190 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt @@ -32,7 +32,7 @@ object FirDiagnosticRenderers { } val SYMBOLS = Renderer { symbols: Collection> -> - symbols.joinToString(prefix = "[", postfix = "]", separator = ",", limit = 3, truncated = "...") { symbol -> + symbols.joinToString(prefix = "[", postfix = "]", separator = ", ", limit = 3, truncated = "...") { symbol -> SYMBOL.render(symbol) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index 31da6df9c5a..12e35474fc9 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -731,14 +731,18 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.CONFLICTING_OVERLOADS) { firDiagnostic -> ConflictingOverloadsImpl( - firDiagnostic.a, + firDiagnostic.a.map { abstractFirBasedSymbol -> + firSymbolBuilder.buildSymbol(abstractFirBasedSymbol.fir as FirDeclaration) + }, firDiagnostic as FirPsiDiagnostic<*>, token, ) } add(FirErrors.REDECLARATION) { firDiagnostic -> RedeclarationImpl( - firDiagnostic.a, + firDiagnostic.a.map { abstractFirBasedSymbol -> + firSymbolBuilder.buildSymbol(abstractFirBasedSymbol.fir as FirDeclaration) + }, firDiagnostic as FirPsiDiagnostic<*>, token, ) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index 7a6b74440a1..1a7aca65037 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -521,12 +521,12 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract class ConflictingOverloads : KtFirDiagnostic() { override val diagnosticClass get() = ConflictingOverloads::class - abstract val conflictingOverloads: String + abstract val conflictingOverloads: List } abstract class Redeclaration : KtFirDiagnostic() { override val diagnosticClass get() = Redeclaration::class - abstract val conflictingDeclaration: String + abstract val conflictingDeclarations: List } abstract class AnyMethodImplementedInInterface : KtFirDiagnostic() { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index cef054dea64..15b225a8cd3 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -830,7 +830,7 @@ internal class ManyCompanionObjectsImpl( } internal class ConflictingOverloadsImpl( - override val conflictingOverloads: String, + override val conflictingOverloads: List, firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken, ) : KtFirDiagnostic.ConflictingOverloads(), KtAbstractFirDiagnostic { @@ -838,7 +838,7 @@ internal class ConflictingOverloadsImpl( } internal class RedeclarationImpl( - override val conflictingDeclaration: String, + override val conflictingDeclarations: List, firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken, ) : KtFirDiagnostic.Redeclaration(), KtAbstractFirDiagnostic {