More progress towards a working #3691.

This commit is contained in:
Dominik Picheta
2017-02-03 19:50:22 +01:00
parent 656da1f6a9
commit 1c233ba27a
5 changed files with 23 additions and 10 deletions

View File

@@ -435,5 +435,5 @@ proc pickSym*(c: PContext, n: PNode; kind: TSymKind;
return a
a = nextOverloadIter(o, c, n)
proc isExceptAs*(n: PNode): bool =
proc isInfixAs*(n: PNode): bool =
return n.kind == nkInfix and considerQuotedIdent(n[0]).s == "as"

View File

@@ -338,17 +338,15 @@ proc semGenericStmt(c: PContext, n: PNode,
var a = n.sons[i]
checkMinSonsLen(a, 1)
var L = sonsLen(a)
openScope(c)
for j in countup(0, L-2):
debug(a.sons[j])
if a.sons[j].isExceptAs():
openScope(c)
if a.sons[j].isInfixAs():
addTempDecl(c, getIdentNode(a.sons[j][2]), skLet)
a.sons[j] = semGenericStmt(c, a.sons[j][1], flags+{withinTypeDesc}, ctx)
closeScope(c)
a.sons[j].sons[1] = semGenericStmt(c, a.sons[j][1], flags+{withinTypeDesc}, ctx)
else:
a.sons[j] = semGenericStmt(c, a.sons[j], flags+{withinTypeDesc}, ctx)
debug(a)
a.sons[L-1] = semGenericStmtScope(c, a.sons[L-1], flags, ctx)
closeScope(c)
of nkVarSection, nkLetSection:
for i in countup(0, sonsLen(n) - 1):

View File

@@ -286,7 +286,7 @@ proc semTry(c: PContext, n: PNode): PNode =
var typeNode = a.sons[j] # e.g. `Exception`
var symbolNode: PNode = nil # e.g. `foobar`
# Handle the case where the `Exception as foobar` syntax is used.
if typeNode.isExceptAs():
if typeNode.isInfixAs():
typeNode = a.sons[j].sons[1]
symbolNode = a.sons[j].sons[2]

View File

@@ -703,7 +703,7 @@ proc transformCall(c: PTransf, n: PNode): PTransNode =
proc transformExceptBranch(c: PTransf, n: PNode): PTransNode =
result = transformSons(c, n)
if n[0].isExceptAs():
if n[0].isInfixAs():
let excTypeNode = n[0][1]
let actions = newTransNode(nkStmtList, n[1].info, 2)
# Generating `let exc = (excType)(getCurrentException())`

View File

@@ -1,10 +1,25 @@
discard """
output: '''Hello'''
output: '''Hello
Hello
'''
"""
proc test[T]() =
try:
raise newException(T, "Hello")
except T as foobar:
echo(foobar.msg)
echo(declared(foobar))
doAssert(not declared(foobar))
template testTemplate() =
try:
raise newException(Exception, "Hello")
except Exception as foobar:
echo(foobar.msg)
doAssert(not declared(foobar))
proc test2() =
testTemplate()
doAssert(not declared(foobar))
test[Exception]()