[FIR] Fix false positive POSITIONED_VALUE_ARGUMENT_FOR_JAVA_ANNOTATION

The original Java checker has an early return in
case of `resultingDescriptor !is JavaClassConstructorDescriptor`.
It fires if the descriptor is
`TypeAliasConstructorDescriptor`, thus further
diagnostics are not reported.
This commit is contained in:
Nikolay Lunyak
2023-09-05 14:19:33 +03:00
committed by Space Team
parent 1efa9abf57
commit f434228244
7 changed files with 73 additions and 2 deletions
@@ -1413,6 +1413,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
runTest("compiler/testData/diagnostics/tests/UnitValue.kt");
}
@Test
@TestMetadata("unnamedArgsInJavaAnnotations.kt")
public void testUnnamedArgsInJavaAnnotations() throws Exception {
runTest("compiler/testData/diagnostics/tests/unnamedArgsInJavaAnnotations.kt");
}
@Test
@TestMetadata("unproperDefaultInitializationInTailrec.kt")
public void testUnproperDefaultInitializationInTailrec() throws Exception {
@@ -1413,6 +1413,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
runTest("compiler/testData/diagnostics/tests/UnitValue.kt");
}
@Test
@TestMetadata("unnamedArgsInJavaAnnotations.kt")
public void testUnnamedArgsInJavaAnnotations() throws Exception {
runTest("compiler/testData/diagnostics/tests/unnamedArgsInJavaAnnotations.kt");
}
@Test
@TestMetadata("unproperDefaultInitializationInTailrec.kt")
public void testUnproperDefaultInitializationInTailrec() throws Exception {
@@ -1413,6 +1413,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/tests/UnitValue.kt");
}
@Test
@TestMetadata("unnamedArgsInJavaAnnotations.kt")
public void testUnnamedArgsInJavaAnnotations() throws Exception {
runTest("compiler/testData/diagnostics/tests/unnamedArgsInJavaAnnotations.kt");
}
@Test
@TestMetadata("unproperDefaultInitializationInTailrec.kt")
public void testUnproperDefaultInitializationInTailrec() throws Exception {
@@ -1413,6 +1413,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
runTest("compiler/testData/diagnostics/tests/UnitValue.kt");
}
@Test
@TestMetadata("unnamedArgsInJavaAnnotations.kt")
public void testUnnamedArgsInJavaAnnotations() throws Exception {
runTest("compiler/testData/diagnostics/tests/unnamedArgsInJavaAnnotations.kt");
}
@Test
@TestMetadata("unproperDefaultInitializationInTailrec.kt")
public void testUnproperDefaultInitializationInTailrec() throws Exception {
@@ -12,11 +12,17 @@ import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.toClassLikeSymbol
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.toAnnotationClassLikeSymbol
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirWrappedArgumentExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedArgumentList
import org.jetbrains.kotlin.fir.resolve.dfa.symbol
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.coneTypeSafe
import org.jetbrains.kotlin.name.ClassId
@@ -34,8 +40,8 @@ object FirJavaAnnotationsChecker : FirAnnotationChecker() {
override fun check(expression: FirAnnotation, context: CheckerContext, reporter: DiagnosticReporter) {
if (context.containingDeclarations.lastOrNull()?.source?.kind != KtRealSourceElementKind) return
val callableSymbol = expression.annotationTypeRef.toRegularClassSymbol(context.session)
if (callableSymbol?.origin !is FirDeclarationOrigin.Java) return
val callableSymbol = expression.annotationTypeRef.toClassLikeSymbol(context.session) as? FirClassSymbol<*> ?: return
if (callableSymbol.origin !is FirDeclarationOrigin.Java) return
val lookupTag = expression.annotationTypeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag ?: return
javaToKotlinNameMap[lookupTag.classId]?.let { betterName ->
@@ -0,0 +1,35 @@
// FIR_IDENTICAL
// ISSUE: KT-61309
// ALLOW_KOTLIN_PACKAGE
// FILE: Test.java
package javacode;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Test {
Class<? extends Throwable> expected() default None.class;
long timeout() default 0L;
}
// FILE: test.kt
package kotlin.test
typealias Test = javacode.Test
// FILE: main.kt
import kotlin.test.Test
import java.io.IOException
@Test(IOException::class)
fun someTest() {}
@Test(expected = IOException::class)
fun someRest() {}
@@ -1413,6 +1413,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/UnitValue.kt");
}
@Test
@TestMetadata("unnamedArgsInJavaAnnotations.kt")
public void testUnnamedArgsInJavaAnnotations() throws Exception {
runTest("compiler/testData/diagnostics/tests/unnamedArgsInJavaAnnotations.kt");
}
@Test
@TestMetadata("unproperDefaultInitializationInTailrec.kt")
public void testUnproperDefaultInitializationInTailrec() throws Exception {