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