diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinBundle.properties b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinBundle.properties index 721656aff16..37517a060af 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinBundle.properties +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinBundle.properties @@ -134,8 +134,6 @@ migrate.class.object.to.companion.in.whole.project.family=Replace 'class' Keywor migrate.lambda.syntax=Migrate lambda syntax migrate.lambda.syntax.family=Migrate lambda syntax remove.val.var.from.parameter=Remove ''{0}'' from parameter -move.when.else.branch.to.the.end.action=Move else branch to the end -move.when.else.branch.to.the.end.family.name=Move else branch to the end change.to.property.name.family.name=Change to property name change.to.property.name.action=Change ''{0}'' to ''{1}'' create.from.usage.family=Create from usage diff --git a/idea/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt b/idea/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt index c3df0ce1baf..5c43cbb3af8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt +++ b/idea/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt @@ -222,6 +222,8 @@ fun createSpacingBuilder(settings: CodeStyleSettings): KotlinSpacingBuilder { between(VALUE_ARGUMENT_LIST, LAMBDA_ARGUMENT).spaces(1) betweenInside(REFERENCE_EXPRESSION, LAMBDA_ARGUMENT, CALL_EXPRESSION).spaces(1) betweenInside(TYPE_ARGUMENT_LIST, LAMBDA_ARGUMENT, CALL_EXPRESSION).spaces(1) + + between(WHEN_ENTRY, WHEN_ENTRY).lineBreakInCode() } custom { diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/MoveWhenElseBranchFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/MoveWhenElseBranchFix.kt index a8df1083085..9d0dfa89e09 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/MoveWhenElseBranchFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/MoveWhenElseBranchFix.kt @@ -14,77 +14,46 @@ * limitations under the License. */ -package org.jetbrains.kotlin.idea.quickfix; +package org.jetbrains.kotlin.idea.quickfix -import com.intellij.codeInsight.CodeInsightUtilCore; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.IncorrectOperationException; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.diagnostics.Diagnostic; -import org.jetbrains.kotlin.idea.KotlinBundle; -import org.jetbrains.kotlin.psi.*; +import com.intellij.codeInsight.CodeInsightUtilCore +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiFile +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtPsiUtil +import org.jetbrains.kotlin.psi.KtWhenEntry +import org.jetbrains.kotlin.psi.KtWhenExpression +import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType -public class MoveWhenElseBranchFix extends KotlinQuickFixAction { - public MoveWhenElseBranchFix(@NotNull KtWhenExpression element) { - super(element); +class MoveWhenElseBranchFix(element: KtWhenExpression) : KotlinQuickFixAction(element) { + override fun getFamilyName() = "Move else branch to the end" + + override fun getText() = familyName + + override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean { + return super.isAvailable(project, editor, file) && KtPsiUtil.checkWhenExpressionHasSingleElse(element) } - @NotNull - @Override - public String getText() { - return KotlinBundle.message("move.when.else.branch.to.the.end.action"); + override fun invoke(project: Project, editor: Editor?, file: KtFile) { + val entries = element.entries + val lastEntry = entries.lastOrNull() ?: return + val elseEntry = entries.singleOrNull { it.isElse } ?: return + + val cursorOffset = editor!!.caretModel.offset - elseEntry.textOffset + + val insertedBranch = element.addAfter(elseEntry, lastEntry) as KtWhenEntry + elseEntry.delete() + val insertedWhenEntry = CodeInsightUtilCore.forcePsiPostprocessAndRestoreElement(insertedBranch) + + editor.caretModel.moveToOffset(insertedWhenEntry.textOffset + cursorOffset) } - @NotNull - @Override - public String getFamilyName() { - return KotlinBundle.message("move.when.else.branch.to.the.end.family.name"); - } - - @Override - public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiFile file) { - if (!super.isAvailable(project, editor, file)) { - return false; + companion object : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): MoveWhenElseBranchFix? { + val whenExpression = diagnostic.psiElement.getNonStrictParentOfType() ?: return null + return MoveWhenElseBranchFix(whenExpression) } - return KtPsiUtil.checkWhenExpressionHasSingleElse(getElement()); - } - - @Override - public void invoke(@NotNull Project project, Editor editor, @NotNull KtFile file) throws IncorrectOperationException { - KtWhenEntry elseEntry = null; - KtWhenEntry lastEntry = null; - for (KtWhenEntry entry : getElement().getEntries()) { - if (entry.isElse()) { - elseEntry = entry; - } - lastEntry = entry; - } - assert (elseEntry != null) : "isAvailable should check whether there is only one else branch"; - int cursorOffset = editor.getCaretModel().getOffset() - elseEntry.getTextOffset(); - - PsiElement insertedBranch = getElement().addAfter(elseEntry, lastEntry); - getElement().addAfter(KtPsiFactoryKt.KtPsiFactory(file).createNewLine(), lastEntry); - getElement().deleteChildRange(elseEntry, elseEntry); - KtWhenEntry insertedWhenEntry = (KtWhenEntry) CodeInsightUtilCore.forcePsiPostprocessAndRestoreElement(insertedBranch); - - editor.getCaretModel().moveToOffset(insertedWhenEntry.getTextOffset() + cursorOffset); - } - - public static KotlinSingleIntentionActionFactory createFactory() { - return new KotlinSingleIntentionActionFactory() { - @Nullable - @Override - public KotlinQuickFixAction createAction(@NotNull Diagnostic diagnostic) { - PsiElement element = diagnostic.getPsiElement(); - KtWhenExpression whenExpression = PsiTreeUtil.getParentOfType(element, KtWhenExpression.class, false); - if (whenExpression == null) return null; - return new MoveWhenElseBranchFix(whenExpression); - } - }; } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index d1a4a6bf347..eae1737527b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -185,7 +185,7 @@ class QuickFixRegistrar : QuickFixContributor { AMBIGUOUS_ANONYMOUS_TYPE_INFERRED.registerActions(SpecifyTypeExplicitlyFix()) - ELSE_MISPLACED_IN_WHEN.registerFactory(MoveWhenElseBranchFix.createFactory()) + ELSE_MISPLACED_IN_WHEN.registerFactory(MoveWhenElseBranchFix) NO_ELSE_IN_WHEN.registerFactory(AddWhenElseBranchFix) NO_ELSE_IN_WHEN.registerFactory(AddWhenRemainingBranchesFix) BREAK_OR_CONTINUE_IN_WHEN.registerFactory(AddLoopLabelFix)