in src/main/kotlin/org/arend/quickfix/removers/RemovePatternsQuickFix.kt [44:99]
override fun invoke(project: Project, editor: Editor?, file: PsiFile?) {
val pattern = patternRef.element ?: return
var first = pattern.extendLeft
first.prevSibling?.let {
if (it is LeafPsiElement && it.elementType == ArendElementTypes.COMMA) {
first = it.extendLeft
}
}
var last: PsiElement = pattern
if (single) {
last.extendRight.nextSibling?.let {
if (it is LeafPsiElement && it.elementType == ArendElementTypes.COMMA) {
last = it
}
}
} else {
// If we need to remove all patterns, just remove all clauses
if (first.prevSibling.let { it == null || it is LeafPsiElement && it.elementType == ArendElementTypes.PIPE }) {
when (val parent = first.parent) {
is ArendClause -> removeClauses(parent)
is ArendConstructorClause -> (parent.parent as? ArendDataBody)?.delete()
}
return
}
// Remove everything till the next '=>', ')', '}', or '\as'
while (true) {
val next = last.nextSibling
if (next == null || next is LeafPsiElement && next.elementType in listOf(ArendElementTypes.FAT_ARROW, ArendElementTypes.RPAREN, ArendElementTypes.RBRACE, ArendElementTypes.AS_KW)) {
break
}
last = next
}
// Keep whitespaces and comments
if (last is PsiWhiteSpace || last is PsiComment) {
last = last.extendLeft
last.prevSibling?.let {
last = it
}
}
}
// Add a whitespace before '=>' or '\as'
val parent = first.parent
if (last.nextElement.let { it is LeafPsiElement && it.elementType in listOf(ArendElementTypes.FAT_ARROW, ArendElementTypes.AS_KW) }) {
parent.addAfter(ArendPsiFactory(parent.project).createWhitespace(" "), last)
}
parent.deleteChildRange(first, last)
val child = parent.childrenOfType<ArendPattern>().singleOrNull()
if (parent is ArendPattern && child is ArendPattern && !parent.isTuplePattern) {
parent.replace(child)
}
}