diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/pragmas.nim | 4 | ||||
-rw-r--r-- | compiler/renderer.nim | 16 | ||||
-rw-r--r-- | compiler/sempass2.nim | 26 | ||||
-rw-r--r-- | compiler/typesrenderer.nim | 11 |
4 files changed, 37 insertions, 20 deletions
diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim index 879950e79..8e639f083 100644 --- a/compiler/pragmas.nim +++ b/compiler/pragmas.nim @@ -357,11 +357,11 @@ proc processPush(c: PContext, n: PNode, start: int) = append(c.optionStack, x) for i in countup(start, sonsLen(n) - 1): if processOption(c, n.sons[i]): - # simply store it somehwere: + # simply store it somewhere: if x.otherPragmas.isNil: x.otherPragmas = newNodeI(nkPragma, n.info) x.otherPragmas.add n.sons[i] - #LocalError(n.info, errOptionExpected) + #localError(n.info, errOptionExpected) proc processPop(c: PContext, n: PNode) = if c.optionStack.counter <= 1: diff --git a/compiler/renderer.nim b/compiler/renderer.nim index f25f3e7ee..2bbe8ac80 100644 --- a/compiler/renderer.nim +++ b/compiler/renderer.nim @@ -34,6 +34,7 @@ type comStack*: seq[PNode] # comment stack flags*: TRenderFlags checkAnon: bool # we're in a context that can contain sfAnon + inPragma: int proc renderModule*(n: PNode, filename: string, renderFlags: TRenderFlags = {}) @@ -1184,12 +1185,17 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = of nkContinueStmt: putWithSpace(g, tkContinue, "continue") gsub(g, n.sons[0]) - of nkPragma: + of nkPragma: if renderNoPragmas notin g.flags: - put(g, tkSpaces, Space) - put(g, tkCurlyDotLe, "{.") - gcomma(g, n, emptyContext) - put(g, tkCurlyDotRi, ".}") + if g.inPragma <= 0: + inc g.inPragma + put(g, tkSpaces, Space) + put(g, tkCurlyDotLe, "{.") + gcomma(g, n, emptyContext) + put(g, tkCurlyDotRi, ".}") + dec g.inPragma + else: + gcomma(g, n, emptyContext) of nkImportStmt, nkExportStmt: if n.kind == nkImportStmt: putWithSpace(g, tkImport, "import") diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim index f41e169e3..4300aee20 100644 --- a/compiler/sempass2.nim +++ b/compiler/sempass2.nim @@ -370,7 +370,7 @@ proc trackPragmaStmt(tracked: PEffects, n: PNode) = # list the computed effects up to here: listEffects(tracked) -proc effectSpec(n: PNode, effectType = wRaises): PNode = +proc effectSpec(n: PNode, effectType: TSpecialWord): PNode = for i in countup(0, sonsLen(n) - 1): var it = n.sons[i] if it.kind == nkExprColonExpr and whichPragma(it) == effectType: @@ -380,8 +380,7 @@ proc effectSpec(n: PNode, effectType = wRaises): PNode = result.add(it.sons[1]) return -proc documentEffect(n, x: PNode, effectType: TSpecialWord, idx: int) = - var x = x +proc documentEffect(n, x: PNode, effectType: TSpecialWord, idx: int): PNode = let spec = effectSpec(x, effectType) if isNil(spec): let s = n.sons[namePos].sym @@ -399,18 +398,20 @@ proc documentEffect(n, x: PNode, effectType: TSpecialWord, idx: int) = # set the type so that the following analysis doesn't screw up: effects.sons[i].typ = real[i].typ - var pair = newNode(nkExprColonExpr, n.info, @[ + result = newNode(nkExprColonExpr, n.info, @[ newIdentNode(getIdent(specialWords[effectType]), n.info), effects]) - - if x.kind == nkEmpty: - x = newNodeI(nkPragma, n.info) - n.sons[pragmasPos] = x - x.add(pair) proc documentRaises*(n: PNode) = if n.sons[namePos].kind != nkSym: return - documentEffect(n, n.sons[pragmasPos], wRaises, exceptionEffects) - documentEffect(n, n.sons[pragmasPos], wTags, tagEffects) + let pragmas = n.sons[pragmasPos] + let p1 = documentEffect(n, pragmas, wRaises, exceptionEffects) + let p2 = documentEffect(n, pragmas, wTags, tagEffects) + + if p1 != nil or p2 != nil: + if pragmas.kind == nkEmpty: + n.sons[pragmasPos] = newNodeI(nkPragma, n.info) + if p1 != nil: n.sons[pragmasPos].add p1 + if p2 != nil: n.sons[pragmasPos].add p2 template notGcSafe(t): expr = {tfGcSafe, tfNoSideEffect} * t.flags == {} @@ -621,7 +622,8 @@ proc track(tracked: PEffects, n: PNode) = useVar(tracked, n) of nkRaiseStmt: n.sons[0].info = n.info - throws(tracked.exc, n.sons[0]) + #throws(tracked.exc, n.sons[0]) + addEffect(tracked, n.sons[0], useLineInfo=false) for i in 0 .. <safeLen(n): track(tracked, n.sons[i]) of nkCallKinds: diff --git a/compiler/typesrenderer.nim b/compiler/typesrenderer.nim index f3121a0b4..432a26666 100644 --- a/compiler/typesrenderer.nim +++ b/compiler/typesrenderer.nim @@ -1,3 +1,12 @@ +# +# +# The Nim Compiler +# (c) Copyright 2014 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + import renderer, strutils, ast, msgs, types, astalgo const defaultParamSeparator* = "," @@ -26,7 +35,7 @@ proc renderPlainSymbolName*(n: PNode): string = result = renderPlainSymbolName(n[<n.len]) else: internalError(n.info, "renderPlainSymbolName() with " & $n.kind) - assert (not result.isNil) + assert(not result.isNil) proc renderType(n: PNode): string = ## Returns a string with the node type or the empty string. |