|
1 | 1 | package io.ksmt.expr.rewrite.simplify |
2 | 2 |
|
| 3 | +import io.ksmt.KContext |
3 | 4 | import io.ksmt.expr.KExpr |
| 5 | +import io.ksmt.expr.KStringConcatExpr |
4 | 6 | import io.ksmt.expr.KStringLiteralExpr |
5 | 7 | import io.ksmt.sort.KStringSort |
| 8 | +import io.ksmt.utils.StringUtils |
| 9 | + |
| 10 | +inline fun KContext.simplifyStringBasicConcat( |
| 11 | + arg0: KExpr<KStringSort>, |
| 12 | + arg1: KExpr<KStringSort>, |
| 13 | + cont: (KExpr<KStringSort>, KExpr<KStringSort>) -> KExpr<KStringSort> |
| 14 | +): KExpr<KStringSort> = |
| 15 | + tryEvalStringLiteralOperation(arg0, arg1, { a1, a2 -> StringUtils.concatStrings(a1, a2) }) { |
| 16 | + cont(arg0, arg1) |
| 17 | + } |
| 18 | + |
| 19 | +inline fun KContext.simplifyStringNestedConcat( |
| 20 | + arg0: KExpr<KStringSort>, |
| 21 | + arg1: KExpr<KStringSort>, |
| 22 | + rewriteStringConcatExpr: KContext.(KExpr<KStringSort>, KExpr<KStringSort>) -> KExpr<KStringSort>, |
| 23 | + cont: (KExpr<KStringSort>, KExpr<KStringSort>) -> KExpr<KStringSort> |
| 24 | +): KExpr<KStringSort> { |
| 25 | + if (arg0 is KStringLiteralExpr && arg1 is KStringConcatExpr) { |
| 26 | + val arg1Left = arg1.arg0 |
| 27 | + if (arg1Left is KStringLiteralExpr) { |
| 28 | + return rewriteStringConcatExpr(StringUtils.concatStrings(arg0, arg1Left), arg1.arg1) |
| 29 | + } |
| 30 | + } |
| 31 | + |
| 32 | + if (arg1 is KStringLiteralExpr && arg0 is KStringConcatExpr) { |
| 33 | + val arg0Right = arg0.arg1 |
| 34 | + if (arg0Right is KStringLiteralExpr) { |
| 35 | + return rewriteStringConcatExpr(arg0.arg0, StringUtils.concatStrings(arg0Right, arg1)) |
| 36 | + } |
| 37 | + } |
| 38 | + |
| 39 | + if (arg0 is KStringConcatExpr && arg1 is KStringConcatExpr) { |
| 40 | + val arg0Right = arg0.arg1 |
| 41 | + val arg1Left = arg1.arg0 |
| 42 | + if (arg0Right is KStringLiteralExpr && arg1Left is KStringLiteralExpr) { |
| 43 | + return rewriteStringConcatExpr( |
| 44 | + arg0.arg0, |
| 45 | + mkStringConcat(StringUtils.concatStrings(arg0Right, arg1Left), arg1.arg1) |
| 46 | + ) |
| 47 | + } |
| 48 | + } |
| 49 | + |
| 50 | + return cont(arg0, arg1) |
| 51 | +} |
6 | 52 |
|
7 | 53 | inline fun tryEvalStringLiteralOperation( |
8 | 54 | lhs: KExpr<KStringSort>, |
|
0 commit comments