diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt b/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt index 82df5d287c1..38f4d2b2f76 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt @@ -120,6 +120,7 @@ public fun JetElement.wrapInBlock(): JetBlockExpression { block.appendElement(this) return block } + /** * Returns the list of unqualified names that are indexed as the superclass names of this class. For the names that might be imported * via an aliased import, includes both the original and the aliased name (reference resolution during inheritor search will sort this out). diff --git a/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt index 11fd224179b..78fe3adbae0 100644 --- a/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt @@ -372,6 +372,8 @@ fun main(args: Array) { model("intentions/moveLambdaOutsideParentheses", testMethod = "doTestMoveLambdaOutsideParentheses") model("intentions/replaceExplicitFunctionLiteralParamWithIt", testMethod = "doTestReplaceExplicitFunctionLiteralParamWithIt") model("intentions/replaceItWithExplicitFunctionLiteralParam", testMethod = "doTestReplaceItWithExplicitFunctionLiteralParam") + model("intentions/removeBraces", testMethod = "doTestRemoveBraces") + model("intentions/addBraces", testMethod = "doTestAddBraces") } testClass(javaClass()) { diff --git a/idea/resources/intentionDescriptions/AddBracesIntention/after.kt.template b/idea/resources/intentionDescriptions/AddBracesIntention/after.kt.template new file mode 100644 index 00000000000..e163d2856b5 --- /dev/null +++ b/idea/resources/intentionDescriptions/AddBracesIntention/after.kt.template @@ -0,0 +1,4 @@ +if (b) { + return 1 +} + \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/AddBracesIntention/before.kt.template b/idea/resources/intentionDescriptions/AddBracesIntention/before.kt.template new file mode 100644 index 00000000000..bd4c126d472 --- /dev/null +++ b/idea/resources/intentionDescriptions/AddBracesIntention/before.kt.template @@ -0,0 +1 @@ +if (b) return 1 diff --git a/idea/resources/intentionDescriptions/AddBracesIntention/description.html b/idea/resources/intentionDescriptions/AddBracesIntention/description.html new file mode 100644 index 00000000000..d358859c5d9 --- /dev/null +++ b/idea/resources/intentionDescriptions/AddBracesIntention/description.html @@ -0,0 +1,5 @@ + + +This intention adds braces to control flow statements without braces. + + \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/RemoveBracesIntention/after.kt.template b/idea/resources/intentionDescriptions/RemoveBracesIntention/after.kt.template new file mode 100644 index 00000000000..15aa9b1dc78 --- /dev/null +++ b/idea/resources/intentionDescriptions/RemoveBracesIntention/after.kt.template @@ -0,0 +1,2 @@ +if (b) return 1 + \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/RemoveBracesIntention/before.kt.template b/idea/resources/intentionDescriptions/RemoveBracesIntention/before.kt.template new file mode 100644 index 00000000000..d52316d6ac8 --- /dev/null +++ b/idea/resources/intentionDescriptions/RemoveBracesIntention/before.kt.template @@ -0,0 +1,3 @@ +if (b) { + return 1 +} diff --git a/idea/resources/intentionDescriptions/RemoveBracesIntention/description.html b/idea/resources/intentionDescriptions/RemoveBracesIntention/description.html new file mode 100644 index 00000000000..55f19717baf --- /dev/null +++ b/idea/resources/intentionDescriptions/RemoveBracesIntention/description.html @@ -0,0 +1,5 @@ + + +This intention removes braces from control flow statements with only a single statement in their code block. + + \ No newline at end of file diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index feefd52f27e..9df381d5e37 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -538,6 +538,17 @@ Kotlin + + org.jetbrains.jet.plugin.intentions.RemoveBracesIntention + Kotlin + + + + org.jetbrains.jet.plugin.intentions.AddBracesIntention + Kotlin + + + diff --git a/idea/src/org/jetbrains/jet/plugin/JetBundle.properties b/idea/src/org/jetbrains/jet/plugin/JetBundle.properties index 8f0efa94f84..6c91e00d447 100644 --- a/idea/src/org/jetbrains/jet/plugin/JetBundle.properties +++ b/idea/src/org/jetbrains/jet/plugin/JetBundle.properties @@ -241,6 +241,10 @@ move.lambda.outside.parentheses=Move lambda expression out of parentheses move.lambda.outside.parentheses.family=Move lambda expression out of parentheses replace.it.with.explicit.function.literal.param=Replace 'it' with explicit parameter replace.it.with.explicit.function.literal.param.family=Replace 'it' With Explicit Parameter +remove.braces=Remove braces +remove.braces.family=Remove Braces +add.braces=Add braces +add.braces.family=Add Braces property.is.implemented.too.many=Has implementations property.is.overridden.too.many=Is overridden in subclasses diff --git a/idea/src/org/jetbrains/jet/plugin/intentions/AddBracesIntention.kt b/idea/src/org/jetbrains/jet/plugin/intentions/AddBracesIntention.kt new file mode 100644 index 00000000000..3d03d7cd685 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/intentions/AddBracesIntention.kt @@ -0,0 +1,80 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.intentions + +import org.jetbrains.jet.lang.psi.JetIfExpression +import org.jetbrains.jet.lang.psi.JetWhileExpression +import org.jetbrains.jet.lang.psi.JetForExpression +import org.jetbrains.jet.lang.psi.JetDoWhileExpression +import org.jetbrains.jet.lang.psi.JetExpressionImpl +import org.jetbrains.jet.lang.psi.JetPsiFactory +import org.jetbrains.jet.lang.psi.JetBlockExpression +import com.intellij.psi.PsiElement +import com.intellij.openapi.project.Project +import com.intellij.openapi.editor.Editor +import com.intellij.psi.PsiFile +import com.intellij.lang.ASTNode +import org.jetbrains.jet.JetNodeTypes +import com.intellij.psi.PsiWhiteSpace + +public class AddBracesIntention : JetSelfTargetingIntention("add.braces", javaClass()) { + private var expressionKind: ExpressionKind? = null + private var caretLocation: Int = 1 + + override fun isAvailable(project: Project, editor: Editor, file: PsiFile): Boolean { + caretLocation = editor.getCaretModel().getOffset() + return getTarget(editor, file) != null + } + + override fun isApplicableTo(element: JetExpressionImpl): Boolean { + expressionKind = element.getExpressionKind(caretLocation) + if (expressionKind == null) return false + + val jetBlockElement = element.findBlockInExpression(expressionKind) + if (jetBlockElement != null) return false + + setText("Add braces to '${expressionKind!!.text}' statement") + return true + } + + override fun applyTo(element: JetExpressionImpl, editor: Editor) { + val bodyNode = when (expressionKind) { + ExpressionKind.ELSE -> element.getNode().findChildByType(JetNodeTypes.ELSE) + ExpressionKind.IF -> element.getNode().findChildByType(JetNodeTypes.THEN) + else -> element.getNode().findChildByType(JetNodeTypes.BODY) + } + generateCleanOutput(element, bodyNode) + } + + fun generateCleanOutput(element: JetExpressionImpl, bodyNode: ASTNode?) { + if (element.getNextSibling()?.getText() == ";") { + element.getNextSibling()!!.delete() + } + val newElement = bodyNode!!.getPsi()!!.replace(JetPsiFactory.createFunctionBody(element.getProject(), bodyNode.getText())) + + //handles the case of the block statement being on a new line + if (newElement.getPrevSibling() is PsiWhiteSpace) { + newElement.getPrevSibling()!!.replace(JetPsiFactory.createWhiteSpace(element.getProject())) + } else { + //handles the case of no space between condition and statement + newElement.addBefore(JetPsiFactory.createWhiteSpace(element.getProject()), newElement.getFirstChild()) + } + if (expressionKind == ExpressionKind.DOWHILE) { + newElement.getNextSibling()?.delete() + } + } +} diff --git a/idea/src/org/jetbrains/jet/plugin/intentions/JetSelfTargetingIntention.kt b/idea/src/org/jetbrains/jet/plugin/intentions/JetSelfTargetingIntention.kt index 89aad128bc9..a61370e6720 100644 --- a/idea/src/org/jetbrains/jet/plugin/intentions/JetSelfTargetingIntention.kt +++ b/idea/src/org/jetbrains/jet/plugin/intentions/JetSelfTargetingIntention.kt @@ -32,7 +32,7 @@ public abstract class JetSelfTargetingIntention(val key: String, protected abstract fun isApplicableTo(element: T): Boolean protected abstract fun applyTo(element: T, editor: Editor) - private fun getTarget(editor: Editor, file: PsiFile): T? { + protected fun getTarget(editor: Editor, file: PsiFile): T? { val offset = editor.getCaretModel().getOffset() return file.findElementAt(offset)?.getParentByTypesAndPredicate(false, elementType) { element -> isApplicableTo(element) } } diff --git a/idea/src/org/jetbrains/jet/plugin/intentions/RemoveBracesIntention.kt b/idea/src/org/jetbrains/jet/plugin/intentions/RemoveBracesIntention.kt new file mode 100644 index 00000000000..ec1a34e1694 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/intentions/RemoveBracesIntention.kt @@ -0,0 +1,84 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.intentions + +import org.jetbrains.jet.lang.psi.JetBlockExpression +import org.jetbrains.jet.lang.psi.JetPsiFactory +import org.jetbrains.jet.lang.psi.JetWhileExpression +import org.jetbrains.jet.lang.psi.JetIfExpression +import org.jetbrains.jet.lang.psi.JetDoWhileExpression +import org.jetbrains.jet.lang.psi.JetForExpression +import org.jetbrains.jet.lang.psi.JetExpressionImpl +import com.intellij.openapi.project.Project +import com.intellij.openapi.editor.Editor +import com.intellij.psi.PsiFile +import com.intellij.psi.PsiWhiteSpace +import com.intellij.psi.PsiComment + +public class RemoveBracesIntention : JetSelfTargetingIntention("remove.braces", javaClass()) { + private var expressionKind: ExpressionKind? = null + private var caretLocation: Int = 1 + + override fun isAvailable(project: Project, editor: Editor, file: PsiFile): Boolean { + caretLocation = editor.getCaretModel().getOffset() + return getTarget(editor, file) != null + } + + override fun isApplicableTo(element: JetExpressionImpl): Boolean { + expressionKind = element.getExpressionKind(caretLocation) + if (expressionKind == null) return false + + val jetBlockElement = element.findBlockInExpression(expressionKind) + if (jetBlockElement == null) return false + + if (jetBlockElement!!.getStatements().size == 1) { + setText("Remove braces from '${expressionKind!!.text}' statement") + return true + } + return false + } + + override fun applyTo(element: JetExpressionImpl, editor: Editor) { + val jetBlockElement = element.findBlockInExpression(expressionKind) + val firstStatement = jetBlockElement!!.getStatements().first() + + handleComments(element, jetBlockElement) + + val newElement = jetBlockElement.replace(JetPsiFactory.createExpression(element.getProject(), firstStatement.getText())) + + if (expressionKind == ExpressionKind.DOWHILE) { + newElement.getParent()!!.addAfter(JetPsiFactory.createNewLine(element.getProject()), newElement) + } + + } + + fun handleComments(element: JetExpressionImpl, blockElement: JetBlockExpression) { + var sibling = blockElement.getFirstChild()?.getNextSibling() + + while (sibling != null) { + if (sibling is PsiComment) { + //cleans up extra whitespace + if (element.getPrevSibling() is PsiWhiteSpace) { + element.getPrevSibling()!!.replace(JetPsiFactory.createNewLine(element.getProject())) + } + val commentElement = element.getParent()!!.addBefore(sibling as PsiComment, element.getPrevSibling()) + element.getParent()!!.addBefore(JetPsiFactory.createNewLine(element.getProject()), commentElement) + } + sibling = sibling!!.getNextSibling() + } + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/intentions/Utils.kt b/idea/src/org/jetbrains/jet/plugin/intentions/Utils.kt index 2763ea4b6b0..8b336f39534 100644 --- a/idea/src/org/jetbrains/jet/plugin/intentions/Utils.kt +++ b/idea/src/org/jetbrains/jet/plugin/intentions/Utils.kt @@ -7,6 +7,8 @@ import org.jetbrains.jet.lang.resolve.BindingContext import org.jetbrains.jet.lang.descriptors.FunctionDescriptor import org.jetbrains.jet.renderer.DescriptorRenderer import org.jetbrains.jet.plugin.codeInsight.ShortenReferences +import org.jetbrains.jet.JetNodeTypes +import org.jetbrains.jet.lexer.JetTokens fun specifyTypeExplicitly(declaration: JetNamedFunction, typeText: String) { specifyTypeExplicitly(declaration, JetPsiFactory.createType(declaration.getProject(), typeText)) @@ -39,3 +41,44 @@ fun functionReturnType(function: JetNamedFunction): JetType? { if (descriptor == null) return null return (descriptor as FunctionDescriptor).getReturnType() } + +enum class ExpressionKind(val text: String) { + IF : ExpressionKind("if") + ELSE : ExpressionKind("else") + WHILE : ExpressionKind("while") + DOWHILE : ExpressionKind("do...while") + FOR : ExpressionKind("for") +} + +fun JetExpressionImpl.findBlockInExpression(expressionKind: ExpressionKind?): JetBlockExpression? { + val bodyNode = when (expressionKind) { + ExpressionKind.IF -> this.getNode().findChildByType(JetNodeTypes.THEN) + ExpressionKind.ELSE -> this.getNode().findChildByType(JetNodeTypes.ELSE) + else -> this.getNode().findChildByType(JetNodeTypes.BODY) + } + return bodyNode!!.getPsi()!!.getFirstChild() as? JetBlockExpression +} + +fun JetExpressionImpl.getExpressionKind(caretLocation: Int): ExpressionKind? { + when (this) { + is JetIfExpression -> { + if (this.getElse() != null) { + val elseLocation = this.getNode().findChildByType(JetTokens.ELSE_KEYWORD)!!.getPsi()!!.getTextOffset() + if (caretLocation >= elseLocation) return ExpressionKind.ELSE + } + return ExpressionKind.IF + } + is JetWhileExpression -> { + return ExpressionKind.WHILE + } + is JetDoWhileExpression -> { + return ExpressionKind.DOWHILE + } + is JetForExpression -> { + return ExpressionKind.FOR + } + else -> { + return null + } + } +} diff --git a/idea/testData/intentions/addBraces/addBracesForDoWhile.kt b/idea/testData/intentions/addBraces/addBracesForDoWhile.kt new file mode 100644 index 00000000000..f78477afb0a --- /dev/null +++ b/idea/testData/intentions/addBraces/addBracesForDoWhile.kt @@ -0,0 +1,4 @@ +fun foo() { + do println("test") + while(true) +} \ No newline at end of file diff --git a/idea/testData/intentions/addBraces/addBracesForDoWhile.kt.after b/idea/testData/intentions/addBraces/addBracesForDoWhile.kt.after new file mode 100644 index 00000000000..543c8fdb9bb --- /dev/null +++ b/idea/testData/intentions/addBraces/addBracesForDoWhile.kt.after @@ -0,0 +1,5 @@ +fun foo() { + do { + println("test") + } while(true) +} \ No newline at end of file diff --git a/idea/testData/intentions/addBraces/addBracesForElse.kt b/idea/testData/intentions/addBraces/addBracesForElse.kt new file mode 100644 index 00000000000..52b358aaeaa --- /dev/null +++ b/idea/testData/intentions/addBraces/addBracesForElse.kt @@ -0,0 +1,4 @@ +fun foo() { + if (true) println("test") + else println("test2") +} \ No newline at end of file diff --git a/idea/testData/intentions/addBraces/addBracesForElse.kt.after b/idea/testData/intentions/addBraces/addBracesForElse.kt.after new file mode 100644 index 00000000000..c5aeaf5b674 --- /dev/null +++ b/idea/testData/intentions/addBraces/addBracesForElse.kt.after @@ -0,0 +1,6 @@ +fun foo() { + if (true) println("test") + else { + println("test2") + } +} \ No newline at end of file diff --git a/idea/testData/intentions/addBraces/addBracesForFor.kt b/idea/testData/intentions/addBraces/addBracesForFor.kt new file mode 100644 index 00000000000..6f47f1d54a2 --- /dev/null +++ b/idea/testData/intentions/addBraces/addBracesForFor.kt @@ -0,0 +1,4 @@ +fun foo() { + for (i in 1..4) + println("test") +} \ No newline at end of file diff --git a/idea/testData/intentions/addBraces/addBracesForFor.kt.after b/idea/testData/intentions/addBraces/addBracesForFor.kt.after new file mode 100644 index 00000000000..84f7dc503e3 --- /dev/null +++ b/idea/testData/intentions/addBraces/addBracesForFor.kt.after @@ -0,0 +1,5 @@ +fun foo() { + for (i in 1..4) { + println("test") + } +} \ No newline at end of file diff --git a/idea/testData/intentions/addBraces/addBracesForIf.kt b/idea/testData/intentions/addBraces/addBracesForIf.kt new file mode 100644 index 00000000000..95d00a3d237 --- /dev/null +++ b/idea/testData/intentions/addBraces/addBracesForIf.kt @@ -0,0 +1,3 @@ +fun foo() { + if (true) println("test") else println("test2") +} \ No newline at end of file diff --git a/idea/testData/intentions/addBraces/addBracesForIf.kt.after b/idea/testData/intentions/addBraces/addBracesForIf.kt.after new file mode 100644 index 00000000000..cc2cb2f8496 --- /dev/null +++ b/idea/testData/intentions/addBraces/addBracesForIf.kt.after @@ -0,0 +1,5 @@ +fun foo() { + if (true) { + println("test") + } else println("test2") +} \ No newline at end of file diff --git a/idea/testData/intentions/addBraces/addBracesForIfWithNoSpace.kt b/idea/testData/intentions/addBraces/addBracesForIfWithNoSpace.kt new file mode 100644 index 00000000000..34360126212 --- /dev/null +++ b/idea/testData/intentions/addBraces/addBracesForIfWithNoSpace.kt @@ -0,0 +1,3 @@ +fun foo() { + if (true)println("test") +} \ No newline at end of file diff --git a/idea/testData/intentions/addBraces/addBracesForIfWithNoSpace.kt.after b/idea/testData/intentions/addBraces/addBracesForIfWithNoSpace.kt.after new file mode 100644 index 00000000000..da3616d7d4e --- /dev/null +++ b/idea/testData/intentions/addBraces/addBracesForIfWithNoSpace.kt.after @@ -0,0 +1,5 @@ +fun foo() { + if (true) { + println("test") + } +} \ No newline at end of file diff --git a/idea/testData/intentions/addBraces/addBracesForIfWithSemicolon.kt b/idea/testData/intentions/addBraces/addBracesForIfWithSemicolon.kt new file mode 100644 index 00000000000..50fdc8059c0 --- /dev/null +++ b/idea/testData/intentions/addBraces/addBracesForIfWithSemicolon.kt @@ -0,0 +1,3 @@ +fun foo() { + if (true) println("test"); +} \ No newline at end of file diff --git a/idea/testData/intentions/addBraces/addBracesForIfWithSemicolon.kt.after b/idea/testData/intentions/addBraces/addBracesForIfWithSemicolon.kt.after new file mode 100644 index 00000000000..da3616d7d4e --- /dev/null +++ b/idea/testData/intentions/addBraces/addBracesForIfWithSemicolon.kt.after @@ -0,0 +1,5 @@ +fun foo() { + if (true) { + println("test") + } +} \ No newline at end of file diff --git a/idea/testData/intentions/addBraces/addBracesForWhile.kt b/idea/testData/intentions/addBraces/addBracesForWhile.kt new file mode 100644 index 00000000000..4dd43df78cf --- /dev/null +++ b/idea/testData/intentions/addBraces/addBracesForWhile.kt @@ -0,0 +1,4 @@ +fun foo() { + while (true) + println("test") +} \ No newline at end of file diff --git a/idea/testData/intentions/addBraces/addBracesForWhile.kt.after b/idea/testData/intentions/addBraces/addBracesForWhile.kt.after new file mode 100644 index 00000000000..bddcd93632f --- /dev/null +++ b/idea/testData/intentions/addBraces/addBracesForWhile.kt.after @@ -0,0 +1,5 @@ +fun foo() { + while (true) { + println("test") + } +} \ No newline at end of file diff --git a/idea/testData/intentions/addBraces/addBracesWithBraces.kt b/idea/testData/intentions/addBraces/addBracesWithBraces.kt new file mode 100644 index 00000000000..b1348c9aa58 --- /dev/null +++ b/idea/testData/intentions/addBraces/addBracesWithBraces.kt @@ -0,0 +1,6 @@ +// IS_APPLICABLE: false +fun foo() { + if (true) { + println("test") + } +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForDoWhile.kt b/idea/testData/intentions/removeBraces/removeBracesForDoWhile.kt new file mode 100644 index 00000000000..74cb3274a34 --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForDoWhile.kt @@ -0,0 +1,5 @@ +fun foo() { + do { + println("test") + } while(true) +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForDoWhile.kt.after b/idea/testData/intentions/removeBraces/removeBracesForDoWhile.kt.after new file mode 100644 index 00000000000..d6f116aac2f --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForDoWhile.kt.after @@ -0,0 +1,4 @@ +fun foo() { + do println("test") + while(true) +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForDoWhileWithTwoStatements.kt b/idea/testData/intentions/removeBraces/removeBracesForDoWhileWithTwoStatements.kt new file mode 100644 index 00000000000..6221971ac98 --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForDoWhileWithTwoStatements.kt @@ -0,0 +1,7 @@ +// IS_APPLICABLE: false +fun foo() { + do { + println("test") + println("test2") + } while(true) +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForElse.kt b/idea/testData/intentions/removeBraces/removeBracesForElse.kt new file mode 100644 index 00000000000..bb11287dce3 --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForElse.kt @@ -0,0 +1,7 @@ +fun foo() { + if (true) { + println("test") + } else { + println("test2") + } +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForElse.kt.after b/idea/testData/intentions/removeBraces/removeBracesForElse.kt.after new file mode 100644 index 00000000000..cc2cb2f8496 --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForElse.kt.after @@ -0,0 +1,5 @@ +fun foo() { + if (true) { + println("test") + } else println("test2") +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForFor.kt b/idea/testData/intentions/removeBraces/removeBracesForFor.kt new file mode 100644 index 00000000000..a92406306b1 --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForFor.kt @@ -0,0 +1,5 @@ +fun foo() { + for (i in 1..4) { + println("test") + } +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForFor.kt.after b/idea/testData/intentions/removeBraces/removeBracesForFor.kt.after new file mode 100644 index 00000000000..1476d615f20 --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForFor.kt.after @@ -0,0 +1,3 @@ +fun foo() { + for (i in 1..4) println("test") +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForIf.kt b/idea/testData/intentions/removeBraces/removeBracesForIf.kt new file mode 100644 index 00000000000..f109107e479 --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForIf.kt @@ -0,0 +1,5 @@ +fun foo() { + if (true) { + println("test") + } +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForIf.kt.after b/idea/testData/intentions/removeBraces/removeBracesForIf.kt.after new file mode 100644 index 00000000000..d03da0fa088 --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForIf.kt.after @@ -0,0 +1,3 @@ +fun foo() { + if (true) println("test") +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForIfWithComment.kt b/idea/testData/intentions/removeBraces/removeBracesForIfWithComment.kt new file mode 100644 index 00000000000..ff8570117c8 --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForIfWithComment.kt @@ -0,0 +1,6 @@ +fun foo() { + if (true) { + //comment + println("test") + } +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForIfWithComment.kt.after b/idea/testData/intentions/removeBraces/removeBracesForIfWithComment.kt.after new file mode 100644 index 00000000000..89481bb8a86 --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForIfWithComment.kt.after @@ -0,0 +1,4 @@ +fun foo() { + //comment + if (true) println("test") +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForIfWithNoStatement.kt b/idea/testData/intentions/removeBraces/removeBracesForIfWithNoStatement.kt new file mode 100644 index 00000000000..820d2486a00 --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForIfWithNoStatement.kt @@ -0,0 +1,4 @@ +// IS_APPLICABLE: false +fun foo() { + if (true) { } +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForIfWithSemicolon.kt b/idea/testData/intentions/removeBraces/removeBracesForIfWithSemicolon.kt new file mode 100644 index 00000000000..418b9bde4f4 --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForIfWithSemicolon.kt @@ -0,0 +1,5 @@ +fun foo() { + if (true) { + println("test"); + } +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForIfWithSemicolon.kt.after b/idea/testData/intentions/removeBraces/removeBracesForIfWithSemicolon.kt.after new file mode 100644 index 00000000000..d03da0fa088 --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForIfWithSemicolon.kt.after @@ -0,0 +1,3 @@ +fun foo() { + if (true) println("test") +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForIfWithTwoStatements.kt b/idea/testData/intentions/removeBraces/removeBracesForIfWithTwoStatements.kt new file mode 100644 index 00000000000..ddfe175ea74 --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForIfWithTwoStatements.kt @@ -0,0 +1,7 @@ +// IS_APPLICABLE: false +fun foo() { + if (true) { + println("test") + println("test2") + } +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForWhile.kt b/idea/testData/intentions/removeBraces/removeBracesForWhile.kt new file mode 100644 index 00000000000..43985b52d58 --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForWhile.kt @@ -0,0 +1,5 @@ +fun foo() { + while (true) { + println("test") + } +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForWhile.kt.after b/idea/testData/intentions/removeBraces/removeBracesForWhile.kt.after new file mode 100644 index 00000000000..bc8f9cdf094 --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForWhile.kt.after @@ -0,0 +1,3 @@ +fun foo() { + while (true) println("test") +} \ No newline at end of file diff --git a/idea/testData/intentions/removeBraces/removeBracesForWhileWithTwoStatements.kt b/idea/testData/intentions/removeBraces/removeBracesForWhileWithTwoStatements.kt new file mode 100644 index 00000000000..cde3d69262c --- /dev/null +++ b/idea/testData/intentions/removeBraces/removeBracesForWhileWithTwoStatements.kt @@ -0,0 +1,7 @@ +// IS_APPLICABLE: false +fun foo() { + while (true) { + println("test") + println("test2") + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/intentions/AbstractCodeTransformationTest.java b/idea/tests/org/jetbrains/jet/plugin/intentions/AbstractCodeTransformationTest.java index 8a409641073..7602d8f9c0a 100644 --- a/idea/tests/org/jetbrains/jet/plugin/intentions/AbstractCodeTransformationTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/intentions/AbstractCodeTransformationTest.java @@ -151,6 +151,14 @@ public abstract class AbstractCodeTransformationTest extends LightCodeInsightTes doTestIntention(path, new ReplaceItWithExplicitFunctionLiteralParamIntention()); } + public void doTestRemoveBraces(@NotNull String path) throws Exception { + doTestIntention(path, new RemoveBracesIntention()); + } + + public void doTestAddBraces(@NotNull String path) throws Exception { + doTestIntention(path, new AddBracesIntention()); + } + private void doTestIntention(@NotNull String path, @NotNull IntentionAction intentionAction) throws Exception { configureByFile(path); diff --git a/idea/tests/org/jetbrains/jet/plugin/intentions/CodeTransformationTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/intentions/CodeTransformationTestGenerated.java index efea2539d93..44901d93781 100644 --- a/idea/tests/org/jetbrains/jet/plugin/intentions/CodeTransformationTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/intentions/CodeTransformationTestGenerated.java @@ -30,7 +30,7 @@ import org.jetbrains.jet.plugin.intentions.AbstractCodeTransformationTest; /** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") -@InnerTestClasses({CodeTransformationTestGenerated.IfToAssignment.class, CodeTransformationTestGenerated.IfToReturn.class, CodeTransformationTestGenerated.IfToReturnAsymmetrically.class, CodeTransformationTestGenerated.WhenToAssignment.class, CodeTransformationTestGenerated.WhenToReturn.class, CodeTransformationTestGenerated.AssignmentToIf.class, CodeTransformationTestGenerated.AssignmentToWhen.class, CodeTransformationTestGenerated.PropertyToIf.class, CodeTransformationTestGenerated.PropertyToWhen.class, CodeTransformationTestGenerated.ReturnToIf.class, CodeTransformationTestGenerated.ReturnToWhen.class, CodeTransformationTestGenerated.IfToWhen.class, CodeTransformationTestGenerated.WhenToIf.class, CodeTransformationTestGenerated.Flatten.class, CodeTransformationTestGenerated.Merge.class, CodeTransformationTestGenerated.IntroduceSubject.class, CodeTransformationTestGenerated.EliminateSubject.class, CodeTransformationTestGenerated.Split.class, CodeTransformationTestGenerated.Join.class, CodeTransformationTestGenerated.ConvertMemberToExtension.class, CodeTransformationTestGenerated.ReconstructedType.class, CodeTransformationTestGenerated.RemoveUnnecessaryParentheses.class, CodeTransformationTestGenerated.ReplaceWithDotQualifiedMethodCall.class, CodeTransformationTestGenerated.ReplaceWithInfixFunctionCall.class, CodeTransformationTestGenerated.RemoveCurlyBracesFromTemplate.class, CodeTransformationTestGenerated.MoveLambdaInsideParentheses.class, CodeTransformationTestGenerated.MoveLambdaOutsideParentheses.class, CodeTransformationTestGenerated.ReplaceExplicitFunctionLiteralParamWithIt.class, CodeTransformationTestGenerated.ReplaceItWithExplicitFunctionLiteralParam.class}) +@InnerTestClasses({CodeTransformationTestGenerated.IfToAssignment.class, CodeTransformationTestGenerated.IfToReturn.class, CodeTransformationTestGenerated.IfToReturnAsymmetrically.class, CodeTransformationTestGenerated.WhenToAssignment.class, CodeTransformationTestGenerated.WhenToReturn.class, CodeTransformationTestGenerated.AssignmentToIf.class, CodeTransformationTestGenerated.AssignmentToWhen.class, CodeTransformationTestGenerated.PropertyToIf.class, CodeTransformationTestGenerated.PropertyToWhen.class, CodeTransformationTestGenerated.ReturnToIf.class, CodeTransformationTestGenerated.ReturnToWhen.class, CodeTransformationTestGenerated.IfToWhen.class, CodeTransformationTestGenerated.WhenToIf.class, CodeTransformationTestGenerated.Flatten.class, CodeTransformationTestGenerated.Merge.class, CodeTransformationTestGenerated.IntroduceSubject.class, CodeTransformationTestGenerated.EliminateSubject.class, CodeTransformationTestGenerated.Split.class, CodeTransformationTestGenerated.Join.class, CodeTransformationTestGenerated.ConvertMemberToExtension.class, CodeTransformationTestGenerated.ReconstructedType.class, CodeTransformationTestGenerated.RemoveUnnecessaryParentheses.class, CodeTransformationTestGenerated.ReplaceWithDotQualifiedMethodCall.class, CodeTransformationTestGenerated.ReplaceWithInfixFunctionCall.class, CodeTransformationTestGenerated.RemoveCurlyBracesFromTemplate.class, CodeTransformationTestGenerated.MoveLambdaInsideParentheses.class, CodeTransformationTestGenerated.MoveLambdaOutsideParentheses.class, CodeTransformationTestGenerated.ReplaceExplicitFunctionLiteralParamWithIt.class, CodeTransformationTestGenerated.ReplaceItWithExplicitFunctionLiteralParam.class, CodeTransformationTestGenerated.RemoveBraces.class, CodeTransformationTestGenerated.AddBraces.class}) public class CodeTransformationTestGenerated extends AbstractCodeTransformationTest { @TestMetadata("idea/testData/intentions/branched/folding/ifToAssignment") public static class IfToAssignment extends AbstractCodeTransformationTest { @@ -1559,6 +1559,117 @@ public class CodeTransformationTestGenerated extends AbstractCodeTransformationT } + @TestMetadata("idea/testData/intentions/removeBraces") + public static class RemoveBraces extends AbstractCodeTransformationTest { + public void testAllFilesPresentInRemoveBraces() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/intentions/removeBraces"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("removeBracesForDoWhile.kt") + public void testRemoveBracesForDoWhile() throws Exception { + doTestRemoveBraces("idea/testData/intentions/removeBraces/removeBracesForDoWhile.kt"); + } + + @TestMetadata("removeBracesForDoWhileWithTwoStatements.kt") + public void testRemoveBracesForDoWhileWithTwoStatements() throws Exception { + doTestRemoveBraces("idea/testData/intentions/removeBraces/removeBracesForDoWhileWithTwoStatements.kt"); + } + + @TestMetadata("removeBracesForElse.kt") + public void testRemoveBracesForElse() throws Exception { + doTestRemoveBraces("idea/testData/intentions/removeBraces/removeBracesForElse.kt"); + } + + @TestMetadata("removeBracesForFor.kt") + public void testRemoveBracesForFor() throws Exception { + doTestRemoveBraces("idea/testData/intentions/removeBraces/removeBracesForFor.kt"); + } + + @TestMetadata("removeBracesForIf.kt") + public void testRemoveBracesForIf() throws Exception { + doTestRemoveBraces("idea/testData/intentions/removeBraces/removeBracesForIf.kt"); + } + + @TestMetadata("removeBracesForIfWithComment.kt") + public void testRemoveBracesForIfWithComment() throws Exception { + doTestRemoveBraces("idea/testData/intentions/removeBraces/removeBracesForIfWithComment.kt"); + } + + @TestMetadata("removeBracesForIfWithNoStatement.kt") + public void testRemoveBracesForIfWithNoStatement() throws Exception { + doTestRemoveBraces("idea/testData/intentions/removeBraces/removeBracesForIfWithNoStatement.kt"); + } + + @TestMetadata("removeBracesForIfWithSemicolon.kt") + public void testRemoveBracesForIfWithSemicolon() throws Exception { + doTestRemoveBraces("idea/testData/intentions/removeBraces/removeBracesForIfWithSemicolon.kt"); + } + + @TestMetadata("removeBracesForIfWithTwoStatements.kt") + public void testRemoveBracesForIfWithTwoStatements() throws Exception { + doTestRemoveBraces("idea/testData/intentions/removeBraces/removeBracesForIfWithTwoStatements.kt"); + } + + @TestMetadata("removeBracesForWhile.kt") + public void testRemoveBracesForWhile() throws Exception { + doTestRemoveBraces("idea/testData/intentions/removeBraces/removeBracesForWhile.kt"); + } + + @TestMetadata("removeBracesForWhileWithTwoStatements.kt") + public void testRemoveBracesForWhileWithTwoStatements() throws Exception { + doTestRemoveBraces("idea/testData/intentions/removeBraces/removeBracesForWhileWithTwoStatements.kt"); + } + + } + + @TestMetadata("idea/testData/intentions/addBraces") + public static class AddBraces extends AbstractCodeTransformationTest { + @TestMetadata("addBracesForDoWhile.kt") + public void testAddBracesForDoWhile() throws Exception { + doTestAddBraces("idea/testData/intentions/addBraces/addBracesForDoWhile.kt"); + } + + @TestMetadata("addBracesForElse.kt") + public void testAddBracesForElse() throws Exception { + doTestAddBraces("idea/testData/intentions/addBraces/addBracesForElse.kt"); + } + + @TestMetadata("addBracesForFor.kt") + public void testAddBracesForFor() throws Exception { + doTestAddBraces("idea/testData/intentions/addBraces/addBracesForFor.kt"); + } + + @TestMetadata("addBracesForIf.kt") + public void testAddBracesForIf() throws Exception { + doTestAddBraces("idea/testData/intentions/addBraces/addBracesForIf.kt"); + } + + @TestMetadata("addBracesForIfWithNoSpace.kt") + public void testAddBracesForIfWithNoSpace() throws Exception { + doTestAddBraces("idea/testData/intentions/addBraces/addBracesForIfWithNoSpace.kt"); + } + + @TestMetadata("addBracesForIfWithSemicolon.kt") + public void testAddBracesForIfWithSemicolon() throws Exception { + doTestAddBraces("idea/testData/intentions/addBraces/addBracesForIfWithSemicolon.kt"); + } + + @TestMetadata("addBracesForWhile.kt") + public void testAddBracesForWhile() throws Exception { + doTestAddBraces("idea/testData/intentions/addBraces/addBracesForWhile.kt"); + } + + @TestMetadata("addBracesWithBraces.kt") + public void testAddBracesWithBraces() throws Exception { + doTestAddBraces("idea/testData/intentions/addBraces/addBracesWithBraces.kt"); + } + + public void testAllFilesPresentInAddBraces() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/intentions/addBraces"), Pattern.compile("^(.+)\\.kt$"), true); + } + + } + public static Test suite() { TestSuite suite = new TestSuite("CodeTransformationTestGenerated"); suite.addTestSuite(IfToAssignment.class); @@ -1590,6 +1701,8 @@ public class CodeTransformationTestGenerated extends AbstractCodeTransformationT suite.addTestSuite(MoveLambdaOutsideParentheses.class); suite.addTestSuite(ReplaceExplicitFunctionLiteralParamWithIt.class); suite.addTestSuite(ReplaceItWithExplicitFunctionLiteralParam.class); + suite.addTestSuite(RemoveBraces.class); + suite.addTestSuite(AddBraces.class); return suite; } }