fun getStrippedPsi()

in src/main/kotlin/org/arend/psi/PsiElementUtils.kt [392:442]


fun getStrippedPsi(expression: PsiElement): Pair<PsiElement, Boolean> {
    var expr = expression
    stripLoop@while (true) {
        when (val exprData1 = expr) {
            is ArendImplicitArgument -> if (exprData1.tupleExprList.size == 1) {
                expr = exprData1.tupleExprList[0]; continue
            }
            is ArendAtomArgument -> {
                expr = exprData1.atomFieldsAcc; continue
            }
            is ArendAtomFieldsAcc -> if (exprData1.numberList.isEmpty()) {
                expr = exprData1.atom; continue
            }
            is ArendTuple -> if (exprData1.tupleExprList.size == 1) {
                expr = exprData1.tupleExprList[0]; continue
            }
            is ArendTupleExpr -> if (exprData1.type == null) {
                expr = exprData1.expr; continue
            }
            is ArendAtom -> {
                val child = exprData1.firstRelevantChild
                if (child is ArendTuple || child is ArendLiteral) {
                    expr = child; continue
                }
            }
            is ArendNewExpr -> if (exprData1.appExpr?.let { it.textRange == exprData1.textRange } == true) {
                expr = exprData1.appExpr!!; continue
            }
            is ArendArgumentAppExpr -> if (exprData1.argumentList.isEmpty() && exprData1.atomFieldsAcc != null) {
                expr = exprData1.atomFieldsAcc!!; continue
            }
            is ArendPattern -> if ((exprData1.isTuplePattern || !exprData1.isExplicit) && exprData1.sequence.size == 1) {
                expr = exprData1.sequence[0]; continue
            } else if (!exprData1.isExplicit) {
                if (exprData1.referenceElement != null) {
                    expr = exprData1.referenceElement!!; continue
                } else if (exprData1.singleReferable != null) {
                    expr = exprData1.singleReferable!!; continue
                } else if (exprData1.underscore != null) {
                    expr = exprData1.underscore!!; continue
                }
            }
        }
        break
    }
    val isAtomic = expr is ArendAtom || expr is ArendDefIdentifier || expr is ArendLongName || expr is ArendTuple || expr is ArendLiteral ||
            expr.text == "_" || expr is ArendAtomFieldsAcc ||
            (expr is ArendPattern && (expr.referenceElement != null || expr.singleReferable != null || expr.isUnnamed || expr.isTuplePattern))

    return Pair(expr, isAtomic)
}