[FIR] KT-56769: Ensure @receiver: is only allowed on receivers
Note that there's no code that checks that FirReceiverParameter's annotation's use-site target is indeed `@receiver:`, because otherwise the annotation wouldn't have made it into the FirReceiverParameter. In contrast, in K1 all such annotations are treated as annotations on a KtTypeReference. ^KT-56769 Fixed
This commit is contained in:
committed by
Space Team
parent
174f39aa46
commit
93ba0c3e70
+6
@@ -519,6 +519,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
|
||||
runTest("compiler/testData/diagnostics/tests/kt56723.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt56769.kt")
|
||||
public void testKt56769() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/kt56769.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("LValueAssignment.kt")
|
||||
public void testLValueAssignment() throws Exception {
|
||||
|
||||
+6
@@ -519,6 +519,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
|
||||
runTest("compiler/testData/diagnostics/tests/kt56723.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt56769.kt")
|
||||
public void testKt56769() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/kt56769.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("LValueAssignment.kt")
|
||||
public void testLValueAssignment() throws Exception {
|
||||
|
||||
+11
-1
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.fir.analysis.checkers.type
|
||||
|
||||
import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
||||
@@ -24,10 +25,19 @@ object FirTypeAnnotationChecker : FirTypeRefChecker() {
|
||||
|
||||
for (annotation in typeRef.annotations) {
|
||||
if (annotation.source == null) continue
|
||||
val useSiteTarget = annotation.useSiteTarget
|
||||
|
||||
// Annotations with `@receiver:` go
|
||||
// into FirReceiverParameter, not FirTypeRef
|
||||
if (useSiteTarget == AnnotationUseSiteTarget.RECEIVER) {
|
||||
reporter.reportOn(
|
||||
annotation.source, FirErrors.WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET,
|
||||
"type usage", useSiteTarget.renderName, context
|
||||
)
|
||||
}
|
||||
|
||||
val annotationTargets = annotation.getAllowedAnnotationTargets(context.session)
|
||||
if (KotlinTarget.TYPE !in annotationTargets) {
|
||||
val useSiteTarget = annotation.useSiteTarget
|
||||
if (useSiteTarget == null || KotlinTarget.USE_SITE_MAPPING[useSiteTarget] !in annotationTargets) {
|
||||
reporter.reportOn(annotation.source, FirErrors.WRONG_ANNOTATION_TARGET, "type usage", context)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user