KT-16714 related refactoring of tryRunWriteAction (now runWriteAction is not used if intention is called from J2K)

This commit is contained in:
Mikhail Glukhikh
2017-03-09 16:06:14 +03:00
parent faa0dff649
commit 32bdb6becb
5 changed files with 15 additions and 10 deletions
@@ -78,7 +78,7 @@ abstract class IntentionBasedInspection<TElement : PsiElement>(
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor {
val intentionsAndCheckers = intentionInfos.map {
val instance = it.intention.constructors.single().call()
val instance = it.intention.constructors.single { it.parameters.isEmpty() } .call()
instance.inspection = this
instance to it.additionalChecker
}
@@ -58,8 +58,8 @@ abstract class SelfTargetingIntention<TElement : PsiElement>(
abstract fun applyTo(element: TElement, editor: Editor?)
protected fun <R> tryRunWriteAction(action: () -> R): R =
if (ApplicationManager.getApplication().isDispatchThread) runWriteAction(action)
protected fun <R> runInWriteActionOrHere(inWriteAction: Boolean = true, action: () -> R): R =
if (inWriteAction) runWriteAction(action)
else run(action)
private fun getTarget(editor: Editor, file: PsiFile): TElement? {
@@ -41,10 +41,12 @@ class IfThenToElvisInspection : IntentionBasedInspection<KtIfExpression>(
{ it -> it.isUsedAsExpression(it.analyze(BodyResolveMode.PARTIAL)) }
)
class IfThenToElvisIntention : SelfTargetingOffsetIndependentIntention<KtIfExpression>(
class IfThenToElvisIntention(private val fromJ2K: Boolean) : SelfTargetingOffsetIndependentIntention<KtIfExpression>(
KtIfExpression::class.java,
"Replace 'if' expression with elvis expression"
) {
@Suppress("unused")
constructor(): this(fromJ2K = false)
private fun KtExpression.clausesReplaceableByElvis(firstClause: KtExpression, secondClause: KtExpression, context: BindingContext) =
!firstClause.isNullOrBlockExpression() &&
@@ -145,7 +147,7 @@ class IfThenToElvisIntention : SelfTargetingOffsetIndependentIntention<KtIfExpre
it.typeReference!!)
}
val checkedExpression = condition.checkedExpression()!!
val elvis = tryRunWriteAction {
val elvis = runInWriteActionOrHere(inWriteAction = !fromJ2K) {
val replacedLeft = if (left.evaluatesTo(checkedExpression)) {
if (condition is KtIsExpression) newReceiver!! else left
}
@@ -21,13 +21,16 @@ import org.jetbrains.kotlin.idea.core.replaced
import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection
import org.jetbrains.kotlin.idea.intentions.SelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.*
import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.*
class IfThenToSafeAccessInspection : IntentionBasedInspection<KtIfExpression>(IfThenToSafeAccessIntention::class)
class IfThenToSafeAccessIntention : SelfTargetingOffsetIndependentIntention<KtIfExpression>(KtIfExpression::class.java, "Replace 'if' expression with safe access expression") {
class IfThenToSafeAccessIntention(private val fromJ2K: Boolean) : SelfTargetingOffsetIndependentIntention<KtIfExpression>(
KtIfExpression::class.java, "Replace 'if' expression with safe access expression"
) {
@Suppress("unused")
constructor(): this(fromJ2K = false)
override fun isApplicableTo(element: KtIfExpression): Boolean {
val condition = element.condition as? KtBinaryExpression ?: return false
@@ -67,7 +70,7 @@ class IfThenToSafeAccessIntention : SelfTargetingOffsetIndependentIntention<KtIf
}
val newExpr = KtPsiFactory(element).createExpressionByPattern("$0?.$1", receiverExpression, selectorExpression) as KtSafeQualifiedExpression
val safeAccessExpr = tryRunWriteAction {
val safeAccessExpr = runInWriteActionOrHere(inWriteAction = !fromJ2K) {
element.replaced(newExpr)
}
@@ -69,8 +69,8 @@ object J2KPostProcessingRegistrar {
_processings.add(RemoveRedundantCastToNullableProcessing())
registerIntentionBasedProcessing(ConvertToExpressionBodyIntention(convertEmptyToUnit = false)) { it is KtPropertyAccessor }
registerIntentionBasedProcessing(IfThenToSafeAccessIntention())
registerIntentionBasedProcessing(IfThenToElvisIntention())
registerIntentionBasedProcessing(IfThenToSafeAccessIntention(fromJ2K = true))
registerIntentionBasedProcessing(IfThenToElvisIntention(fromJ2K = true))
registerIntentionBasedProcessing(FoldInitializerAndIfToElvisIntention())
registerIntentionBasedProcessing(SimplifyNegatedBinaryExpressionIntention())
registerIntentionBasedProcessing(ReplaceGetOrSetIntention(), additionalChecker = ReplaceGetOrSetInspection.additionalChecker)