From 963e430b421d4cc6ae2a794cf47daecd21588777 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Wed, 28 Feb 2018 14:36:32 +0300 Subject: [PATCH] Make "Add annotation target" available on use-site annotation So #KT-22861 Fixed So #KT-22862 Fixed --- .../kotlin/resolve/AnnotationChecker.kt | 4 +- .../idea/quickfix/AddAnnotationTargetFix.kt | 24 ++++++- .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 2 +- .../quickfix/addAnnotationTarget/file.kt | 6 ++ .../addAnnotationTarget/file.kt.after | 6 ++ .../addAnnotationTarget/use-site_delegate.kt | 7 ++ .../use-site_delegate.kt.after | 7 ++ .../addAnnotationTarget/use-site_field.kt | 5 ++ .../use-site_field.kt.after | 5 ++ .../addAnnotationTarget/use-site_file.kt | 5 ++ .../use-site_file.kt.after | 5 ++ .../addAnnotationTarget/use-site_get.kt | 5 ++ .../addAnnotationTarget/use-site_get.kt.after | 5 ++ .../addAnnotationTarget/use-site_invalid.kt | 9 +++ .../addAnnotationTarget/use-site_param.kt | 5 ++ .../use-site_param.kt.after | 5 ++ .../addAnnotationTarget/use-site_property.kt | 5 ++ .../use-site_property.kt.after | 5 ++ .../addAnnotationTarget/use-site_receiver.kt | 7 ++ .../use-site_receiver.kt.after | 7 ++ .../addAnnotationTarget/use-site_set.kt | 5 ++ .../addAnnotationTarget/use-site_set.kt.after | 5 ++ .../addAnnotationTarget/use-site_setparam.kt | 9 +++ .../use-site_setparam.kt.after | 9 +++ .../idea/quickfix/QuickFixTestGenerated.java | 66 +++++++++++++++++++ 25 files changed, 217 insertions(+), 6 deletions(-) create mode 100644 idea/testData/quickfix/addAnnotationTarget/file.kt create mode 100644 idea/testData/quickfix/addAnnotationTarget/file.kt.after create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_delegate.kt create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_delegate.kt.after create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_field.kt create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_field.kt.after create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_file.kt create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_file.kt.after create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_get.kt create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_get.kt.after create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_invalid.kt create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_param.kt create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_param.kt.after create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_property.kt create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_property.kt.after create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_receiver.kt create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_receiver.kt.after create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_set.kt create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_set.kt.after create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_setparam.kt create mode 100644 idea/testData/quickfix/addAnnotationTarget/use-site_setparam.kt.after diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt index d63d926ae1d..c03bf82d761 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt @@ -229,7 +229,7 @@ class AnnotationChecker( private fun DeclarationDescriptor?.hasBackingField(bindingTrace: BindingTrace) = (this as? PropertyDescriptor)?.let { bindingTrace.get(BindingContext.BACKING_FIELD_REQUIRED, it) } ?: false - private fun getActualTargetList(annotated: KtElement, descriptor: DeclarationDescriptor?, trace: BindingTrace): TargetList { + fun getActualTargetList(annotated: KtElement, descriptor: DeclarationDescriptor?, trace: BindingTrace): TargetList { return when (annotated) { is KtClassOrObject -> (descriptor as? ClassDescriptor)?.let { TargetList(KotlinTarget.classActualTargets(it)) } ?: TargetLists.T_CLASSIFIER @@ -385,7 +385,7 @@ class AnnotationChecker( } } - private class TargetList( + class TargetList( val defaultTargets: List, val canBeSubstituted: List = emptyList(), val onlyWithUseSiteTarget: List = emptyList() diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddAnnotationTargetFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddAnnotationTargetFix.kt index c44f3f9a603..0c293b9d26e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddAnnotationTargetFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddAnnotationTargetFix.kt @@ -21,9 +21,11 @@ import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.searches.ReferencesSearch import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.search.restrictToKotlinSources import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType @@ -64,7 +66,8 @@ class AddAnnotationTargetFix(annotationEntry: KtAnnotationEntry) : KotlinQuickFi override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction? { val entry = diagnostic.psiElement as? KtAnnotationEntry ?: return null - if (entry.toAnnotationClass() == null) return null + val annotationClass = entry.toAnnotationClass() ?: return null + if (entry.useSiteTarget != null && entry.getRequiredAnnotationTargets(annotationClass, entry.project).isEmpty()) return null return AddAnnotationTargetFix(entry) } @@ -81,14 +84,29 @@ private fun KtAnnotationEntry.getRequiredAnnotationTargets(annotationClass: KtCl }.flatten().toSet() val annotationTargetValueNames = AnnotationTarget.values().map { it.name } - return (requiredTargets + otherReferenceRequiredTargets).filter { it.name in annotationTargetValueNames } + return (requiredTargets + otherReferenceRequiredTargets).distinct().filter { it.name in annotationTargetValueNames } } private fun KtAnnotationEntry.getActualTargetList(): List { val annotatedElement = getStrictParentOfType()?.owner as? KtElement ?: getStrictParentOfType()?.baseExpression + ?: getStrictParentOfType() ?: return emptyList() - return AnnotationChecker.getDeclarationSiteActualTargetList(annotatedElement, null, BindingTraceContext()) + + val targetList = AnnotationChecker.getActualTargetList(annotatedElement, null, BindingTraceContext()) + + if (useSiteTarget == null) { + return targetList.defaultTargets + } + val target = KotlinTarget.USE_SITE_MAPPING[useSiteTarget?.getAnnotationUseSiteTarget()] ?: return emptyList() + if (target !in with(targetList) { defaultTargets + canBeSubstituted + onlyWithUseSiteTarget }) return emptyList() + return if (target == KotlinTarget.RECEIVER && + !languageVersionSettings.supportsFeature(LanguageFeature.RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes) + ) { + listOf(KotlinTarget.VALUE_PARAMETER) + } else { + listOf(target) + } } private fun KtClass.addAnnotationTargets(annotationTargets: List, psiFactory: KtPsiFactory) { diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 674dfbecee2..05d0fdd76d4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -507,7 +507,7 @@ class QuickFixRegistrar : QuickFixContributor { RETURN_NOT_ALLOWED.registerFactory(ChangeToLabeledReturnFix) WRONG_ANNOTATION_TARGET.registerFactory(AddAnnotationTargetFix) - WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET.registerFactory(MoveReceiverAnnotationFix) + WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET.registerFactory(MoveReceiverAnnotationFix, AddAnnotationTargetFix) NO_CONSTRUCTOR.registerFactory(RemoveNoConstructorFix) diff --git a/idea/testData/quickfix/addAnnotationTarget/file.kt b/idea/testData/quickfix/addAnnotationTarget/file.kt new file mode 100644 index 00000000000..5097df57e7f --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/file.kt @@ -0,0 +1,6 @@ +// "Add annotation target" "true" +@Ann +package test + +@Target +annotation class Ann \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/file.kt.after b/idea/testData/quickfix/addAnnotationTarget/file.kt.after new file mode 100644 index 00000000000..de7facea145 --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/file.kt.after @@ -0,0 +1,6 @@ +// "Add annotation target" "true" +@Ann +package test + +@Target(AnnotationTarget.FILE) +annotation class Ann \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_delegate.kt b/idea/testData/quickfix/addAnnotationTarget/use-site_delegate.kt new file mode 100644 index 00000000000..fd43f78c266 --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_delegate.kt @@ -0,0 +1,7 @@ +// "Add annotation target" "true" +// WITH_RUNTIME +@Target +annotation class DelegateAnn + +@delegate:DelegateAnn +val foo by lazy { "" } \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_delegate.kt.after b/idea/testData/quickfix/addAnnotationTarget/use-site_delegate.kt.after new file mode 100644 index 00000000000..8099aeab410 --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_delegate.kt.after @@ -0,0 +1,7 @@ +// "Add annotation target" "true" +// WITH_RUNTIME +@Target(AnnotationTarget.FIELD) +annotation class DelegateAnn + +@delegate:DelegateAnn +val foo by lazy { "" } \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_field.kt b/idea/testData/quickfix/addAnnotationTarget/use-site_field.kt new file mode 100644 index 00000000000..cc3c8fe00d3 --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_field.kt @@ -0,0 +1,5 @@ +// "Add annotation target" "true" +@Target +annotation class FieldAnn + +class Field(@field:FieldAnn val foo: String) \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_field.kt.after b/idea/testData/quickfix/addAnnotationTarget/use-site_field.kt.after new file mode 100644 index 00000000000..3a891b7cc77 --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_field.kt.after @@ -0,0 +1,5 @@ +// "Add annotation target" "true" +@Target(AnnotationTarget.FIELD) +annotation class FieldAnn + +class Field(@field:FieldAnn val foo: String) \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_file.kt b/idea/testData/quickfix/addAnnotationTarget/use-site_file.kt new file mode 100644 index 00000000000..414113fc310 --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_file.kt @@ -0,0 +1,5 @@ +// "Add annotation target" "true" +@file:FileAnn + +@Target +annotation class FileAnn \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_file.kt.after b/idea/testData/quickfix/addAnnotationTarget/use-site_file.kt.after new file mode 100644 index 00000000000..dc58cda4604 --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_file.kt.after @@ -0,0 +1,5 @@ +// "Add annotation target" "true" +@file:FileAnn + +@Target(AnnotationTarget.FILE) +annotation class FileAnn \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_get.kt b/idea/testData/quickfix/addAnnotationTarget/use-site_get.kt new file mode 100644 index 00000000000..3fd0e96a4e4 --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_get.kt @@ -0,0 +1,5 @@ +// "Add annotation target" "true" +@Target +annotation class GetAnn + +class Get(@get:GetAnn val foo: String) \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_get.kt.after b/idea/testData/quickfix/addAnnotationTarget/use-site_get.kt.after new file mode 100644 index 00000000000..e1160055f1b --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_get.kt.after @@ -0,0 +1,5 @@ +// "Add annotation target" "true" +@Target(AnnotationTarget.PROPERTY_GETTER) +annotation class GetAnn + +class Get(@get:GetAnn val foo: String) \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_invalid.kt b/idea/testData/quickfix/addAnnotationTarget/use-site_invalid.kt new file mode 100644 index 00000000000..e86641adfd1 --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_invalid.kt @@ -0,0 +1,9 @@ +// "Add annotation target" "false" +// ACTION: Create test +// ACTION: Make internal +// ACTION: Make private +// ERROR: This annotation is not applicable to target 'class' and use site target '@get' +annotation class Ann + +@get:Ann +class Test(val foo: String) \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_param.kt b/idea/testData/quickfix/addAnnotationTarget/use-site_param.kt new file mode 100644 index 00000000000..37e16fdac6b --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_param.kt @@ -0,0 +1,5 @@ +// "Add annotation target" "true" +@Target +annotation class ParamAnn + +class Param(@param:ParamAnn val foo: String) \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_param.kt.after b/idea/testData/quickfix/addAnnotationTarget/use-site_param.kt.after new file mode 100644 index 00000000000..7f1b9612de6 --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_param.kt.after @@ -0,0 +1,5 @@ +// "Add annotation target" "true" +@Target(AnnotationTarget.VALUE_PARAMETER) +annotation class ParamAnn + +class Param(@param:ParamAnn val foo: String) \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_property.kt b/idea/testData/quickfix/addAnnotationTarget/use-site_property.kt new file mode 100644 index 00000000000..38757e0b65f --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_property.kt @@ -0,0 +1,5 @@ +// "Add annotation target" "true" +@Target +annotation class PropertyAnn + +class Property(@property:PropertyAnn val foo: String) \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_property.kt.after b/idea/testData/quickfix/addAnnotationTarget/use-site_property.kt.after new file mode 100644 index 00000000000..8c1cab823b0 --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_property.kt.after @@ -0,0 +1,5 @@ +// "Add annotation target" "true" +@Target(AnnotationTarget.PROPERTY) +annotation class PropertyAnn + +class Property(@property:PropertyAnn val foo: String) \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_receiver.kt b/idea/testData/quickfix/addAnnotationTarget/use-site_receiver.kt new file mode 100644 index 00000000000..6e09bc8c4db --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_receiver.kt @@ -0,0 +1,7 @@ +// "Add annotation target" "true" +class Foo + +@Target +annotation class ReceiverAnn + +fun @receiver:ReceiverAnn Foo.test() {} diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_receiver.kt.after b/idea/testData/quickfix/addAnnotationTarget/use-site_receiver.kt.after new file mode 100644 index 00000000000..a075ca395c6 --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_receiver.kt.after @@ -0,0 +1,7 @@ +// "Add annotation target" "true" +class Foo + +@Target(AnnotationTarget.VALUE_PARAMETER) +annotation class ReceiverAnn + +fun @receiver:ReceiverAnn Foo.test() {} diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_set.kt b/idea/testData/quickfix/addAnnotationTarget/use-site_set.kt new file mode 100644 index 00000000000..6efbedf41b1 --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_set.kt @@ -0,0 +1,5 @@ +// "Add annotation target" "true" +@Target +annotation class SetAnn + +class Set(@set:SetAnn var foo: String) \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_set.kt.after b/idea/testData/quickfix/addAnnotationTarget/use-site_set.kt.after new file mode 100644 index 00000000000..b6372f9d8aa --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_set.kt.after @@ -0,0 +1,5 @@ +// "Add annotation target" "true" +@Target(AnnotationTarget.PROPERTY_SETTER) +annotation class SetAnn + +class Set(@set:SetAnn var foo: String) \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_setparam.kt b/idea/testData/quickfix/addAnnotationTarget/use-site_setparam.kt new file mode 100644 index 00000000000..5b2cd2854e2 --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_setparam.kt @@ -0,0 +1,9 @@ +// "Add annotation target" "true" +@Target +annotation class SetParamAnn + +class Bar { + @setparam:SetParamAnn + var foo = 1 + set(value) {} +} \ No newline at end of file diff --git a/idea/testData/quickfix/addAnnotationTarget/use-site_setparam.kt.after b/idea/testData/quickfix/addAnnotationTarget/use-site_setparam.kt.after new file mode 100644 index 00000000000..19b7be9cef9 --- /dev/null +++ b/idea/testData/quickfix/addAnnotationTarget/use-site_setparam.kt.after @@ -0,0 +1,9 @@ +// "Add annotation target" "true" +@Target(AnnotationTarget.VALUE_PARAMETER) +annotation class SetParamAnn + +class Bar { + @setparam:SetParamAnn + var foo = 1 + set(value) {} +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 844f2287fb9..cfb4479d029 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -264,6 +264,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("file.kt") + public void testFile() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addAnnotationTarget/file.kt"); + doTest(fileName); + } + @TestMetadata("fromLib.kt") public void testFromLib() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addAnnotationTarget/fromLib.kt"); @@ -287,6 +293,66 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addAnnotationTarget/noBackingField.kt"); doTest(fileName); } + + @TestMetadata("use-site_delegate.kt") + public void testUse_site_delegate() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addAnnotationTarget/use-site_delegate.kt"); + doTest(fileName); + } + + @TestMetadata("use-site_field.kt") + public void testUse_site_field() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addAnnotationTarget/use-site_field.kt"); + doTest(fileName); + } + + @TestMetadata("use-site_file.kt") + public void testUse_site_file() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addAnnotationTarget/use-site_file.kt"); + doTest(fileName); + } + + @TestMetadata("use-site_get.kt") + public void testUse_site_get() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addAnnotationTarget/use-site_get.kt"); + doTest(fileName); + } + + @TestMetadata("use-site_invalid.kt") + public void testUse_site_invalid() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addAnnotationTarget/use-site_invalid.kt"); + doTest(fileName); + } + + @TestMetadata("use-site_param.kt") + public void testUse_site_param() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addAnnotationTarget/use-site_param.kt"); + doTest(fileName); + } + + @TestMetadata("use-site_property.kt") + public void testUse_site_property() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addAnnotationTarget/use-site_property.kt"); + doTest(fileName); + } + + @TestMetadata("use-site_receiver.kt") + public void testUse_site_receiver() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addAnnotationTarget/use-site_receiver.kt"); + doTest(fileName); + } + + @TestMetadata("use-site_set.kt") + public void testUse_site_set() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addAnnotationTarget/use-site_set.kt"); + doTest(fileName); + } + + @TestMetadata("use-site_setparam.kt") + public void testUse_site_setparam() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addAnnotationTarget/use-site_setparam.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/quickfix/addCrossinline")