[FIR][FE 1.0] KT-47933: Warn about redundant @Repeatable

Merge-request: KT-MR-7318
Merged-by: Nikolay Lunyak <Nikolay.Lunyak@jetbrains.com>
This commit is contained in:
Nikolay Lunyak
2022-10-07 13:33:49 +00:00
committed by Space Team
parent 6117cdc0c3
commit b6f950ed75
26 changed files with 220 additions and 12 deletions
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.analysis.api.fir
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
import org.jetbrains.kotlin.analysis.api.fir.annotations.fullyExpandedClassId
import org.jetbrains.kotlin.fir.declarations.fullyExpandedClassId
import org.jetbrains.kotlin.analysis.api.fir.annotations.mapAnnotationParameters
import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirAnnotationValueConverter
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotation
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.fullyExpandedClassId
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.name.ClassId
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotation
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.fullyExpandedClassId
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.customAnnotations
import org.jetbrains.kotlin.name.ClassId
@@ -90,6 +90,3 @@ internal fun mapAnnotationParameters(annotation: FirAnnotation, session: FirSess
return resultMap
}
internal fun FirAnnotation.fullyExpandedClassId(useSiteSession: FirSession): ClassId? =
coneClassLikeType?.fullyExpandedType(useSiteSession)?.classId
@@ -4178,6 +4178,14 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirJvmErrors.REDUNDANT_REPEATABLE_ANNOTATION) { firDiagnostic ->
RedundantRepeatableAnnotationImpl(
firDiagnostic.a,
firDiagnostic.b,
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirJvmErrors.LOCAL_JVM_RECORD) { firDiagnostic ->
LocalJvmRecordImpl(
firDiagnostic as KtPsiDiagnostic,
@@ -2908,6 +2908,12 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = PositionedValueArgumentForJavaAnnotation::class
}
abstract class RedundantRepeatableAnnotation : KtFirDiagnostic<KtAnnotationEntry>() {
override val diagnosticClass get() = RedundantRepeatableAnnotation::class
abstract val kotlinRepeatable: FqName
abstract val javaRepeatable: FqName
}
abstract class LocalJvmRecord : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = LocalJvmRecord::class
}
@@ -3514,6 +3514,13 @@ internal class PositionedValueArgumentForJavaAnnotationImpl(
override val token: KtLifetimeToken,
) : KtFirDiagnostic.PositionedValueArgumentForJavaAnnotation(), KtAbstractFirDiagnostic<KtExpression>
internal class RedundantRepeatableAnnotationImpl(
override val kotlinRepeatable: FqName,
override val javaRepeatable: FqName,
override val firDiagnostic: KtPsiDiagnostic,
override val token: KtLifetimeToken,
) : KtFirDiagnostic.RedundantRepeatableAnnotation(), KtAbstractFirDiagnostic<KtAnnotationEntry>
internal class LocalJvmRecordImpl(
override val firDiagnostic: KtPsiDiagnostic,
override val token: KtLifetimeToken,
@@ -34866,6 +34866,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/JvmSyntheticOnDelegate.kt");
}
@Test
@TestMetadata("multipleRepeatables.kt")
public void testMultipleRepeatables() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/multipleRepeatables.kt");
}
@Test
@TestMetadata("qualifiedCallValue.kt")
public void testQualifiedCallValue() throws Exception {
@@ -34866,6 +34866,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/JvmSyntheticOnDelegate.kt");
}
@Test
@TestMetadata("multipleRepeatables.kt")
public void testMultipleRepeatables() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/multipleRepeatables.kt");
}
@Test
@TestMetadata("qualifiedCallValue.kt")
public void testQualifiedCallValue() throws Exception {
@@ -34866,6 +34866,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/JvmSyntheticOnDelegate.kt");
}
@Test
@TestMetadata("multipleRepeatables.kt")
public void testMultipleRepeatables() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/multipleRepeatables.kt");
}
@Test
@TestMetadata("qualifiedCallValue.kt")
public void testQualifiedCallValue() throws Exception {
@@ -79,6 +79,11 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") {
val JVM_PACKAGE_NAME_NOT_SUPPORTED_IN_FILES_WITH_CLASSES by error<KtAnnotationEntry>()
val POSITIONED_VALUE_ARGUMENT_FOR_JAVA_ANNOTATION by error<KtExpression>()
val REDUNDANT_REPEATABLE_ANNOTATION by warning<KtAnnotationEntry> {
parameter<FqName>("kotlinRepeatable")
parameter<FqName>("javaRepeatable")
}
}
val SUPER by object : DiagnosticGroup("Super") {
@@ -71,6 +71,7 @@ object FirJvmErrors {
val JVM_PACKAGE_NAME_MUST_BE_VALID_NAME by error0<KtAnnotationEntry>()
val JVM_PACKAGE_NAME_NOT_SUPPORTED_IN_FILES_WITH_CLASSES by error0<KtAnnotationEntry>()
val POSITIONED_VALUE_ARGUMENT_FOR_JAVA_ANNOTATION by error0<KtExpression>()
val REDUNDANT_REPEATABLE_ANNOTATION by warning2<KtAnnotationEntry, FqName, FqName>()
// Super
val SUPER_CALL_WITH_DEFAULT_PARAMETERS by error1<PsiElement, String>()
@@ -67,6 +67,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.OVERLOADS_
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.OVERRIDE_CANNOT_BE_STATIC
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.POSITIONED_VALUE_ARGUMENT_FOR_JAVA_ANNOTATION
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.REDUNDANT_REPEATABLE_ANNOTATION
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.REPEATABLE_ANNOTATION_HAS_NESTED_CLASS_NAMED_CONTAINER
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.REPEATABLE_CONTAINER_HAS_NON_DEFAULT_PARAMETER
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.REPEATABLE_CONTAINER_HAS_SHORTER_RETENTION
@@ -285,6 +286,12 @@ object FirJvmErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
JAVA_SAM_INTERFACE_CONSTRUCTOR_REFERENCE,
"Java SAM interface constructor references are prohibited"
)
map.put(
REDUNDANT_REPEATABLE_ANNOTATION,
"Please, remove the ''{0}'' annotation, as ''{1}'' is already enough",
TO_STRING,
TO_STRING,
)
map.checkMissingMessages(FirJvmErrors)
}
@@ -18,6 +18,7 @@ object JvmDeclarationCheckers : DeclarationCheckers() {
FirJvmStaticChecker,
FirRepeatableAnnotationChecker,
FirJvmInvalidAndDangerousCharactersChecker,
FirJvmRedundantRepeatableChecker,
)
override val classCheckers: Set<FirClassChecker>
@@ -0,0 +1,40 @@
/*
* Copyright 2010-2022 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.jvm.checkers.declaration
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.checkers.declaration.FirBasicDeclarationChecker
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.classId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.StandardClassIds.Annotations.Repeatable
import org.jetbrains.kotlin.name.StandardClassIds.Annotations.JvmRepeatable
import org.jetbrains.kotlin.name.StandardClassIds.Annotations.Java
object FirJvmRedundantRepeatableChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
val kotlinRepeatable = declaration.annotations.find { it.fullyExpandedClassId(context.session) == Repeatable }
val javaRepeatable = declaration.annotations.find {
val expandedClassId = it.fullyExpandedClassId(context.session)
expandedClassId == JvmRepeatable || expandedClassId == Java.Repeatable
}
if (kotlinRepeatable != null && javaRepeatable != null) {
reporter.reportOn(
kotlinRepeatable.source,
FirJvmErrors.REDUNDANT_REPEATABLE_ANNOTATION,
kotlinRepeatable.classId?.asSingleFqName() ?: FqName.ROOT,
javaRepeatable.classId?.asSingleFqName() ?: FqName.ROOT,
context
)
}
}
}
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclaratio
import org.jetbrains.kotlin.fir.analysis.checkers.getAllowedAnnotationTargets
import org.jetbrains.kotlin.fir.analysis.checkers.getAnnotationRetention
import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
import org.jetbrains.kotlin.fir.analysis.jvm.checkers.isJvm6
import org.jetbrains.kotlin.fir.declarations.*
@@ -24,6 +25,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.classId
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.resolve.defaultType
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.scopes.getSingleClassifier
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
@@ -51,7 +53,8 @@ object FirRepeatableAnnotationChecker : FirBasicDeclarationChecker() {
val annotationClass = session.symbolProvider.getClassLikeSymbolByClassId(annotationClassId) ?: continue
val useSiteTarget = annotation.useSiteTarget
val existingTargetsForAnnotation = annotationsMap.getOrPut(annotation.annotationTypeRef.coneType) { arrayListOf() }
val expandedType = annotation.annotationTypeRef.coneType.fullyExpandedType(context.session)
val existingTargetsForAnnotation = annotationsMap.getOrPut(expandedType) { arrayListOf() }
val duplicateAnnotation = useSiteTarget in existingTargetsForAnnotation ||
existingTargetsForAnnotation.any { (it == null) != (useSiteTarget == null) }
@@ -185,7 +185,8 @@ fun checkRepeatedAnnotation(
for (annotation in annotations) {
val useSiteTarget = annotation.useSiteTarget ?: annotationContainer?.getDefaultUseSiteTarget(annotation, context)
val existingTargetsForAnnotation = annotationsMap.getOrPut(annotation.annotationTypeRef.coneType) { arrayListOf() }
val expandedType = annotation.annotationTypeRef.coneType.fullyExpandedType(context.session)
val existingTargetsForAnnotation = annotationsMap.getOrPut(expandedType) { arrayListOf() }
checkRepeatedAnnotation(useSiteTarget, existingTargetsForAnnotation, annotation, context, reporter)
existingTargetsForAnnotation.add(useSiteTarget)
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.resolvedSymbol
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
@@ -223,3 +224,6 @@ fun hasLowPriorityAnnotation(annotations: List<FirAnnotation>) = annotations.any
val lookupTag = it.annotationTypeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag ?: return@any false
lookupTag.classId == LOW_PRIORITY_IN_OVERLOAD_RESOLUTION_CLASS_ID
}
fun FirAnnotation.fullyExpandedClassId(useSiteSession: FirSession): ClassId? =
coneClassLikeType?.fullyExpandedType(useSiteSession)?.classId
@@ -12,10 +12,7 @@ import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.descriptors.annotations.KotlinRetention
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
import org.jetbrains.kotlin.descriptors.annotations.*
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.lexer.KtTokens
@@ -73,6 +70,15 @@ class RepeatableAnnotationChecker(
javaRepeatable != null -> checkJavaRepeatableAnnotationDeclaration(javaRepeatable, annotationClass, trace)
kotlinRepeatable != null -> checkKotlinRepeatableAnnotationDeclaration(kotlinRepeatable, annotationClass, trace)
}
if (javaRepeatable != null && kotlinRepeatable != null) {
trace.report(
ErrorsJvm.REDUNDANT_REPEATABLE_ANNOTATION.on(
kotlinRepeatable.entry,
kotlinRepeatable.descriptor.abbreviationFqName ?: FqName.ROOT,
javaRepeatable.descriptor.abbreviationFqName ?: FqName.ROOT,
)
)
}
}
}
}
@@ -232,6 +232,9 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension {
MAP.put(JAVA_SAM_INTERFACE_CONSTRUCTOR_REFERENCE, "Java SAM interface constructor references are prohibited");
MAP.put(ENUM_DECLARING_CLASS_DEPRECATED, "Enum.declaringClass is deprecated, use declaringJavaClass instead or cast receiver to java.lang.Enum explicitly");
MAP.put(REDUNDANT_REPEATABLE_ANNOTATION,
"Please, remove the ''{0}'' annotation, as ''{1}'' is already enough", TO_STRING, TO_STRING);
}
@NotNull
@@ -210,6 +210,8 @@ public interface ErrorsJvm {
DiagnosticFactoryForDeprecation0<PsiElement> ENUM_DECLARING_CLASS_DEPRECATED =
DiagnosticFactoryForDeprecation0.create(LanguageFeature.ProhibitEnumDeclaringClass);
DiagnosticFactory2<KtAnnotationEntry, FqName, FqName> REDUNDANT_REPEATABLE_ANNOTATION = DiagnosticFactory2.create(WARNING);
@SuppressWarnings("UnusedDeclaration")
Object _initializer = new Object() {
{
@@ -14,7 +14,7 @@ annotation class B1 {
}
annotation class D1(val value: Array<B1>)
@Repeatable
<!REDUNDANT_REPEATABLE_ANNOTATION!>@Repeatable<!>
@java.lang.annotation.Repeatable(D2::class)
annotation class B2 {
class Container
@@ -14,7 +14,7 @@ annotation class B1 {
}
annotation class D1(val value: Array<B1>)
@Repeatable
<!REDUNDANT_REPEATABLE_ANNOTATION!>@Repeatable<!>
@java.lang.annotation.Repeatable(D2::class)
annotation class B2 {
class Container
@@ -0,0 +1,27 @@
// FIR_IDENTICAL
// FULL_JDK
<!REDUNDANT_REPEATABLE_ANNOTATION!>@kotlin.annotation.Repeatable<!>
@java.lang.annotation.Repeatable(AContainer::class)
annotation class A
annotation class AContainer(val value: Array<A>)
<!REDUNDANT_REPEATABLE_ANNOTATION!>@kotlin.annotation.Repeatable<!>
@kotlin.jvm.JvmRepeatable(BContainer::class)
annotation class B
annotation class BContainer(val value: Array<B>)
<!REDUNDANT_REPEATABLE_ANNOTATION!>@kotlin.annotation.Repeatable<!>
<!REPEATED_ANNOTATION!>@kotlin.annotation.Repeatable<!>
@kotlin.jvm.JvmRepeatable(CContainer::class)
<!REPEATED_ANNOTATION!>@java.lang.annotation.Repeatable(CContainer::class)<!>
annotation class C
annotation class CContainer(val value: Array<C>)
typealias AlphaRepeatable = kotlin.annotation.Repeatable
typealias BetaRepeatable = kotlin.jvm.JvmRepeatable
<!REDUNDANT_REPEATABLE_ANNOTATION!>@AlphaRepeatable<!>
@BetaRepeatable(DContainer::class)
annotation class D
annotation class DContainer(val value: Array<D>)
@@ -0,0 +1,64 @@
package
@kotlin.annotation.Repeatable @java.lang.annotation.Repeatable(value = AContainer::class) public final annotation class A : kotlin.Annotation {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final annotation class AContainer : kotlin.Annotation {
public constructor AContainer(/*0*/ value: kotlin.Array<A>)
public final val value: kotlin.Array<A>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@kotlin.annotation.Repeatable @kotlin.jvm.JvmRepeatable /* = java.lang.annotation.Repeatable */(value = BContainer::class) public final annotation class B : kotlin.Annotation {
public constructor B()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final annotation class BContainer : kotlin.Annotation {
public constructor BContainer(/*0*/ value: kotlin.Array<B>)
public final val value: kotlin.Array<B>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@kotlin.annotation.Repeatable @kotlin.annotation.Repeatable @kotlin.jvm.JvmRepeatable /* = java.lang.annotation.Repeatable */(value = CContainer::class) @java.lang.annotation.Repeatable(value = CContainer::class) public final annotation class C : kotlin.Annotation {
public constructor C()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final annotation class CContainer : kotlin.Annotation {
public constructor CContainer(/*0*/ value: kotlin.Array<C>)
public final val value: kotlin.Array<C>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@AlphaRepeatable /* = kotlin.annotation.Repeatable */ @BetaRepeatable /* = java.lang.annotation.Repeatable */(value = DContainer::class) public final annotation class D : kotlin.Annotation {
public constructor D()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final annotation class DContainer : kotlin.Annotation {
public constructor DContainer(/*0*/ value: kotlin.Array<D>)
public final val value: kotlin.Array<D>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public typealias AlphaRepeatable = kotlin.annotation.Repeatable
public typealias BetaRepeatable = kotlin.jvm.JvmRepeatable
@@ -34956,6 +34956,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/JvmSyntheticOnDelegate.kt");
}
@Test
@TestMetadata("multipleRepeatables.kt")
public void testMultipleRepeatables() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/multipleRepeatables.kt");
}
@Test
@TestMetadata("qualifiedCallValue.kt")
public void testQualifiedCallValue() throws Exception {