From b980d98af649d31292c32bb03bc61ca6e5816424 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 14 Apr 2015 21:50:28 +0300 Subject: [PATCH] ConvertToBlockBodyAction - refactoring --- .../kotlin/idea/JetBundle.properties | 2 - .../after.kt.template | 0 .../before.kt.template | 0 .../description.html | 0 idea/src/META-INF/plugin.xml | 2 +- ...tion.kt => ConvertToBlockBodyIntention.kt} | 45 +++++++------------ .../CreateLocalVariableActionFactory.kt | 4 +- .../KotlinIntroduceVariableHandler.java | 4 +- .../intentions/convertToBlockBody/.intention | 2 +- 9 files changed, 23 insertions(+), 36 deletions(-) rename idea/resources/intentionDescriptions/{ConvertToBlockBodyAction => ConvertToBlockBodyIntention}/after.kt.template (100%) rename idea/resources/intentionDescriptions/{ConvertToBlockBodyAction => ConvertToBlockBodyIntention}/before.kt.template (100%) rename idea/resources/intentionDescriptions/{ConvertToBlockBodyAction => ConvertToBlockBodyIntention}/description.html (100%) rename idea/src/org/jetbrains/kotlin/idea/intentions/{ConvertToBlockBodyAction.kt => ConvertToBlockBodyIntention.kt} (61%) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties index b070d91bdf8..81b1e44571b 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties @@ -61,8 +61,6 @@ specify.type.explicitly.add.action.name=Specify type explicitly specify.type.explicitly.remove.action.name=Remove explicitly specified type convert.to.expression.body.action.family.name=Convert to Expression Body convert.to.expression.body.action.name=Convert to expression body -convert.to.block.body.action.family.name=Convert to Block Body -convert.to.block.body.action.name=Convert to block body rename.parameter.to.match.overridden.method=Rename parameter to match overridden method rename.family=Rename rename.kotlin.package.class.error="Can't rename kotlin package class" diff --git a/idea/resources/intentionDescriptions/ConvertToBlockBodyAction/after.kt.template b/idea/resources/intentionDescriptions/ConvertToBlockBodyIntention/after.kt.template similarity index 100% rename from idea/resources/intentionDescriptions/ConvertToBlockBodyAction/after.kt.template rename to idea/resources/intentionDescriptions/ConvertToBlockBodyIntention/after.kt.template diff --git a/idea/resources/intentionDescriptions/ConvertToBlockBodyAction/before.kt.template b/idea/resources/intentionDescriptions/ConvertToBlockBodyIntention/before.kt.template similarity index 100% rename from idea/resources/intentionDescriptions/ConvertToBlockBodyAction/before.kt.template rename to idea/resources/intentionDescriptions/ConvertToBlockBodyIntention/before.kt.template diff --git a/idea/resources/intentionDescriptions/ConvertToBlockBodyAction/description.html b/idea/resources/intentionDescriptions/ConvertToBlockBodyIntention/description.html similarity index 100% rename from idea/resources/intentionDescriptions/ConvertToBlockBodyAction/description.html rename to idea/resources/intentionDescriptions/ConvertToBlockBodyIntention/description.html diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index ba491059a6e..4060e8a3049 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -495,7 +495,7 @@ - org.jetbrains.kotlin.idea.intentions.ConvertToBlockBodyAction + org.jetbrains.kotlin.idea.intentions.ConvertToBlockBodyIntention Kotlin diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToBlockBodyAction.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToBlockBodyIntention.kt similarity index 61% rename from idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToBlockBodyAction.kt rename to idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToBlockBodyIntention.kt index 5cf380c3e04..190a1722bbe 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToBlockBodyAction.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToBlockBodyIntention.kt @@ -25,20 +25,29 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType -public class ConvertToBlockBodyAction : PsiElementBaseIntentionAction() { - override fun getFamilyName(): String = JetBundle.message("convert.to.block.body.action.family.name") +public class ConvertToBlockBodyIntention : JetSelfTargetingIntention(javaClass(), "Convert to block body") { + override fun isApplicableTo(element: JetDeclarationWithBody, caretOffset: Int): Boolean { + if (element is JetFunctionLiteral || element.hasBlockBody() || !element.hasBody()) return false - override fun isAvailable(project: Project, editor: Editor, element: PsiElement): Boolean { - setText(JetBundle.message("convert.to.block.body.action.name")) - return findDeclaration(element) != null + when (element) { + is JetNamedFunction -> { + val returnType = functionReturnType(element) ?: return false + if (!element.hasDeclaredReturnType() && returnType.isError()) return false// do not convert when type is implicit and unknown + return true + } + + is JetPropertyAccessor -> return true + + else -> error("Unknown declaration type: $element") + } } - override fun invoke(project: Project, editor: Editor, element: PsiElement) { - convert(findDeclaration(element)!!) + override fun applyTo(element: JetDeclarationWithBody, editor: Editor) { + convert(element) } companion object { - fun convert(declaration: JetDeclarationWithBody): JetDeclarationWithBody { + public fun convert(declaration: JetDeclarationWithBody): JetDeclarationWithBody { val body = declaration.getBodyExpression()!! fun generateBody(returnsValue: Boolean): JetExpression { @@ -69,25 +78,5 @@ public class ConvertToBlockBodyAction : PsiElementBaseIntentionAction() { body.replace(newBody) return declaration } - - private fun findDeclaration(element: PsiElement): JetDeclarationWithBody? { - val declaration = element.getStrictParentOfType() - if (declaration == null || declaration is JetFunctionLiteral || declaration.hasBlockBody()) return null - val body = declaration.getBodyExpression() - if (body == null) return null - - return when (declaration) { - is JetNamedFunction -> { - val returnType = functionReturnType(declaration) - if (returnType == null) return null - if (!declaration.hasDeclaredReturnType() && returnType.isError()) return null // do not convert when type is implicit and unknown - declaration - } - - is JetPropertyAccessor -> declaration - - else -> throw RuntimeException("Unknown declaration type: $declaration") - } - } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateLocalVariableActionFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateLocalVariableActionFactory.kt index 5b82d749ecd..42a30280928 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateLocalVariableActionFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateLocalVariableActionFactory.kt @@ -22,7 +22,7 @@ import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.idea.JetBundle -import org.jetbrains.kotlin.idea.intentions.ConvertToBlockBodyAction +import org.jetbrains.kotlin.idea.intentions.ConvertToBlockBodyIntention import org.jetbrains.kotlin.idea.quickfix.JetSingleIntentionActionFactory import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil import org.jetbrains.kotlin.idea.quickfix.createFromUsage.CreateFromUsageFixBase @@ -57,7 +57,7 @@ object CreateLocalVariableActionFactory: JetSingleIntentionActionFactory() { val actualContainer = when (container) { is JetBlockExpression -> container - else -> ConvertToBlockBodyAction.convert(container as JetDeclarationWithBody).getBodyExpression()!! + else -> ConvertToBlockBodyIntention.convert(container as JetDeclarationWithBody).getBodyExpression()!! } as JetBlockExpression if (actualContainer != container) { diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.java index 3c33b09a669..f4ca2f71be1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.java @@ -39,7 +39,7 @@ import org.jetbrains.kotlin.analyzer.AnalyzerPackage; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage; import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils; -import org.jetbrains.kotlin.idea.intentions.ConvertToBlockBodyAction; +import org.jetbrains.kotlin.idea.intentions.ConvertToBlockBodyIntention; import org.jetbrains.kotlin.idea.intentions.RemoveCurlyBracesFromTemplateIntention; import org.jetbrains.kotlin.idea.core.refactoring.JetNameSuggester; import org.jetbrains.kotlin.idea.refactoring.JetNameValidatorImpl; @@ -263,7 +263,7 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase { final JetExpression originalBody = originalDeclaration.getBodyExpression(); assert originalBody != null : "Original body is not found: " + originalDeclaration; - JetDeclarationWithBody newDeclaration = ConvertToBlockBodyAction.Companion.convert(originalDeclaration); + JetDeclarationWithBody newDeclaration = ConvertToBlockBodyIntention.Companion.convert(originalDeclaration); JetBlockExpression newCommonContainer = (JetBlockExpression) newDeclaration.getBodyExpression(); assert newCommonContainer != null : "New body is not found: " + newDeclaration; diff --git a/idea/testData/intentions/convertToBlockBody/.intention b/idea/testData/intentions/convertToBlockBody/.intention index f6aad814c7c..5d0ddcc7d14 100644 --- a/idea/testData/intentions/convertToBlockBody/.intention +++ b/idea/testData/intentions/convertToBlockBody/.intention @@ -1 +1 @@ -org.jetbrains.kotlin.idea.intentions.ConvertToBlockBodyAction +org.jetbrains.kotlin.idea.intentions.ConvertToBlockBodyIntention