diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt index 149b2dae8d0..9c57609547c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt @@ -120,6 +120,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() { FirValueClassDeclarationChecker, FirOuterClassArgumentsRequiredChecker, FirPropertyInitializationChecker, + FirDelegateFieldTypeMismatchChecker, ) override val constructorCheckers: Set diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDelegateFieldTypeMismatchChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDelegateFieldTypeMismatchChecker.kt new file mode 100644 index 00000000000..a262a55e633 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDelegateFieldTypeMismatchChecker.kt @@ -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, + ) + } + } + } +} diff --git a/compiler/testData/diagnostics/tests/delegationTypeMismatch.fir.kt b/compiler/testData/diagnostics/tests/delegationTypeMismatch.fir.kt deleted file mode 100644 index 0d19264dd55..00000000000 --- a/compiler/testData/diagnostics/tests/delegationTypeMismatch.fir.kt +++ /dev/null @@ -1,13 +0,0 @@ -// ISSUE: KT-55552 - -interface B2 { - fun d() -} - -class B - -open class C(b: B) : B2 by b {} //no error in K2, K1 - [TYPE_MISMATCH] Type mismatch: inferred type is B but B2 was expected - -fun main() { - val c = C(B()).d() //runtime AbstractMethodError -} diff --git a/compiler/testData/diagnostics/tests/delegationTypeMismatch.kt b/compiler/testData/diagnostics/tests/delegationTypeMismatch.kt index 3ef0359fd04..02e7d6f911a 100644 --- a/compiler/testData/diagnostics/tests/delegationTypeMismatch.kt +++ b/compiler/testData/diagnostics/tests/delegationTypeMismatch.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ISSUE: KT-55552 interface B2 { diff --git a/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/delegation.fir.kt b/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/delegation.fir.kt deleted file mode 100644 index 0f3f372bcce..00000000000 --- a/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/delegation.fir.kt +++ /dev/null @@ -1,18 +0,0 @@ -// FILE: J.java - -import org.jetbrains.annotations.*; -import java.util.*; - -public class J { - @NotNull - public static List staticNN; - @Nullable - public static List staticN; - public static List staticJ; -} - -// FILE: k.kt - -class A : List by J.staticNN -class B : List by J.staticN -class C : List by J.staticJ \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/delegation.kt b/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/delegation.kt index 5970a02c277..e237da4c9a8 100644 --- a/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/delegation.kt +++ b/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/delegation.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: J.java import org.jetbrains.annotations.*; diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/30.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/30.fir.kt index 51b9430afb5..39c7f27b128 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/30.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/30.fir.kt @@ -25,7 +25,7 @@ class Case4(val y: Any?): ClassWithCostructorParam(y!!) { } // TESTCASE NUMBER: 5 -class Case5(val y: Any?): ClassWithCostructorParam(y as Interface1), Interface1 by y {} +class Case5(val y: Any?): ClassWithCostructorParam(y as Interface1), Interface1 by y {} // TESTCASE NUMBER: 6 fun case_6(a: Int?) = object : ClassWithCostructorParam(a!!) {