From 4ca39e8f9a0a3b60d41bf5acfbb41d4af9cfd066 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 29 Sep 2014 16:05:17 +0400 Subject: [PATCH] Create From Usage: Quick-fix for local variables --- .../jetbrains/jet/plugin/JetBundle.properties | 1 + .../intentions/ConvertToBlockBodyAction.kt | 41 ++++++----- .../plugin/quickfix/QuickFixRegistrar.java | 3 + .../CreateLocalVariableActionFactory.kt | 55 ++++++++++++++ .../noImportForPrivateClass.before.Main.kt | 1 + .../localVariable/afterInAccessor.kt | 11 +++ .../afterInAccessorWithExpressionBody.kt | 11 +++ .../localVariable/afterInFun.kt | 9 +++ .../afterInFunWithExpressionBody.kt | 9 +++ .../localVariable/afterInWhen.kt | 15 ++++ .../localVariable/beforeInAccessor.kt | 9 +++ .../beforeInAccessorWithExpressionBody.kt | 7 ++ .../localVariable/beforeInClass.kt | 6 ++ .../localVariable/beforeInFun.kt | 7 ++ .../beforeInFunWithExpressionBody.kt | 5 ++ .../localVariable/beforeInWhen.kt | 13 ++++ .../localVariable/beforeOnTopLevel.kt | 4 ++ .../localVariable/beforeQualifiedInFun.kt | 9 +++ .../QuickFixMultiFileTestGenerated.java | 13 +++- .../quickfix/QuickFixTestGenerated.java | 71 ++++++++++++++++++- 20 files changed, 281 insertions(+), 19 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/createVariable/CreateLocalVariableActionFactory.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInAccessor.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInAccessorWithExpressionBody.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInFun.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInFunWithExpressionBody.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInWhen.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInAccessor.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInAccessorWithExpressionBody.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInClass.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInFun.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInFunWithExpressionBody.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInWhen.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeOnTopLevel.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeQualifiedInFun.kt diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/JetBundle.properties b/idea/idea-analysis/src/org/jetbrains/jet/plugin/JetBundle.properties index 18788da21ac..274b88676b8 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/JetBundle.properties +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/JetBundle.properties @@ -185,6 +185,7 @@ map.platform.class.to.kotlin.advertisement=Choose an appropriate Kotlin class map.platform.class.to.kotlin.family=Change to Kotlin class create.from.usage.family=Create from usage create.function.from.usage=Create function ''{0}'' from usage +create.local.variable.from.usage=Create local variable ''{0}'' choose.target.class.or.trait.title=Choose target class or trait surround.with=Surround with surround.with.string.template="${expr}" diff --git a/idea/src/org/jetbrains/jet/plugin/intentions/ConvertToBlockBodyAction.kt b/idea/src/org/jetbrains/jet/plugin/intentions/ConvertToBlockBodyAction.kt index fee4f1c6f19..b541a2b61de 100644 --- a/idea/src/org/jetbrains/jet/plugin/intentions/ConvertToBlockBodyAction.kt +++ b/idea/src/org/jetbrains/jet/plugin/intentions/ConvertToBlockBodyAction.kt @@ -34,38 +34,45 @@ public class ConvertToBlockBodyAction : PsiElementBaseIntentionAction() { } override fun invoke(project: Project, editor: Editor, element: PsiElement) { - val declaration = findDeclaration(element)!! + convert(findDeclaration(element)!!) + } + + fun convert(declaration: JetDeclarationWithBody): JetDeclarationWithBody { val body = declaration.getBodyExpression()!! fun generateBody(returnsValue: Boolean): JetExpression { val bodyType = expressionType(body) val needReturn = returnsValue && - (bodyType == null || (!KotlinBuiltIns.getInstance().isUnit(bodyType) && !KotlinBuiltIns.getInstance().isNothing(bodyType))) + (bodyType == null || (!KotlinBuiltIns.getInstance().isUnit(bodyType) && !KotlinBuiltIns.getInstance().isNothing(bodyType))) val oldBodyText = body.getText()!! val newBodyText = if (needReturn) "return ${oldBodyText}" else oldBodyText return JetPsiFactory(declaration).createFunctionBody(newBodyText) } - if (declaration is JetNamedFunction) { - val returnType = functionReturnType(declaration)!! - if (!declaration.hasDeclaredReturnType() && !KotlinBuiltIns.getInstance().isUnit(returnType)) { - specifyTypeExplicitly(declaration, returnType) + val newBody = when (declaration) { + is JetNamedFunction -> { + val returnType = functionReturnType(declaration)!! + if (!declaration.hasDeclaredReturnType() && !KotlinBuiltIns.getInstance().isUnit(returnType)) { + specifyTypeExplicitly(declaration, returnType) + } + + val newBody = generateBody(!KotlinBuiltIns.getInstance().isUnit(returnType) && !KotlinBuiltIns.getInstance().isNothing(returnType)) + + declaration.getEqualsToken()!!.delete() + body.replace(newBody) } - val newBody = generateBody(!KotlinBuiltIns.getInstance().isUnit(returnType) && !KotlinBuiltIns.getInstance().isNothing(returnType)) + is JetPropertyAccessor -> { + val newBody = generateBody(declaration.isGetter()) + declaration.getEqualsToken()!!.delete() + body.replace(newBody) + } - declaration.getEqualsToken()!!.delete() - body.replace(newBody) - } - else if (declaration is JetPropertyAccessor) { - val newBody = generateBody(declaration.isGetter()) - declaration.getEqualsToken()!!.delete() - body.replace(newBody) - } - else { - throw RuntimeException("Unknown declaration type: $declaration") + else -> throw RuntimeException("Unknown declaration type: $declaration") } + + return newBody.getParent() as JetDeclarationWithBody } private fun findDeclaration(element: PsiElement): JetDeclarationWithBody? { diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixRegistrar.java b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixRegistrar.java index 8a6dc68ada9..a631d4b0d62 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixRegistrar.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixRegistrar.java @@ -19,6 +19,7 @@ package org.jetbrains.jet.plugin.quickfix; import org.jetbrains.jet.lang.psi.JetClass; import org.jetbrains.jet.plugin.codeInsight.ImplementMethodsHandler; import org.jetbrains.jet.plugin.quickfix.createFromUsage.createFunction.*; +import org.jetbrains.jet.plugin.quickfix.createFromUsage.createVariable.*; import static org.jetbrains.jet.lang.diagnostics.Errors.*; import static org.jetbrains.jet.lexer.JetTokens.*; @@ -237,6 +238,8 @@ public class QuickFixRegistrar { QuickFixes.factories.put(NO_VALUE_FOR_PARAMETER, CreateFunctionFromCallActionFactory.INSTANCE$); QuickFixes.factories.put(TOO_MANY_ARGUMENTS, CreateFunctionFromCallActionFactory.INSTANCE$); + QuickFixes.factories.put(UNRESOLVED_REFERENCE, CreateLocalVariableActionFactory.INSTANCE$); + QuickFixes.factories.put(FUNCTION_EXPECTED, CreateInvokeFunctionActionFactory.INSTANCE$); QuickFixes.factories.put(TYPE_MISMATCH, new QuickFixFactoryForTypeMismatchError()); diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/createVariable/CreateLocalVariableActionFactory.kt b/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/createVariable/CreateLocalVariableActionFactory.kt new file mode 100644 index 00000000000..985456cdc69 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/createVariable/CreateLocalVariableActionFactory.kt @@ -0,0 +1,55 @@ +package org.jetbrains.jet.plugin.quickfix.createFromUsage.createVariable + +import org.jetbrains.jet.plugin.quickfix.createFromUsage.CreateFromUsageFixBase +import org.jetbrains.jet.plugin.JetBundle +import com.intellij.openapi.project.Project +import com.intellij.openapi.editor.Editor +import org.jetbrains.jet.lang.psi.JetFile +import org.jetbrains.jet.plugin.quickfix.JetSingleIntentionActionFactory +import org.jetbrains.jet.lang.diagnostics.Diagnostic +import com.intellij.codeInsight.intention.IntentionAction +import org.jetbrains.jet.plugin.quickfix.QuickFixUtil +import org.jetbrains.jet.lang.psi.JetSimpleNameExpression +import org.jetbrains.jet.lang.psi.psiUtil.getQualifiedElement +import org.jetbrains.jet.lang.psi.JetBlockExpression +import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.createPropertyInfo +import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.TypeInfo +import org.jetbrains.jet.lang.types.Variance +import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.CallableBuilderConfiguration +import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.createBuilder +import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.CallablePlacement +import com.intellij.openapi.command.CommandProcessor +import org.jetbrains.jet.lang.psi.psiUtil.parents +import org.jetbrains.jet.lang.psi.JetFunction +import org.jetbrains.jet.lang.psi.JetPropertyAccessor +import org.jetbrains.jet.lang.psi.JetElement +import org.jetbrains.jet.plugin.intentions.ConvertToBlockBodyAction +import org.jetbrains.jet.lang.psi.JetDeclarationWithBody + +object CreateLocalVariableActionFactory: JetSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): IntentionAction? { + val refExpr = QuickFixUtil.getParentElementOfType(diagnostic, javaClass()) ?: return null + if (refExpr.getQualifiedElement() != refExpr) return null + + val container = refExpr.parents(false) + .filter { it is JetBlockExpression || it is JetDeclarationWithBody } + .firstOrNull() as? JetElement ?: return null + + val propertyInfo = createPropertyInfo(refExpr.getReferencedName(), TypeInfo.Empty, TypeInfo(refExpr, Variance.OUT_VARIANCE)) + + return object: CreateFromUsageFixBase(refExpr) { + override fun getText(): String = JetBundle.message("create.local.variable.from.usage", propertyInfo.name) + + override fun invoke(project: Project, editor: Editor?, file: JetFile?) { + with (CallableBuilderConfiguration(propertyInfo, file!!, editor!!).createBuilder()) { + val actualContainer = when (container) { + is JetBlockExpression -> container + else -> ConvertToBlockBodyAction().convert(container as JetDeclarationWithBody).getBodyExpression()!! + } + placement = CallablePlacement.NoReceiver(actualContainer) + CommandProcessor.getInstance().executeCommand(project, { build() }, getText(), null) + } + } + } + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/autoImports/noImportForPrivateClass.before.Main.kt b/idea/testData/quickfix/autoImports/noImportForPrivateClass.before.Main.kt index 05957335046..32af4e13f02 100644 --- a/idea/testData/quickfix/autoImports/noImportForPrivateClass.before.Main.kt +++ b/idea/testData/quickfix/autoImports/noImportForPrivateClass.before.Main.kt @@ -1,4 +1,5 @@ // "class com.intellij.codeInsight.daemon.impl.quickfix.ImportClassFixBase" "false" +// ACTION: Create local variable 'PrivateClass' // ERROR: Unresolved reference: PrivateClass fun test() { diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInAccessor.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInAccessor.kt new file mode 100644 index 00000000000..3974f0e07c6 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInAccessor.kt @@ -0,0 +1,11 @@ +// "Create local variable 'foo'" "true" +// ACTION: Create parameter 'foo' +// ERROR: Variable 'foo' must be initialized + +class A { + val t: Int get() { + val foo: Int + + return foo + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInAccessorWithExpressionBody.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInAccessorWithExpressionBody.kt new file mode 100644 index 00000000000..be4b2ba9939 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInAccessorWithExpressionBody.kt @@ -0,0 +1,11 @@ +// "Create local variable 'foo'" "true" +// ACTION: Create parameter 'foo' +// ERROR: Variable 'foo' must be initialized + +class A { + val t: Int get() { + val foo: Int + + return foo + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInFun.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInFun.kt new file mode 100644 index 00000000000..3abed7a67a0 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInFun.kt @@ -0,0 +1,9 @@ +// "Create local variable 'foo'" "true" +// ACTION: Create parameter 'foo' +// ERROR: Variable 'foo' must be initialized + +fun test(): Int { + val foo: Int + + return foo +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInFunWithExpressionBody.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInFunWithExpressionBody.kt new file mode 100644 index 00000000000..3abed7a67a0 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInFunWithExpressionBody.kt @@ -0,0 +1,9 @@ +// "Create local variable 'foo'" "true" +// ACTION: Create parameter 'foo' +// ERROR: Variable 'foo' must be initialized + +fun test(): Int { + val foo: Int + + return foo +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInWhen.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInWhen.kt new file mode 100644 index 00000000000..54219c61683 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/afterInWhen.kt @@ -0,0 +1,15 @@ +// "Create local variable 'foo'" "true" +// ERROR: Variable 'foo' must be initialized + +fun test(n: Int): Int { + return when (n) { + 1 -> { + val foo: Int + + foo + } + else -> { + n + 1 + } + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInAccessor.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInAccessor.kt new file mode 100644 index 00000000000..368e6ef8127 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInAccessor.kt @@ -0,0 +1,9 @@ +// "Create local variable 'foo'" "true" +// ACTION: Create parameter 'foo' +// ERROR: Variable 'foo' must be initialized + +class A { + val t: Int get() { + return foo + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInAccessorWithExpressionBody.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInAccessorWithExpressionBody.kt new file mode 100644 index 00000000000..a76a86af693 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInAccessorWithExpressionBody.kt @@ -0,0 +1,7 @@ +// "Create local variable 'foo'" "true" +// ACTION: Create parameter 'foo' +// ERROR: Variable 'foo' must be initialized + +class A { + val t: Int get() = foo +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInClass.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInClass.kt new file mode 100644 index 00000000000..dbf18e66a2b --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInClass.kt @@ -0,0 +1,6 @@ +// "Create local variable 'foo'" "false" +// ERROR: Unresolved reference: foo + +class A { + val t: Int = foo +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInFun.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInFun.kt new file mode 100644 index 00000000000..9285cf3a3c2 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInFun.kt @@ -0,0 +1,7 @@ +// "Create local variable 'foo'" "true" +// ACTION: Create parameter 'foo' +// ERROR: Variable 'foo' must be initialized + +fun test(): Int { + return foo +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInFunWithExpressionBody.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInFunWithExpressionBody.kt new file mode 100644 index 00000000000..4c0bac10971 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInFunWithExpressionBody.kt @@ -0,0 +1,5 @@ +// "Create local variable 'foo'" "true" +// ACTION: Create parameter 'foo' +// ERROR: Variable 'foo' must be initialized + +fun test(): Int = foo \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInWhen.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInWhen.kt new file mode 100644 index 00000000000..4a08c00d3d8 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInWhen.kt @@ -0,0 +1,13 @@ +// "Create local variable 'foo'" "true" +// ERROR: Variable 'foo' must be initialized + +fun test(n: Int): Int { + return when (n) { + 1 -> { + foo + } + else -> { + n + 1 + } + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeOnTopLevel.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeOnTopLevel.kt new file mode 100644 index 00000000000..bbcf3b207e4 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeOnTopLevel.kt @@ -0,0 +1,4 @@ +// "Create local variable 'foo'" "false" +// ERROR: Unresolved reference: foo + +val t: Int = foo \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeQualifiedInFun.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeQualifiedInFun.kt new file mode 100644 index 00000000000..506bc2ae5a0 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeQualifiedInFun.kt @@ -0,0 +1,9 @@ +// "Create local variable 'foo'" "false" +// ACTION: Split property declaration +// ERROR: Unresolved reference: foo + +class A + +fun test(a: A) { + val t: Int = a.foo +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixMultiFileTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixMultiFileTestGenerated.java index b16d856a37e..a2e7d474499 100644 --- a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixMultiFileTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixMultiFileTestGenerated.java @@ -218,7 +218,7 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes @TestMetadata("idea/testData/quickfix/createFromUsage") @TestDataPath("$PROJECT_ROOT") - @InnerTestClasses({CreateFromUsage.CreateFunction.class}) + @InnerTestClasses({CreateFromUsage.CreateFunction.class, CreateFromUsage.CreateVariable.class}) @RunWith(org.jetbrains.jet.JUnit3RunnerWithInners.class) public static class CreateFromUsage extends AbstractQuickFixMultiFileTest { public void testAllFilesPresentInCreateFromUsage() throws Exception { @@ -236,6 +236,17 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes } + @TestMetadata("idea/testData/quickfix/createFromUsage/createVariable") + @TestDataPath("$PROJECT_ROOT") + @InnerTestClasses({}) + @RunWith(org.jetbrains.jet.JUnit3RunnerWithInners.class) + public static class CreateVariable extends AbstractQuickFixMultiFileTest { + public void testAllFilesPresentInCreateVariable() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/createFromUsage/createVariable"), Pattern.compile("^(\\w+)\\.before\\.Main\\.kt$"), true); + } + + } + } @TestMetadata("idea/testData/quickfix/modifiers") diff --git a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java index 60cce54b248..438adc85e21 100644 --- a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java @@ -618,7 +618,7 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { @TestMetadata("idea/testData/quickfix/createFromUsage") @TestDataPath("$PROJECT_ROOT") - @InnerTestClasses({CreateFromUsage.CreateFunction.class}) + @InnerTestClasses({CreateFromUsage.CreateFunction.class, CreateFromUsage.CreateVariable.class}) @RunWith(org.jetbrains.jet.JUnit3RunnerWithInners.class) public static class CreateFromUsage extends AbstractQuickFixTest { public void testAllFilesPresentInCreateFromUsage() throws Exception { @@ -1162,6 +1162,75 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } + @TestMetadata("idea/testData/quickfix/createFromUsage/createVariable") + @TestDataPath("$PROJECT_ROOT") + @InnerTestClasses({CreateVariable.LocalVariable.class}) + @RunWith(org.jetbrains.jet.JUnit3RunnerWithInners.class) + public static class CreateVariable extends AbstractQuickFixTest { + public void testAllFilesPresentInCreateVariable() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/createFromUsage/createVariable"), Pattern.compile("^before(\\w+)\\.kt$"), true); + } + + @TestMetadata("idea/testData/quickfix/createFromUsage/createVariable/localVariable") + @TestDataPath("$PROJECT_ROOT") + @RunWith(org.jetbrains.jet.JUnit3RunnerWithInners.class) + public static class LocalVariable extends AbstractQuickFixTest { + public void testAllFilesPresentInLocalVariable() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/createFromUsage/createVariable/localVariable"), Pattern.compile("^before(\\w+)\\.kt$"), true); + } + + @TestMetadata("beforeInAccessor.kt") + public void testInAccessor() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInAccessor.kt"); + doTest(fileName); + } + + @TestMetadata("beforeInAccessorWithExpressionBody.kt") + public void testInAccessorWithExpressionBody() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInAccessorWithExpressionBody.kt"); + doTest(fileName); + } + + @TestMetadata("beforeInClass.kt") + public void testInClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInClass.kt"); + doTest(fileName); + } + + @TestMetadata("beforeInFun.kt") + public void testInFun() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInFun.kt"); + doTest(fileName); + } + + @TestMetadata("beforeInFunWithExpressionBody.kt") + public void testInFunWithExpressionBody() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInFunWithExpressionBody.kt"); + doTest(fileName); + } + + @TestMetadata("beforeInWhen.kt") + public void testInWhen() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeInWhen.kt"); + doTest(fileName); + } + + @TestMetadata("beforeOnTopLevel.kt") + public void testOnTopLevel() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeOnTopLevel.kt"); + doTest(fileName); + } + + @TestMetadata("beforeQualifiedInFun.kt") + public void testQualifiedInFun() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/localVariable/beforeQualifiedInFun.kt"); + doTest(fileName); + } + + } + + } + } @TestMetadata("idea/testData/quickfix/expressions")