override fun invoke()

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)
        }
    }