From 6a90926e2eeff469c0f00497db3e4c796adf0839 Mon Sep 17 00:00:00 2001 From: Roman Efremov Date: Mon, 20 Nov 2023 16:28:27 +0100 Subject: [PATCH] [K2] Support reporting of IMPLEMENTATION_BY_DELEGATION_IN_EXPECT_CLASS ^KT-59983 --- .../checkers/CommonDeclarationCheckers.kt | 1 + ...FirDelegationInExpectClassSyntaxChecker.kt | 54 +++++++++++++++++++ ...nheritanceByDelegationInExpectClass.fir.kt | 4 +- ...inheritanceByDelegationInExpectClass.ll.kt | 4 +- 4 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/syntax/FirDelegationInExpectClassSyntaxChecker.kt 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 7100164bedb..178d93723cc 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 @@ -126,6 +126,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() { FirOptInAnnotationClassChecker, FirCommonConstructorDelegationIssuesChecker, FirDelegationSuperCallInEnumConstructorChecker, + FirDelegationInExpectClassSyntaxChecker, FirDelegationInInterfaceSyntaxChecker, FirEnumClassSimpleChecker, FirLocalEntityNotAllowedChecker, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/syntax/FirDelegationInExpectClassSyntaxChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/syntax/FirDelegationInExpectClassSyntaxChecker.kt new file mode 100644 index 00000000000..7732f1d3cf3 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/syntax/FirDelegationInExpectClassSyntaxChecker.kt @@ -0,0 +1,54 @@ +/* + * Copyright 2010-2021 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.syntax + +import org.jetbrains.kotlin.* +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.utils.isExpect +import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.KtDelegatedSuperTypeEntry + +object FirDelegationInExpectClassSyntaxChecker : FirDeclarationSyntaxChecker() { + + override fun isApplicable(element: FirRegularClass, source: KtSourceElement): Boolean = element.isExpect + + override fun checkPsi( + element: FirRegularClass, + source: KtPsiSourceElement, + psi: KtClassOrObject, + context: CheckerContext, + reporter: DiagnosticReporter + ) { + for (superTypeRef in element.superTypeRefs) { + val superSource = superTypeRef.source ?: continue + val parent = superSource.psi?.parent as? KtDelegatedSuperTypeEntry ?: continue + reporter.reportOn(KtRealPsiSourceElement(parent), FirErrors.IMPLEMENTATION_BY_DELEGATION_IN_EXPECT_CLASS, context) + } + } + + override fun checkLightTree( + element: FirRegularClass, + source: KtLightSourceElement, + context: CheckerContext, + reporter: DiagnosticReporter + ) { + for (superTypeRef in element.superTypeRefs) { + val superSource = superTypeRef.source ?: continue + val parent = superSource.treeStructure.getParent(superSource.lighterASTNode) ?: continue + if (parent.tokenType == KtNodeTypes.DELEGATED_SUPER_TYPE_ENTRY) { + reporter.reportOn( + parent.toKtLightSourceElement(superSource.treeStructure), + FirErrors.IMPLEMENTATION_BY_DELEGATION_IN_EXPECT_CLASS, + context + ) + } + } + } +} diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/inheritanceByDelegationInExpectClass.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/inheritanceByDelegationInExpectClass.fir.kt index 87070ad9553..847807be755 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/inheritanceByDelegationInExpectClass.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/inheritanceByDelegationInExpectClass.fir.kt @@ -4,6 +4,6 @@ interface A class B : A -expect class Foo(b: B) : A by b +expect class Foo(b: B) : A by b -expect class Bar : A by B() +expect class Bar : A by B() diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/inheritanceByDelegationInExpectClass.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/inheritanceByDelegationInExpectClass.ll.kt index 864bba60d90..4f9383bb084 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/inheritanceByDelegationInExpectClass.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/inheritanceByDelegationInExpectClass.ll.kt @@ -4,6 +4,6 @@ interface A class B : A -expect class Foo(b: B) : A by b +expect class Foo(b: B) : A by b -expect class Bar : A by B() +expect class Bar : A by B()