Refactored branched folding intentions into separate files and inlining methods from util
This commit is contained in:
+4
-162
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.psi.*
|
|||||||
|
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
|
|
||||||
public object BranchedFoldingUtils {
|
object BranchedFoldingUtils {
|
||||||
private val CHECK_ASSIGNMENT = object : Predicate<JetElement> {
|
private val CHECK_ASSIGNMENT = object : Predicate<JetElement> {
|
||||||
override fun apply(input: JetElement): Boolean {
|
override fun apply(input: JetElement): Boolean {
|
||||||
if (!JetPsiUtil.isAssignment(input)) return false
|
if (!JetPsiUtil.isAssignment(input)) return false
|
||||||
@@ -41,175 +41,17 @@ public object BranchedFoldingUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getFoldableBranchedAssignment(branch: JetExpression?): JetBinaryExpression? {
|
public fun getFoldableBranchedAssignment(branch: JetExpression?): JetBinaryExpression? {
|
||||||
return JetPsiUtil.getOutermostLastBlockElement(branch, CHECK_ASSIGNMENT) as JetBinaryExpression?
|
return JetPsiUtil.getOutermostLastBlockElement(branch, CHECK_ASSIGNMENT) as JetBinaryExpression?
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getFoldableBranchedReturn(branch: JetExpression?): JetReturnExpression? {
|
public fun getFoldableBranchedReturn(branch: JetExpression?): JetReturnExpression? {
|
||||||
return JetPsiUtil.getOutermostLastBlockElement(branch) {
|
return JetPsiUtil.getOutermostLastBlockElement(branch) {
|
||||||
(it as? JetReturnExpression)?.getReturnedExpression() != null
|
(it as? JetReturnExpression)?.getReturnedExpression() != null
|
||||||
} as JetReturnExpression?
|
} as JetReturnExpression?
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkAssignmentsMatch(a1: JetBinaryExpression, a2: JetBinaryExpression): Boolean {
|
public fun checkAssignmentsMatch(a1: JetBinaryExpression, a2: JetBinaryExpression): Boolean {
|
||||||
return a1.getLeft()?.getText() == a2.getLeft()?.getText() && a1.getOperationToken() == a2.getOperationToken()
|
return a1.getLeft()?.getText() == a2.getLeft()?.getText() && a1.getOperationToken() == a2.getOperationToken()
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun checkFoldableIfExpressionWithAssignments(ifExpression: JetIfExpression): Boolean {
|
|
||||||
val thenBranch = ifExpression.getThen()
|
|
||||||
val elseBranch = ifExpression.getElse()
|
|
||||||
|
|
||||||
val thenAssignment = getFoldableBranchedAssignment(thenBranch)
|
|
||||||
val elseAssignment = getFoldableBranchedAssignment(elseBranch)
|
|
||||||
|
|
||||||
if (thenAssignment == null || elseAssignment == null) return false
|
|
||||||
|
|
||||||
return checkAssignmentsMatch(thenAssignment, elseAssignment)
|
|
||||||
}
|
|
||||||
|
|
||||||
public fun checkFoldableWhenExpressionWithAssignments(whenExpression: JetWhenExpression): Boolean {
|
|
||||||
if (!JetPsiUtil.checkWhenExpressionHasSingleElse(whenExpression)) return false
|
|
||||||
|
|
||||||
val entries = whenExpression.getEntries()
|
|
||||||
|
|
||||||
if (entries.isEmpty()) return false
|
|
||||||
|
|
||||||
val assignments = ArrayList<JetBinaryExpression>()
|
|
||||||
for (entry in entries) {
|
|
||||||
val assignment = getFoldableBranchedAssignment(entry.getExpression()) ?: return false
|
|
||||||
assignments.add(assignment)
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(!assignments.isEmpty())
|
|
||||||
|
|
||||||
val firstAssignment = assignments.get(0)
|
|
||||||
for (assignment in assignments) {
|
|
||||||
if (!checkAssignmentsMatch(assignment, firstAssignment)) return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
public fun checkFoldableIfExpressionWithReturns(ifExpression: JetIfExpression): Boolean {
|
|
||||||
return getFoldableBranchedReturn(ifExpression.getThen()) != null && getFoldableBranchedReturn(ifExpression.getElse()) != null
|
|
||||||
}
|
|
||||||
|
|
||||||
public fun checkFoldableWhenExpressionWithReturns(whenExpression: JetWhenExpression): Boolean {
|
|
||||||
if (!JetPsiUtil.checkWhenExpressionHasSingleElse(whenExpression)) return false
|
|
||||||
|
|
||||||
val entries = whenExpression.getEntries()
|
|
||||||
|
|
||||||
if (entries.isEmpty()) return false
|
|
||||||
|
|
||||||
for (entry in entries) {
|
|
||||||
if (getFoldableBranchedReturn(entry.getExpression()) == null) return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
public fun checkFoldableIfExpressionWithAsymmetricReturns(ifExpression: JetIfExpression): Boolean {
|
|
||||||
if (getFoldableBranchedReturn(ifExpression.getThen()) == null || ifExpression.getElse() != null) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
val nextElement = JetPsiUtil.skipTrailingWhitespacesAndComments(ifExpression)
|
|
||||||
return (nextElement is JetExpression) && getFoldableBranchedReturn(nextElement) != null
|
|
||||||
}
|
|
||||||
|
|
||||||
public fun foldIfExpressionWithAssignments(ifExpression: JetIfExpression) {
|
|
||||||
var thenAssignment = getFoldableBranchedAssignment(ifExpression.getThen()!!)!!
|
|
||||||
|
|
||||||
val op = thenAssignment.getOperationReference().getText()
|
|
||||||
val lhs = thenAssignment.getLeft() as JetSimpleNameExpression
|
|
||||||
|
|
||||||
val assignment = JetPsiFactory(ifExpression).createExpressionByPattern("$0 $1 $2", lhs, op, ifExpression)
|
|
||||||
val newIfExpression = (assignment as JetBinaryExpression).getRight() as JetIfExpression
|
|
||||||
|
|
||||||
thenAssignment = getFoldableBranchedAssignment(newIfExpression.getThen()!!)!!
|
|
||||||
val elseAssignment = getFoldableBranchedAssignment(newIfExpression.getElse()!!)!!
|
|
||||||
|
|
||||||
val thenRhs = thenAssignment.getRight()!!
|
|
||||||
val elseRhs = elseAssignment.getRight()!!
|
|
||||||
|
|
||||||
thenAssignment.replace(thenRhs)
|
|
||||||
elseAssignment.replace(elseRhs)
|
|
||||||
|
|
||||||
ifExpression.replace(assignment)
|
|
||||||
}
|
|
||||||
|
|
||||||
public fun foldIfExpressionWithReturns(ifExpression: JetIfExpression) {
|
|
||||||
val newReturnExpression = JetPsiFactory(ifExpression).createReturn(ifExpression)
|
|
||||||
val newIfExpression = newReturnExpression.getReturnedExpression() as JetIfExpression
|
|
||||||
|
|
||||||
val thenReturn = getFoldableBranchedReturn(newIfExpression.getThen()!!)!!
|
|
||||||
val elseReturn = getFoldableBranchedReturn(newIfExpression.getElse()!!)!!
|
|
||||||
|
|
||||||
val thenExpr = thenReturn.getReturnedExpression()!!
|
|
||||||
val elseExpr = elseReturn.getReturnedExpression()!!
|
|
||||||
|
|
||||||
thenReturn.replace(thenExpr)
|
|
||||||
elseReturn.replace(elseExpr)
|
|
||||||
|
|
||||||
ifExpression.replace(newReturnExpression)
|
|
||||||
}
|
|
||||||
|
|
||||||
public fun foldIfExpressionWithAsymmetricReturns(ifExpression: JetIfExpression) {
|
|
||||||
val condition = ifExpression.getCondition()!!
|
|
||||||
val thenRoot = ifExpression.getThen()!!
|
|
||||||
val elseRoot = JetPsiUtil.skipTrailingWhitespacesAndComments(ifExpression) as JetExpression
|
|
||||||
|
|
||||||
val psiFactory = JetPsiFactory(ifExpression)
|
|
||||||
var newIfExpression = psiFactory.createIf(condition, thenRoot, elseRoot)
|
|
||||||
val newReturnExpression = psiFactory.createReturn(newIfExpression)
|
|
||||||
|
|
||||||
newIfExpression = newReturnExpression.getReturnedExpression() as JetIfExpression
|
|
||||||
|
|
||||||
val thenReturn = getFoldableBranchedReturn(newIfExpression.getThen()!!)!!
|
|
||||||
val elseReturn = getFoldableBranchedReturn(newIfExpression.getElse()!!)!!
|
|
||||||
|
|
||||||
val thenExpr = thenReturn.getReturnedExpression()!!
|
|
||||||
val elseExpr = elseReturn.getReturnedExpression()!!
|
|
||||||
|
|
||||||
thenReturn.replace(thenExpr)
|
|
||||||
elseReturn.replace(elseExpr)
|
|
||||||
|
|
||||||
elseRoot.delete()
|
|
||||||
ifExpression.replace(newReturnExpression)
|
|
||||||
}
|
|
||||||
|
|
||||||
public fun foldWhenExpressionWithAssignments(whenExpression: JetWhenExpression) {
|
|
||||||
assert(!whenExpression.getEntries().isEmpty())
|
|
||||||
|
|
||||||
val firstAssignment = getFoldableBranchedAssignment(whenExpression.getEntries().get(0).getExpression()!!)!!
|
|
||||||
|
|
||||||
val op = firstAssignment.getOperationReference().getText()
|
|
||||||
val lhs = firstAssignment.getLeft() as JetSimpleNameExpression
|
|
||||||
|
|
||||||
val assignment = JetPsiFactory(whenExpression).createExpressionByPattern("$0 $1 $2", lhs, op, whenExpression)
|
|
||||||
val newWhenExpression = (assignment as JetBinaryExpression).getRight() as JetWhenExpression
|
|
||||||
|
|
||||||
for (entry in newWhenExpression.getEntries()) {
|
|
||||||
val currAssignment = getFoldableBranchedAssignment(entry.getExpression()!!)!!
|
|
||||||
val currRhs = currAssignment.getRight()!!
|
|
||||||
currAssignment.replace(currRhs)
|
|
||||||
}
|
|
||||||
|
|
||||||
whenExpression.replace(assignment)
|
|
||||||
}
|
|
||||||
|
|
||||||
public fun foldWhenExpressionWithReturns(whenExpression: JetWhenExpression) {
|
|
||||||
assert(!whenExpression.getEntries().isEmpty())
|
|
||||||
|
|
||||||
val newReturnExpression = JetPsiFactory(whenExpression).createReturn(whenExpression)
|
|
||||||
val newWhenExpression = newReturnExpression.getReturnedExpression() as JetWhenExpression
|
|
||||||
|
|
||||||
for (entry in newWhenExpression.getEntries()) {
|
|
||||||
val currReturn = getFoldableBranchedReturn(entry.getExpression()!!)!!
|
|
||||||
val currExpr = currReturn.getReturnedExpression()!!
|
|
||||||
currReturn.replace(currExpr)
|
|
||||||
}
|
|
||||||
|
|
||||||
whenExpression.replace(newReturnExpression)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
-75
@@ -1,75 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2015 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.kotlin.idea.intentions.branchedTransformations.intentions
|
|
||||||
|
|
||||||
import com.intellij.openapi.editor.Editor
|
|
||||||
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
|
|
||||||
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.BranchedFoldingUtils
|
|
||||||
import org.jetbrains.kotlin.psi.JetExpression
|
|
||||||
import org.jetbrains.kotlin.psi.JetFile
|
|
||||||
import org.jetbrains.kotlin.psi.JetIfExpression
|
|
||||||
import org.jetbrains.kotlin.psi.JetWhenExpression
|
|
||||||
|
|
||||||
public class FoldIfToAssignmentIntention : JetSelfTargetingOffsetIndependentIntention<JetIfExpression>(javaClass(), "Replace 'if' expression with assignment") {
|
|
||||||
override fun isApplicableTo(element: JetIfExpression): Boolean {
|
|
||||||
return BranchedFoldingUtils.checkFoldableIfExpressionWithAssignments(element)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun applyTo(element: JetIfExpression, editor: Editor) {
|
|
||||||
BranchedFoldingUtils.foldIfExpressionWithAssignments(element)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class FoldIfToReturnAsymmetricallyIntention : JetSelfTargetingOffsetIndependentIntention<JetIfExpression>(javaClass(), "Replace 'if' expression with return") {
|
|
||||||
override fun isApplicableTo(element: JetIfExpression): Boolean {
|
|
||||||
return BranchedFoldingUtils.checkFoldableIfExpressionWithAsymmetricReturns(element)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun applyTo(element: JetIfExpression, editor: Editor) {
|
|
||||||
BranchedFoldingUtils.foldIfExpressionWithAsymmetricReturns(element)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class FoldIfToReturnIntention : JetSelfTargetingOffsetIndependentIntention<JetIfExpression>(javaClass(), "Replace 'if' expression with return") {
|
|
||||||
override fun isApplicableTo(element: JetIfExpression): Boolean {
|
|
||||||
return BranchedFoldingUtils.checkFoldableIfExpressionWithReturns(element)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun applyTo(element: JetIfExpression, editor: Editor) {
|
|
||||||
BranchedFoldingUtils.foldIfExpressionWithReturns(element)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class FoldWhenToAssignmentIntention : JetSelfTargetingOffsetIndependentIntention<JetWhenExpression>(javaClass(), "Replace 'when' expression with assignment") {
|
|
||||||
override fun isApplicableTo(element: JetWhenExpression): Boolean {
|
|
||||||
return BranchedFoldingUtils.checkFoldableWhenExpressionWithAssignments(element)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun applyTo(element: JetWhenExpression, editor: Editor) {
|
|
||||||
BranchedFoldingUtils.foldWhenExpressionWithAssignments(element)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class FoldWhenToReturnIntention : JetSelfTargetingOffsetIndependentIntention<JetWhenExpression>(javaClass(), "Replace 'when' expression with return") {
|
|
||||||
override fun isApplicableTo(element: JetWhenExpression): Boolean {
|
|
||||||
return BranchedFoldingUtils.checkFoldableWhenExpressionWithReturns(element)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun applyTo(element: JetWhenExpression, editor: Editor) {
|
|
||||||
BranchedFoldingUtils.foldWhenExpressionWithReturns(element)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+61
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2015 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.kotlin.idea.intentions.branchedTransformations.intentions
|
||||||
|
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
|
||||||
|
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.BranchedFoldingUtils
|
||||||
|
import org.jetbrains.kotlin.psi
|
||||||
|
import org.jetbrains.kotlin.psi.JetBinaryExpression
|
||||||
|
import org.jetbrains.kotlin.psi.JetIfExpression
|
||||||
|
import org.jetbrains.kotlin.psi.JetSimpleNameExpression
|
||||||
|
import org.jetbrains.kotlin.psi.createExpressionByPattern
|
||||||
|
|
||||||
|
public class FoldIfToAssignmentIntention : JetSelfTargetingOffsetIndependentIntention<JetIfExpression>(javaClass(), "Replace 'if' expression with assignment") {
|
||||||
|
override fun isApplicableTo(element: JetIfExpression): Boolean {
|
||||||
|
val thenBranch = element.getThen()
|
||||||
|
val elseBranch = element.getElse()
|
||||||
|
|
||||||
|
val thenAssignment = BranchedFoldingUtils.getFoldableBranchedAssignment(thenBranch)
|
||||||
|
val elseAssignment = BranchedFoldingUtils.getFoldableBranchedAssignment(elseBranch)
|
||||||
|
|
||||||
|
if (thenAssignment == null || elseAssignment == null) return false
|
||||||
|
|
||||||
|
return BranchedFoldingUtils.checkAssignmentsMatch(thenAssignment, elseAssignment)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun applyTo(element: JetIfExpression, editor: Editor) {
|
||||||
|
var thenAssignment = BranchedFoldingUtils.getFoldableBranchedAssignment(element.getThen()!!)!!
|
||||||
|
|
||||||
|
val op = thenAssignment.getOperationReference().getText()
|
||||||
|
val lhs = thenAssignment.getLeft() as JetSimpleNameExpression
|
||||||
|
|
||||||
|
val assignment = psi.JetPsiFactory(element).createExpressionByPattern("$0 $1 $2", lhs, op, element)
|
||||||
|
val newIfExpression = (assignment as JetBinaryExpression).getRight() as JetIfExpression
|
||||||
|
|
||||||
|
thenAssignment = BranchedFoldingUtils.getFoldableBranchedAssignment(newIfExpression.getThen()!!)!!
|
||||||
|
val elseAssignment = BranchedFoldingUtils.getFoldableBranchedAssignment(newIfExpression.getElse()!!)!!
|
||||||
|
|
||||||
|
val thenRhs = thenAssignment.getRight()!!
|
||||||
|
val elseRhs = elseAssignment.getRight()!!
|
||||||
|
|
||||||
|
thenAssignment.replace(thenRhs)
|
||||||
|
elseAssignment.replace(elseRhs)
|
||||||
|
|
||||||
|
element.replace(assignment)
|
||||||
|
}
|
||||||
|
}
|
||||||
+60
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2015 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.kotlin.idea.intentions.branchedTransformations.intentions
|
||||||
|
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
|
||||||
|
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.BranchedFoldingUtils
|
||||||
|
import org.jetbrains.kotlin.psi
|
||||||
|
import org.jetbrains.kotlin.psi.JetExpression
|
||||||
|
import org.jetbrains.kotlin.psi.JetIfExpression
|
||||||
|
import org.jetbrains.kotlin.psi.JetPsiUtil
|
||||||
|
|
||||||
|
public class FoldIfToReturnAsymmetricallyIntention : JetSelfTargetingOffsetIndependentIntention<JetIfExpression>(javaClass(), "Replace 'if' expression with return") {
|
||||||
|
override fun isApplicableTo(element: JetIfExpression): Boolean {
|
||||||
|
if (BranchedFoldingUtils.getFoldableBranchedReturn(element.getThen()) == null || element.getElse() != null) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
val nextElement = JetPsiUtil.skipTrailingWhitespacesAndComments(element)
|
||||||
|
return nextElement is JetExpression && BranchedFoldingUtils.getFoldableBranchedReturn(nextElement) != null
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun applyTo(element: JetIfExpression, editor: Editor) {
|
||||||
|
val condition = element.getCondition()!!
|
||||||
|
val thenRoot = element.getThen()!!
|
||||||
|
val elseRoot = JetPsiUtil.skipTrailingWhitespacesAndComments(element) as JetExpression
|
||||||
|
|
||||||
|
val psiFactory = psi.JetPsiFactory(element)
|
||||||
|
var newIfExpression = psiFactory.createIf(condition, thenRoot, elseRoot)
|
||||||
|
val newReturnExpression = psiFactory.createReturn(newIfExpression)
|
||||||
|
|
||||||
|
newIfExpression = newReturnExpression.getReturnedExpression() as JetIfExpression
|
||||||
|
|
||||||
|
val thenReturn = BranchedFoldingUtils.getFoldableBranchedReturn(newIfExpression.getThen()!!)!!
|
||||||
|
val elseReturn = BranchedFoldingUtils.getFoldableBranchedReturn(newIfExpression.getElse()!!)!!
|
||||||
|
|
||||||
|
val thenExpr = thenReturn.getReturnedExpression()!!
|
||||||
|
val elseExpr = elseReturn.getReturnedExpression()!!
|
||||||
|
|
||||||
|
thenReturn.replace(thenExpr)
|
||||||
|
elseReturn.replace(elseExpr)
|
||||||
|
|
||||||
|
elseRoot.delete()
|
||||||
|
element.replace(newReturnExpression)
|
||||||
|
}
|
||||||
|
}
|
||||||
+46
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2015 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.kotlin.idea.intentions.branchedTransformations.intentions
|
||||||
|
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
|
||||||
|
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.BranchedFoldingUtils
|
||||||
|
import org.jetbrains.kotlin.psi.JetIfExpression
|
||||||
|
import org.jetbrains.kotlin.psi.JetPsiFactory
|
||||||
|
|
||||||
|
public class FoldIfToReturnIntention : JetSelfTargetingOffsetIndependentIntention<JetIfExpression>(javaClass(), "Replace 'if' expression with return") {
|
||||||
|
override fun isApplicableTo(element: JetIfExpression): Boolean {
|
||||||
|
return BranchedFoldingUtils.getFoldableBranchedReturn(element.getThen()) != null
|
||||||
|
&& BranchedFoldingUtils.getFoldableBranchedReturn(element.getElse()) != null
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun applyTo(element: JetIfExpression, editor: Editor) {
|
||||||
|
val newReturnExpression = JetPsiFactory(element).createReturn(element)
|
||||||
|
val newIfExpression = newReturnExpression.getReturnedExpression() as JetIfExpression
|
||||||
|
|
||||||
|
val thenReturn = BranchedFoldingUtils.getFoldableBranchedReturn(newIfExpression.getThen()!!)!!
|
||||||
|
val elseReturn = BranchedFoldingUtils.getFoldableBranchedReturn(newIfExpression.getElse()!!)!!
|
||||||
|
|
||||||
|
val thenExpr = thenReturn.getReturnedExpression()!!
|
||||||
|
val elseExpr = elseReturn.getReturnedExpression()!!
|
||||||
|
|
||||||
|
thenReturn.replace(thenExpr)
|
||||||
|
elseReturn.replace(elseExpr)
|
||||||
|
|
||||||
|
element.replace(newReturnExpression)
|
||||||
|
}
|
||||||
|
}
|
||||||
+68
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2015 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.kotlin.idea.intentions.branchedTransformations.intentions
|
||||||
|
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
|
||||||
|
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.BranchedFoldingUtils
|
||||||
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import java.util.ArrayList
|
||||||
|
|
||||||
|
public class FoldWhenToAssignmentIntention : JetSelfTargetingOffsetIndependentIntention<JetWhenExpression>(javaClass(), "Replace 'when' expression with assignment") {
|
||||||
|
override fun isApplicableTo(element: JetWhenExpression): Boolean {
|
||||||
|
if (!JetPsiUtil.checkWhenExpressionHasSingleElse(element)) return false
|
||||||
|
|
||||||
|
val entries = element.getEntries()
|
||||||
|
|
||||||
|
if (entries.isEmpty()) return false
|
||||||
|
|
||||||
|
val assignments = ArrayList<JetBinaryExpression>()
|
||||||
|
for (entry in entries) {
|
||||||
|
val assignment = BranchedFoldingUtils.getFoldableBranchedAssignment(entry.getExpression()) ?: return false
|
||||||
|
assignments.add(assignment)
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(!assignments.isEmpty())
|
||||||
|
|
||||||
|
val firstAssignment = assignments.get(0)
|
||||||
|
for (assignment in assignments) {
|
||||||
|
if (!BranchedFoldingUtils.checkAssignmentsMatch(assignment, firstAssignment)) return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun applyTo(element: JetWhenExpression, editor: Editor) {
|
||||||
|
assert(!element.getEntries().isEmpty())
|
||||||
|
|
||||||
|
val firstAssignment = BranchedFoldingUtils.getFoldableBranchedAssignment(element.getEntries().get(0).getExpression()!!)!!
|
||||||
|
|
||||||
|
val op = firstAssignment.getOperationReference().getText()
|
||||||
|
val lhs = firstAssignment.getLeft() as JetSimpleNameExpression
|
||||||
|
|
||||||
|
val assignment = JetPsiFactory(element).createExpressionByPattern("$0 $1 $2", lhs, op, element)
|
||||||
|
val newWhenExpression = (assignment as JetBinaryExpression).getRight() as JetWhenExpression
|
||||||
|
|
||||||
|
for (entry in newWhenExpression.getEntries()) {
|
||||||
|
val currAssignment = BranchedFoldingUtils.getFoldableBranchedAssignment(entry.getExpression()!!)!!
|
||||||
|
val currRhs = currAssignment.getRight()!!
|
||||||
|
currAssignment.replace(currRhs)
|
||||||
|
}
|
||||||
|
|
||||||
|
element.replace(assignment)
|
||||||
|
}
|
||||||
|
}
|
||||||
+55
@@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2015 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.kotlin.idea.intentions.branchedTransformations.intentions
|
||||||
|
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
|
||||||
|
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.BranchedFoldingUtils
|
||||||
|
import org.jetbrains.kotlin.psi
|
||||||
|
import org.jetbrains.kotlin.psi.JetPsiUtil
|
||||||
|
import org.jetbrains.kotlin.psi.JetWhenExpression
|
||||||
|
|
||||||
|
public class FoldWhenToReturnIntention : JetSelfTargetingOffsetIndependentIntention<JetWhenExpression>(javaClass(), "Replace 'when' expression with return") {
|
||||||
|
override fun isApplicableTo(element: JetWhenExpression): Boolean {
|
||||||
|
if (!JetPsiUtil.checkWhenExpressionHasSingleElse(element)) return false
|
||||||
|
|
||||||
|
val entries = element.getEntries()
|
||||||
|
|
||||||
|
if (entries.isEmpty()) return false
|
||||||
|
|
||||||
|
for (entry in entries) {
|
||||||
|
if (BranchedFoldingUtils.getFoldableBranchedReturn(entry.getExpression()) == null) return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun applyTo(element: JetWhenExpression, editor: Editor) {
|
||||||
|
assert(!element.getEntries().isEmpty())
|
||||||
|
|
||||||
|
val newReturnExpression = psi.JetPsiFactory(element).createReturn(element)
|
||||||
|
val newWhenExpression = newReturnExpression.getReturnedExpression() as JetWhenExpression
|
||||||
|
|
||||||
|
for (entry in newWhenExpression.getEntries()) {
|
||||||
|
val currReturn = BranchedFoldingUtils.getFoldableBranchedReturn(entry.getExpression()!!)!!
|
||||||
|
val currExpr = currReturn.getReturnedExpression()!!
|
||||||
|
currReturn.replace(currExpr)
|
||||||
|
}
|
||||||
|
|
||||||
|
element.replace(newReturnExpression)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user