KT-38841 Do not call preparePsiElementForWrite if not needed
- This call breaks Intention Preview for all intentions that extend `SelfTargetingIntention` - This check is actually already performed by the platform before the intention invocation (but only if `startInWriteAction` returns `true`) - There are many other intentions which redundantly use this call, but most of them implement `LocalQuickFix`, which means that they are inspection based. Currently Intention Preview does not seem to support this kind of intentions
This commit is contained in:
+12
-1
@@ -99,10 +99,21 @@ abstract class SelfTargetingIntention<TElement : PsiElement>(
|
|||||||
final override fun invoke(project: Project, editor: Editor?, file: PsiFile) {
|
final override fun invoke(project: Project, editor: Editor?, file: PsiFile) {
|
||||||
editor ?: return
|
editor ?: return
|
||||||
val target = getTarget(editor, file) ?: return
|
val target = getTarget(editor, file) ?: return
|
||||||
if (!FileModificationService.getInstance().preparePsiElementForWrite(target)) return
|
if (!preparePsiElementForWriteIfNeeded(target)) return
|
||||||
applyTo(target, editor)
|
applyTo(target, editor)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If [startInWriteAction] returns true, that means that the platform already called `preparePsiElementForWrite`
|
||||||
|
* for us (we do not want to call it again because it will throw if the intention is used with Intention Preview).
|
||||||
|
*
|
||||||
|
* Otherwise we have to call it ourselves (see javadoc for [getElementToMakeWritable]).
|
||||||
|
*/
|
||||||
|
private fun preparePsiElementForWriteIfNeeded(target: TElement): Boolean {
|
||||||
|
if (startInWriteAction()) return true
|
||||||
|
return FileModificationService.getInstance().preparePsiElementForWrite(target)
|
||||||
|
}
|
||||||
|
|
||||||
override fun startInWriteAction() = true
|
override fun startInWriteAction() = true
|
||||||
|
|
||||||
override fun toString(): String = text
|
override fun toString(): String = text
|
||||||
|
|||||||
Reference in New Issue
Block a user