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 c766777b82d..6c21410b410 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 @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.impl.FirOuterClassTypeParameterRef import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.getOuterClass import org.jetbrains.kotlin.fir.scopes.PACKAGE_MEMBER @@ -26,7 +27,6 @@ import org.jetbrains.kotlin.fir.util.ListMultimap import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.name.SpecialNames.UNDERSCORE_FOR_UNUSED_VAR import org.jetbrains.kotlin.utils.SmartSet object FirConflictsChecker : FirBasicDeclarationChecker() { @@ -217,11 +217,8 @@ object FirConflictsChecker : FirBasicDeclarationChecker() { when (declaration) { is FirFile -> checkFile(declaration, inspector, context) is FirRegularClass -> checkRegularClass(declaration, inspector) - is FirFunction -> { - checkConflictingValueParameters(declaration, context, reporter) - return + else -> { } - else -> return } inspector.declarationConflictingSymbols.forEach { (conflictingDeclaration, symbols) -> @@ -246,24 +243,61 @@ object FirConflictsChecker : FirBasicDeclarationChecker() { } } } + + if (declaration.source?.kind !is FirFakeSourceElementKind) { + when (declaration) { + is FirMemberDeclaration -> { + if (declaration is FirFunction) { + checkConflictingParameters(declaration.valueParameters, context, reporter) + } + checkConflictingParameters(declaration.typeParameters, context, reporter) + } + is FirTypeParametersOwner -> { + checkConflictingParameters(declaration.typeParameters, context, reporter) + } + else -> { + } + } + } } - private fun checkConflictingValueParameters(function: FirFunction, context: CheckerContext, reporter: DiagnosticReporter) { - val multimap = ListMultimap() - for (parameter in function.valueParameters) { - if (!parameter.name.isSpecial) { - multimap.put(parameter.name, parameter) + private fun checkConflictingParameters(parameters: List, context: CheckerContext, reporter: DiagnosticReporter) { + if (parameters.size <= 1) return + + val multimap = ListMultimap>() + for (parameter in parameters) { + val name: Name + val symbol: FirBasedSymbol<*> + when (parameter) { + is FirValueParameter -> { + symbol = parameter.symbol + name = parameter.name + } + is FirOuterClassTypeParameterRef -> { + continue + } + is FirTypeParameterRef -> { + symbol = parameter.symbol + name = symbol.name + } + is FirTypeParameter -> { + symbol = parameter.symbol + name = parameter.name + } + else -> throw AssertionError("Invalid parameter type") + } + if (!name.isSpecial) { + multimap.put(name, symbol) } } for (key in multimap.keys) { - val parameters = multimap[key] - if (parameters.size > 1) { - val symbols = parameters.map { it.symbol } - for (parameter in parameters) { + val conflictingParameters = multimap[key] + if (conflictingParameters.size > 1) { + for (parameter in conflictingParameters) { reporter.reportOn( parameter.source, FirErrors.REDECLARATION, - symbols, + conflictingParameters, context ) } diff --git a/compiler/testData/diagnostics/tests/dataClasses/repeatedProperties.fir.kt b/compiler/testData/diagnostics/tests/dataClasses/repeatedProperties.fir.kt new file mode 100644 index 00000000000..9e4927535c8 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataClasses/repeatedProperties.fir.kt @@ -0,0 +1,9 @@ +data class A1(val x: Int, val y: String, val x: Int) { + val z = "" +} + +data class A2(val x: Int, val y: String) { + val x = "" +} + +data class A3(val :Int, val : Int) diff --git a/compiler/testData/diagnostics/tests/dataClasses/repeatedProperties.kt b/compiler/testData/diagnostics/tests/dataClasses/repeatedProperties.kt index 62ddb6226aa..5713d718dcf 100644 --- a/compiler/testData/diagnostics/tests/dataClasses/repeatedProperties.kt +++ b/compiler/testData/diagnostics/tests/dataClasses/repeatedProperties.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL data class A1(val x: Int, val y: String, val x: Int) { val z = "" } diff --git a/compiler/testData/diagnostics/tests/redeclarations/RedeclaredTypeParameters.fir.kt b/compiler/testData/diagnostics/tests/redeclarations/RedeclaredTypeParameters.fir.kt index ed1cc72fc2a..0199df540d7 100644 --- a/compiler/testData/diagnostics/tests/redeclarations/RedeclaredTypeParameters.fir.kt +++ b/compiler/testData/diagnostics/tests/redeclarations/RedeclaredTypeParameters.fir.kt @@ -1,6 +1,6 @@ -fun Pair() {} +fun <T, T> Pair() {} -class P {} +class P<T, T> {} -val T.foo : Int - get() = 1 \ No newline at end of file +val <T, T> T.foo : Int + get() = 1 diff --git a/compiler/testData/diagnostics/tests/redeclarations/interfaceTypeParameters.fir.kt b/compiler/testData/diagnostics/tests/redeclarations/interfaceTypeParameters.fir.kt deleted file mode 100644 index 774f0c684ca..00000000000 --- a/compiler/testData/diagnostics/tests/redeclarations/interfaceTypeParameters.fir.kt +++ /dev/null @@ -1,6 +0,0 @@ -interface Test1 -interface Test2 - -class Outer { - interface TestNested -} diff --git a/compiler/testData/diagnostics/tests/redeclarations/interfaceTypeParameters.kt b/compiler/testData/diagnostics/tests/redeclarations/interfaceTypeParameters.kt index 25c3a42c108..7ff8c020b58 100644 --- a/compiler/testData/diagnostics/tests/redeclarations/interfaceTypeParameters.kt +++ b/compiler/testData/diagnostics/tests/redeclarations/interfaceTypeParameters.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface Test1<T, T> interface Test2<X, Y, X>