diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/MakePrivateAndOverrideMemberFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/MakePrivateAndOverrideMemberFix.kt new file mode 100644 index 00000000000..2997fe769c2 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/MakePrivateAndOverrideMemberFix.kt @@ -0,0 +1,84 @@ +/* + * Copyright 2010-2019 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.idea.quickfix + +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.descriptors.CallableDescriptor +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.core.overrideImplement.ImplementMembersHandler +import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideImplementMembersHandler +import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMemberChooserObject +import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.load.java.JvmAbi +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.calls.callUtil.getType +import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm +import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode +import org.jetbrains.kotlin.types.typeUtil.isUnit +import org.jetbrains.kotlin.types.typeUtil.makeNotNullable + +class MakePrivateAndOverrideMemberFix( + propertyOrParameter: KtDeclaration, + private val memberToOverride: OverrideMemberChooserObject +) : KotlinQuickFixAction(propertyOrParameter) { + private val makePrivate = !propertyOrParameter.hasModifier(KtTokens.PRIVATE_KEYWORD) + + override fun getText(): String { + val descriptor = memberToOverride.descriptor + val implement = (descriptor.containingDeclaration as? ClassDescriptor)?.kind == ClassKind.INTERFACE + val name = descriptor.name.asString() + return if (makePrivate) { + "Make private and ${if (implement) "implements" else "overrides"} '$name'" + } else { + "${if (implement) "Implements" else "Overrides"} '$name'" + } + } + + override fun getFamilyName() = text + + override fun invoke(project: Project, editor: Editor?, file: KtFile) { + if (editor == null) return + val element = element ?: return + val containingClassOrObject = element.containingClassOrObject ?: return + if (makePrivate) { + element.addModifier(KtTokens.PRIVATE_KEYWORD) + } + OverrideImplementMembersHandler.generateMembers(editor, containingClassOrObject, listOf(memberToOverride), false) + } + + object AccidentalOverrideFactory : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction? { + val casted = ErrorsJvm.ACCIDENTAL_OVERRIDE.cast(diagnostic) + val element = casted.psiElement as? KtDeclaration ?: return null + if (element !is KtProperty && element !is KtParameter) return null + val containingClassOrObject = element.containingClassOrObject ?: return null + val memberNameToOverride = casted.a.signature.name + val returnType = (element.descriptor as? CallableDescriptor)?.returnType ?: return null + + val isGetter = JvmAbi.isGetterName(memberNameToOverride) + val isSetter = JvmAbi.isSetterName(memberNameToOverride) + val memberToOverride = implementMembersHandler.collectMembersToGenerate(containingClassOrObject).firstOrNull { + val descriptor = it.descriptor + if (descriptor.name.asString() != memberNameToOverride) return@firstOrNull false + val accessorReturnType = descriptor.returnType?.makeNotNullable() ?: return@firstOrNull false + val params = descriptor.valueParameters + (isGetter && params.isEmpty() && accessorReturnType == returnType) || + (isSetter && params.singleOrNull()?.type?.makeNotNullable() == returnType && accessorReturnType.isUnit()) + } ?: return null + + return MakePrivateAndOverrideMemberFix(element, memberToOverride) + } + + private val implementMembersHandler = ImplementMembersHandler() + } +} diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 028e5786676..734b260aebd 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -617,5 +617,8 @@ class QuickFixRegistrar : QuickFixContributor { CONSTRUCTOR_IN_OBJECT.registerFactory(ChangeObjectToClassFix) REDUNDANT_LABEL_WARNING.registerFactory(RemoveRedundantLabelFix) + + ACCIDENTAL_OVERRIDE.registerFactory(MakePrivateAndOverrideMemberFix.AccidentalOverrideFactory) + } } diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameter.after.Dependency.java b/idea/testData/quickfix/makePrivateAndOverrideMember/parameter.after.Dependency.java new file mode 100644 index 00000000000..09b490fe877 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameter.after.Dependency.java @@ -0,0 +1,4 @@ +public interface JavaInterface { + String getName(String name); + String getName(); +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameter.after.kt b/idea/testData/quickfix/makePrivateAndOverrideMember/parameter.after.kt new file mode 100644 index 00000000000..e1040b782ca --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameter.after.kt @@ -0,0 +1,7 @@ +// "Make private and implements 'getName'" "true" +// DISABLE-ERRORS +class A(private val name: String) : JavaInterface { + override fun getName(): String { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameter.before.Dependency.java b/idea/testData/quickfix/makePrivateAndOverrideMember/parameter.before.Dependency.java new file mode 100644 index 00000000000..09b490fe877 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameter.before.Dependency.java @@ -0,0 +1,4 @@ +public interface JavaInterface { + String getName(String name); + String getName(); +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameter.before.Main.kt b/idea/testData/quickfix/makePrivateAndOverrideMember/parameter.before.Main.kt new file mode 100644 index 00000000000..3c0234ff406 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameter.before.Main.kt @@ -0,0 +1,4 @@ +// "Make private and implements 'getName'" "true" +// DISABLE-ERRORS +class A(val name: String) : JavaInterface { +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasInternal.before.Dependency.java b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasInternal.before.Dependency.java new file mode 100644 index 00000000000..98c28822452 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasInternal.before.Dependency.java @@ -0,0 +1,3 @@ +public interface JavaInterface { + String getName(); +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasInternal.before.Main.kt b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasInternal.before.Main.kt new file mode 100644 index 00000000000..9987f55d1e8 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasInternal.before.Main.kt @@ -0,0 +1,10 @@ +// "Implements 'getName'" "false" +// DISABLE-ERRORS +// ACTION: Convert to secondary constructor +// ACTION: Create test +// ACTION: Make private +// ACTION: Make protected +// ACTION: Make public +// ACTION: Move to class body +class A(internal val name: String) : JavaInterface { +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPrivate.after.Dependency.java b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPrivate.after.Dependency.java new file mode 100644 index 00000000000..98c28822452 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPrivate.after.Dependency.java @@ -0,0 +1,3 @@ +public interface JavaInterface { + String getName(); +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPrivate.after.kt b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPrivate.after.kt new file mode 100644 index 00000000000..f7efb35acb3 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPrivate.after.kt @@ -0,0 +1,7 @@ +// "Implements 'getName'" "true" +// DISABLE-ERRORS +class A(private val name: String) : JavaInterface { + override fun getName(): String { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPrivate.before.Dependency.java b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPrivate.before.Dependency.java new file mode 100644 index 00000000000..98c28822452 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPrivate.before.Dependency.java @@ -0,0 +1,3 @@ +public interface JavaInterface { + String getName(); +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPrivate.before.Main.kt b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPrivate.before.Main.kt new file mode 100644 index 00000000000..959e349764f --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPrivate.before.Main.kt @@ -0,0 +1,4 @@ +// "Implements 'getName'" "true" +// DISABLE-ERRORS +class A(private val name: String) : JavaInterface { +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasProtected.after.Dependency.java b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasProtected.after.Dependency.java new file mode 100644 index 00000000000..98c28822452 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasProtected.after.Dependency.java @@ -0,0 +1,3 @@ +public interface JavaInterface { + String getName(); +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasProtected.after.kt b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasProtected.after.kt new file mode 100644 index 00000000000..e1040b782ca --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasProtected.after.kt @@ -0,0 +1,7 @@ +// "Make private and implements 'getName'" "true" +// DISABLE-ERRORS +class A(private val name: String) : JavaInterface { + override fun getName(): String { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasProtected.before.Dependency.java b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasProtected.before.Dependency.java new file mode 100644 index 00000000000..98c28822452 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasProtected.before.Dependency.java @@ -0,0 +1,3 @@ +public interface JavaInterface { + String getName(); +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasProtected.before.Main.kt b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasProtected.before.Main.kt new file mode 100644 index 00000000000..a7dba11a25e --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasProtected.before.Main.kt @@ -0,0 +1,4 @@ +// "Make private and implements 'getName'" "true" +// DISABLE-ERRORS +class A(protected val name: String) : JavaInterface { +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPublic.after.Dependency.java b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPublic.after.Dependency.java new file mode 100644 index 00000000000..98c28822452 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPublic.after.Dependency.java @@ -0,0 +1,3 @@ +public interface JavaInterface { + String getName(); +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPublic.after.kt b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPublic.after.kt new file mode 100644 index 00000000000..e1040b782ca --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPublic.after.kt @@ -0,0 +1,7 @@ +// "Make private and implements 'getName'" "true" +// DISABLE-ERRORS +class A(private val name: String) : JavaInterface { + override fun getName(): String { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPublic.before.Dependency.java b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPublic.before.Dependency.java new file mode 100644 index 00000000000..98c28822452 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPublic.before.Dependency.java @@ -0,0 +1,3 @@ +public interface JavaInterface { + String getName(); +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPublic.before.Main.kt b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPublic.before.Main.kt new file mode 100644 index 00000000000..a30df072211 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPublic.before.Main.kt @@ -0,0 +1,4 @@ +// "Make private and implements 'getName'" "true" +// DISABLE-ERRORS +class A(public val name: String) : JavaInterface { +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/property.after.Dependency.java b/idea/testData/quickfix/makePrivateAndOverrideMember/property.after.Dependency.java new file mode 100644 index 00000000000..03ad162d6c7 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/property.after.Dependency.java @@ -0,0 +1,3 @@ +public abstract class JavaClass { + abstract String getName(); +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/property.after.kt b/idea/testData/quickfix/makePrivateAndOverrideMember/property.after.kt new file mode 100644 index 00000000000..9be708fa3f8 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/property.after.kt @@ -0,0 +1,8 @@ +// "Make private and overrides 'getName'" "true" +// DISABLE-ERRORS +class B : JavaClass() { + private val name: String = "" + override fun getName(): String { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/property.before.Dependency.java b/idea/testData/quickfix/makePrivateAndOverrideMember/property.before.Dependency.java new file mode 100644 index 00000000000..03ad162d6c7 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/property.before.Dependency.java @@ -0,0 +1,3 @@ +public abstract class JavaClass { + abstract String getName(); +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/property.before.Main.kt b/idea/testData/quickfix/makePrivateAndOverrideMember/property.before.Main.kt new file mode 100644 index 00000000000..1303040e60a --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/property.before.Main.kt @@ -0,0 +1,5 @@ +// "Make private and overrides 'getName'" "true" +// DISABLE-ERRORS +class B : JavaClass() { + val name: String = "" +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/setter.after.Dependency.java b/idea/testData/quickfix/makePrivateAndOverrideMember/setter.after.Dependency.java new file mode 100644 index 00000000000..d24987db754 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/setter.after.Dependency.java @@ -0,0 +1,7 @@ +public interface JavaInterface { + String getName(); + + void setName(); + + void setName(String name); +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/setter.after.kt b/idea/testData/quickfix/makePrivateAndOverrideMember/setter.after.kt new file mode 100644 index 00000000000..a4b883e61af --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/setter.after.kt @@ -0,0 +1,11 @@ +// "Make private and implements 'setName'" "true" +// DISABLE-ERRORS +class A(private var name: String) : JavaInterface { + override fun setName(name: String?) { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun getName(): String { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/setter.before.Dependency.java b/idea/testData/quickfix/makePrivateAndOverrideMember/setter.before.Dependency.java new file mode 100644 index 00000000000..d24987db754 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/setter.before.Dependency.java @@ -0,0 +1,7 @@ +public interface JavaInterface { + String getName(); + + void setName(); + + void setName(String name); +} \ No newline at end of file diff --git a/idea/testData/quickfix/makePrivateAndOverrideMember/setter.before.Main.kt b/idea/testData/quickfix/makePrivateAndOverrideMember/setter.before.Main.kt new file mode 100644 index 00000000000..29f3b93b104 --- /dev/null +++ b/idea/testData/quickfix/makePrivateAndOverrideMember/setter.before.Main.kt @@ -0,0 +1,7 @@ +// "Make private and implements 'setName'" "true" +// DISABLE-ERRORS +class A(var name: String) : JavaInterface { + override fun getName(): String { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java index 901f0ab41d8..54c31e7483e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java @@ -3036,6 +3036,54 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes } } + @TestMetadata("idea/testData/quickfix/makePrivateAndOverrideMember") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class MakePrivateAndOverrideMember extends AbstractQuickFixMultiFileTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTestWithExtraFile, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInMakePrivateAndOverrideMember() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/makePrivateAndOverrideMember"), Pattern.compile("^(\\w+)\\.((before\\.Main\\.\\w+)|(test))$"), TargetBackend.ANY, true); + } + + @TestMetadata("parameter.before.Main.kt") + public void testParameter() throws Exception { + runTest("idea/testData/quickfix/makePrivateAndOverrideMember/parameter.before.Main.kt"); + } + + @TestMetadata("parameterHasInternal.before.Main.kt") + public void testParameterHasInternal() throws Exception { + runTest("idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasInternal.before.Main.kt"); + } + + @TestMetadata("parameterHasPrivate.before.Main.kt") + public void testParameterHasPrivate() throws Exception { + runTest("idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPrivate.before.Main.kt"); + } + + @TestMetadata("parameterHasProtected.before.Main.kt") + public void testParameterHasProtected() throws Exception { + runTest("idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasProtected.before.Main.kt"); + } + + @TestMetadata("parameterHasPublic.before.Main.kt") + public void testParameterHasPublic() throws Exception { + runTest("idea/testData/quickfix/makePrivateAndOverrideMember/parameterHasPublic.before.Main.kt"); + } + + @TestMetadata("property.before.Main.kt") + public void testProperty() throws Exception { + runTest("idea/testData/quickfix/makePrivateAndOverrideMember/property.before.Main.kt"); + } + + @TestMetadata("setter.before.Main.kt") + public void testSetter() throws Exception { + runTest("idea/testData/quickfix/makePrivateAndOverrideMember/setter.before.Main.kt"); + } + } + @TestMetadata("idea/testData/quickfix/makeTypeParameterReified") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 2c8b653d424..462197ed750 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -8231,6 +8231,19 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } } + @TestMetadata("idea/testData/quickfix/makePrivateAndOverrideMember") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class MakePrivateAndOverrideMember extends AbstractQuickFixTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInMakePrivateAndOverrideMember() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/makePrivateAndOverrideMember"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); + } + } + @TestMetadata("idea/testData/quickfix/makeTypeParameterReified") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)