diff options
author | cooldome <cdome@bk.ru> | 2020-06-01 18:56:17 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-01 19:56:17 +0200 |
commit | e5b64af8317eb0f5e8b9912691b69aab4cd26adf (patch) | |
tree | c6579db452de8a25509d623a1e5702d4b1809e7a /compiler/renderer.nim | |
parent | 3cf88c2b4955f330e147c98064969626719790de (diff) | |
download | Nim-e5b64af8317eb0f5e8b9912691b69aab4cd26adf.tar.gz |
Implement rendering of `[]=`, `{}`, `{}=` braces (#14539)
* render curly braces * fix typo * fix test Co-authored-by: cooldome <ariabushenko@bk.ru>
Diffstat (limited to 'compiler/renderer.nim')
-rw-r--r-- | compiler/renderer.nim | 70 |
1 files changed, 54 insertions, 16 deletions
diff --git a/compiler/renderer.nim b/compiler/renderer.nim index 29ff80ca9..6c953dc18 100644 --- a/compiler/renderer.nim +++ b/compiler/renderer.nim @@ -874,12 +874,23 @@ proc gsub(g: var TSrcGen; n: PNode; i: int) = else: put(g, tkOpr, "<<" & $i & "th child missing for " & $n.kind & " >>") -proc isBracket*(n: PNode): bool = - case n.kind - of nkClosedSymChoice, nkOpenSymChoice: - if n.len > 0: result = isBracket(n[0]) - of nkSym: result = n.sym.name.s == "[]" - else: result = false +type + BracketKind = enum + bkNone, bkBracket, bkBracketAsgn, bkCurly, bkCurlyAsgn + +proc bracketKind*(g: TSrcGen, n: PNode): BracketKind = + if renderIds notin g.flags: + case n.kind + of nkClosedSymChoice, nkOpenSymChoice: + if n.len > 0: result = bracketKind(g, n[0]) + of nkSym: + result = case n.sym.name.s + of "[]": bkBracket + of "[]=": bkBracketAsgn + of "{}": bkCurly + of "{}=": bkCurlyAsgn + else: bkNone + else: result = bkNone proc skipHiddenNodes(n: PNode): PNode = result = n @@ -892,10 +903,11 @@ proc skipHiddenNodes(n: PNode): PNode = else: break proc accentedName(g: var TSrcGen, n: PNode) = + const backticksNeeded = OpChars + {'[', '{'} if n == nil: return let isOperator = - if n.kind == nkIdent and n.ident.s.len > 0 and n.ident.s[0] in OpChars: true - elif n.kind == nkSym and n.sym.name.s.len > 0 and n.sym.name.s[0] in OpChars: true + if n.kind == nkIdent and n.ident.s.len > 0 and n.ident.s[0] in backticksNeeded: true + elif n.kind == nkSym and n.sym.name.s.len > 0 and n.sym.name.s[0] in backticksNeeded: true else: false if isOperator: @@ -954,12 +966,7 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = of nkCharLit: put(g, tkCharLit, atom(g, n)) of nkNilLit: put(g, tkNil, atom(g, n)) # complex expressions of nkCall, nkConv, nkDotCall, nkPattern, nkObjConstr: - if renderIds notin g.flags and n.len > 0 and isBracket(n[0]): - gsub(g, n, 1) - put(g, tkBracketLe, "[") - gcomma(g, n, 2) - put(g, tkBracketRi, "]") - elif n.len > 1 and n.lastSon.kind == nkStmtList: + if n.len > 1 and n.lastSon.kind in {nkStmtList, nkStmtListExpr}: accentedName(g, n[0]) if n.len > 2: put(g, tkParLe, "(") @@ -967,10 +974,41 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = put(g, tkParRi, ")") put(g, tkColon, ":") gsub(g, n, n.len-1) + elif n.len >= 1: + case bracketKind(g, n[0]) + of bkBracket: + gsub(g, n, 1) + put(g, tkBracketLe, "[") + gcomma(g, n, 2) + put(g, tkBracketRi, "]") + of bkBracketAsgn: + gsub(g, n, 1) + put(g, tkBracketLe, "[") + gcomma(g, n, 2, -2) + put(g, tkBracketRi, "]") + put(g, tkSpaces, Space) + putWithSpace(g, tkEquals, "=") + gsub(g, n, n.len - 1) + of bkCurly: + gsub(g, n, 1) + put(g, tkCurlyLe, "{") + gcomma(g, n, 2) + put(g, tkCurlyRi, "}") + of bkCurlyAsgn: + gsub(g, n, 1) + put(g, tkCurlyLe, "{") + gcomma(g, n, 2, -2) + put(g, tkCurlyRi, "}") + put(g, tkSpaces, Space) + putWithSpace(g, tkEquals, "=") + gsub(g, n, n.len - 1) + of bkNone: + accentedName(g, n[0]) + put(g, tkParLe, "(") + gcomma(g, n, 1) + put(g, tkParRi, ")") else: - if n.len >= 1: accentedName(g, n[0]) put(g, tkParLe, "(") - gcomma(g, n, 1) put(g, tkParRi, ")") of nkCallStrLit: if n.len > 0: accentedName(g, n[0]) |