fun foldTokenNodes()

in src/main/kotlin/org/jetbrains/objcdiff/parsers/ObjCToken.kt [47:96]


fun foldTokenNodes(rawTokens: List<ObjCTokenNode>): List<ObjCToken> {
    return rawTokens.foldIndexedSkippable(emptyList()) { index, acc, rawToken, skip ->
        var token = mapTokenNode(rawToken)
        val result = mutableListOf<ObjCToken>()

        if (token.isType()) {

            if (token is ObjCToken.ObjectType) {
                token = token.copy(tokens = foldTokenNodes(rawToken.children))
            } else if (token is ObjCToken.IdType) {
                token = token.copy(tokens = foldTokenNodes(rawToken.children))
            }

            var next = mapTokenOrNull(index.getNextOrNull())

            if (next is ObjCToken.Nullable) {

                if (token is ObjCToken.ObjectType) {
                    token = token.copy(nullable = true)
                } else if (token is ObjCToken.IdType) {
                    token = token.copy(nullable = true)
                } else if (token is ObjCToken.PrimitiveType) {
                    token = token.copy(nullable = true)
                } else {
                    error("Nullable token after unsupported type: $token")
                }

                skip(1)
                next = mapTokenOrNull(index.getNextOrNull())
            }

            if (next is ObjCToken.LambdaReference) {
                skip(1) // skip lambda reference
                val args = index.getNextOrNull()
                val lambdaArgs = if (args != null && args.name.isEmpty()) {
                    skip(1) // skip args
                    foldTokenNodes(args.children)
                } else emptyList()

                result.add(ObjCToken.LambdaType(token, lambdaArgs))
            } else {
                result.add(token)
            }
        }



        acc + result.mapNotNull { takeOrNull(it) }
    }
}