diff options
Diffstat (limited to 'compiler/semgnrc.nim')
-rw-r--r-- | compiler/semgnrc.nim | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/compiler/semgnrc.nim b/compiler/semgnrc.nim index ed0244b0c..9c9281da0 100644 --- a/compiler/semgnrc.nim +++ b/compiler/semgnrc.nim @@ -30,6 +30,13 @@ type GenericCtx = object toMixin: IntSet cursorInBody: bool # only for nimsuggest + bracketExpr: PNode + +template withBracketExpr(x, body: untyped) = + let old = ctx.bracketExpr + ctx.bracketExpr = x + body + ctx.bracketExpr = old type TSemGenericFlag = enum @@ -227,6 +234,10 @@ proc semGenericStmt(c: PContext, n: PNode, discard of skProc, skMethod, skIterators, skConverter, skModule: result.sons[0] = symChoice(c, fn, s, scOption) + # do check of 's.magic==mRoof' here because it might be some + # other '^' but after overload resolution the proper one: + if ctx.bracketExpr != nil and n.len == 2 and s.name.s == "^": + result.add ctx.bracketExpr first = 1 of skGenericParam: result.sons[0] = newSymNodeTypeDesc(s, fn.info) @@ -251,12 +262,17 @@ proc semGenericStmt(c: PContext, n: PNode, let flags = if mixinContext: flags+{withinMixin} else: flags for i in countup(first, sonsLen(result) - 1): result.sons[i] = semGenericStmt(c, result.sons[i], flags, ctx) - of nkBracketExpr, nkCurlyExpr: + of nkCurlyExpr: result = newNodeI(nkCall, n.info) - result.add newIdentNode(getIdent(if n.kind == nkBracketExpr:"[]" else:"{}"), - n.info) + result.add newIdentNode(getIdent("{}"), n.info) for i in 0 ..< n.len: result.add(n[i]) result = semGenericStmt(c, result, flags, ctx) + of nkBracketExpr: + result = newNodeI(nkCall, n.info) + result.add newIdentNode(getIdent("[]"), n.info) + for i in 0 ..< n.len: result.add(n[i]) + withBracketExpr n.sons[0]: + result = semGenericStmt(c, result, flags, ctx) of nkAsgn, nkFastAsgn: checkSonsLen(n, 2) let a = n.sons[0] @@ -264,13 +280,19 @@ proc semGenericStmt(c: PContext, n: PNode, let k = a.kind case k - of nkBracketExpr, nkCurlyExpr: + of nkCurlyExpr: result = newNodeI(nkCall, n.info) - result.add newIdentNode(getIdent(if k == nkBracketExpr:"[]=" else:"{}="), - n.info) + result.add newIdentNode(getIdent("{}="), n.info) for i in 0 ..< a.len: result.add(a[i]) result.add(b) result = semGenericStmt(c, result, flags, ctx) + of nkBracketExpr: + result = newNodeI(nkCall, n.info) + result.add newIdentNode(getIdent("[]="), n.info) + for i in 0 ..< a.len: result.add(a[i]) + result.add(b) + withBracketExpr a.sons[0]: + result = semGenericStmt(c, result, flags, ctx) else: for i in countup(0, sonsLen(n) - 1): result.sons[i] = semGenericStmt(c, n.sons[i], flags, ctx) |