[FIR] KT-55552: Report type mismatch for delegated properties

^KT-55552 Fixed
This commit is contained in:
Nikolay Lunyak
2023-05-12 14:05:57 +03:00
committed by Space Team
parent 81d955a712
commit f94c795b5b
7 changed files with 49 additions and 32 deletions
@@ -120,6 +120,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
FirValueClassDeclarationChecker,
FirOuterClassArgumentsRequiredChecker,
FirPropertyInitializationChecker,
FirDelegateFieldTypeMismatchChecker,
)
override val constructorCheckers: Set<FirConstructorChecker>
@@ -0,0 +1,45 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.delegateFieldsMap
import org.jetbrains.kotlin.fir.expressions.FirCall
import org.jetbrains.kotlin.fir.expressions.calleeReference
import org.jetbrains.kotlin.fir.references.isError
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.fir.types.isSubtypeOf
object FirDelegateFieldTypeMismatchChecker : FirRegularClassChecker() {
@SymbolInternals
override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) {
for (it in declaration.superTypeRefs.indices) {
val supertype = declaration.superTypeRefs[it]
val field = declaration.delegateFieldsMap?.get(it)?.fir ?: continue
val initializer = field.initializer ?: continue
val isReportedByErrorNodeDiagnosticCollector = initializer is FirCall && initializer.calleeReference?.isError() == true
if (
!isReportedByErrorNodeDiagnosticCollector &&
!initializer.typeRef.coneType.isSubtypeOf(supertype.coneType, context.session, true)
) {
reporter.reportOn(
initializer.source,
FirErrors.TYPE_MISMATCH,
field.returnTypeRef.coneType,
initializer.typeRef.coneType,
false,
context,
)
}
}
}
}