|
3 | 3 |
|
4 | 4 | import std/macros
|
5 | 5 |
|
| 6 | +proc add_parent(e: ref Exception; e2: ref Exception): ref Exception = |
| 7 | + result = e |
| 8 | + result.parent = e2 |
| 9 | + |
6 | 10 | func rewriteRaiseImpl(res: var NimNode, raiseCont: NimNode, parent=newNilLit()): bool =
|
7 | 11 | var msg = newLit ""
|
| 12 | + res = newNimNode nnkWhenStmt |
| 13 | + template callIfValid(chkDest, dest) = |
| 14 | + res.add nnkElifExpr.newTree( |
| 15 | + newCall("compiles", chkDest), |
| 16 | + dest |
| 17 | + ) |
| 18 | + template callAddParent(ori) = |
| 19 | + callIfValid(ori, |
| 20 | + newCall(bindSym"add_parent", ori, parent) |
| 21 | + ) |
8 | 22 | template rewriteWith(err: NimNode){.dirty.} =
|
| 23 | + callAddParent( |
| 24 | + newCall("newPy" & err.strVal, msg)) |
| 25 | + callAddParent( |
| 26 | + newCall("new" & err.strVal, msg)) |
9 | 27 | let nExc = newCall("newException", err, msg, parent)
|
| 28 | + callIfValid(nExc, nExc) |
| 29 | + res.add( |
10 | 30 | # User may define some routinues that are used in `raise`,
|
11 |
| - res = nnkWhenStmt.newTree( |
12 |
| - nnkElifExpr.newTree( |
13 |
| - newCall(bindSym"compiles", nExc), nExc |
14 |
| - ), |
15 | 31 | nnkElseExpr.newTree(
|
16 | 32 | raiseCont
|
17 | 33 | )
|
18 | 34 | )
|
19 | 35 | #[
|
20 |
| - when compiles(`nExc`): |
| 36 | + when ... |
| 37 | + elif compiles(`nExc`): |
21 | 38 | `nExc`
|
22 | 39 | else:
|
23 | 40 | `raiseCont`
|
@@ -45,8 +62,10 @@ func rewriteRaiseImpl(res: var NimNode, raiseCont: NimNode, parent=newNilLit()):
|
45 | 62 | return
|
46 | 63 |
|
47 | 64 | proc rewriteRaise*(rStmt: NimNode): NimNode =
|
48 |
| - ## Rewrites `raise ErrType/ErrType()/ErrType(msg)` |
49 |
| - ## to `raise newException(ErrType, msg/"")` |
| 65 | + ## - Rewrites `raise ErrType/ErrType()/ErrType(msg)` |
| 66 | + ## to `raise newException(ErrType, msg/"")` |
| 67 | + ## - Rewrites `raise XxError[(...)]` to `raise new[Py]XxError(...)` |
| 68 | + ## - Rewrites `raise XxError[(...)] from P` to `raise new[Py]OSError(...).add_parent(P)` |
50 | 69 | ##
|
51 | 70 | ## assume `rStmt` is nnkRaiseStmt
|
52 | 71 | var res: NimNode
|
|
0 commit comments