diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/cgen.nim | 2 | ||||
-rw-r--r-- | compiler/evaltempl.nim | 21 | ||||
-rw-r--r-- | compiler/sem.nim | 1 |
3 files changed, 23 insertions, 1 deletions
diff --git a/compiler/cgen.nim b/compiler/cgen.nim index 81d13140d..085e08990 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -194,6 +194,8 @@ proc genLineDir(p: BProc, t: PNode) = var tt = t #while tt.kind in {nkStmtListExpr}+nkCallKinds: # tt = tt.lastSon + if tt.kind in nkCallKinds and tt.len > 1: + tt = tt.sons[1] let line = tt.info.safeLineNm if optEmbedOrigSrc in gGlobalOptions: diff --git a/compiler/evaltempl.nim b/compiler/evaltempl.nim index 96ede44fd..59f04ca84 100644 --- a/compiler/evaltempl.nim +++ b/compiler/evaltempl.nim @@ -104,6 +104,25 @@ proc evalTemplateArgs(n: PNode, s: PSym; fromHlo: bool): PNode = var evalTemplateCounter* = 0 # to prevent endless recursion in templates instantiation +proc wrapInComesFrom*(info: TLineInfo; res: PNode): PNode = + when true: + result = res + result.info = info + if result.kind in {nkStmtList, nkStmtListExpr}: + result.lastSon.info = info + when false: + # this hack is required to + var x = result + while x.kind == nkStmtListExpr: x = x.lastSon + if x.kind in nkCallKinds: + for i in 1..<x.len: + if x[i].kind in nkCallKinds: + x.sons[i].info = info + else: + result = newNodeI(nkPar, info) + result.add res + result.flags.incl nfNone + proc evalTemplate*(n: PNode, tmpl, genSymOwner: PSym; fromHlo=false): PNode = inc(evalTemplateCounter) if evalTemplateCounter > 100: @@ -132,5 +151,5 @@ proc evalTemplate*(n: PNode, tmpl, genSymOwner: PSym; fromHlo=false): PNode = #if ctx.instLines: result.info = n.info for i in countup(0, safeLen(body) - 1): evalTemplateAux(body.sons[i], args, ctx, result) - + result = wrapInComesFrom(n.info, result) dec(evalTemplateCounter) diff --git a/compiler/sem.nim b/compiler/sem.nim index 02c779ef0..069b7ea76 100644 --- a/compiler/sem.nim +++ b/compiler/sem.nim @@ -369,6 +369,7 @@ proc semMacroExpr(c: PContext, n, nOrig: PNode, sym: PSym, result = evalMacroCall(c.module, c.cache, n, nOrig, sym) if efNoSemCheck notin flags: result = semAfterMacroCall(c, result, sym, flags) + result = wrapInComesFrom(nOrig.info, result) popInfoContext() proc forceBool(c: PContext, n: PNode): PNode = |