More progress towards a working #3691.
This commit is contained in:
parent
656da1f6a9
commit
1c233ba27a
5 changed files with 23 additions and 10 deletions
|
|
@ -435,5 +435,5 @@ proc pickSym*(c: PContext, n: PNode; kind: TSymKind;
|
||||||
return a
|
return a
|
||||||
a = nextOverloadIter(o, c, n)
|
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"
|
return n.kind == nkInfix and considerQuotedIdent(n[0]).s == "as"
|
||||||
|
|
@ -338,17 +338,15 @@ proc semGenericStmt(c: PContext, n: PNode,
|
||||||
var a = n.sons[i]
|
var a = n.sons[i]
|
||||||
checkMinSonsLen(a, 1)
|
checkMinSonsLen(a, 1)
|
||||||
var L = sonsLen(a)
|
var L = sonsLen(a)
|
||||||
|
openScope(c)
|
||||||
for j in countup(0, L-2):
|
for j in countup(0, L-2):
|
||||||
debug(a.sons[j])
|
if a.sons[j].isInfixAs():
|
||||||
if a.sons[j].isExceptAs():
|
|
||||||
openScope(c)
|
|
||||||
addTempDecl(c, getIdentNode(a.sons[j][2]), skLet)
|
addTempDecl(c, getIdentNode(a.sons[j][2]), skLet)
|
||||||
a.sons[j] = semGenericStmt(c, a.sons[j][1], flags+{withinTypeDesc}, ctx)
|
a.sons[j].sons[1] = semGenericStmt(c, a.sons[j][1], flags+{withinTypeDesc}, ctx)
|
||||||
closeScope(c)
|
|
||||||
else:
|
else:
|
||||||
a.sons[j] = semGenericStmt(c, a.sons[j], flags+{withinTypeDesc}, ctx)
|
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)
|
a.sons[L-1] = semGenericStmtScope(c, a.sons[L-1], flags, ctx)
|
||||||
|
closeScope(c)
|
||||||
|
|
||||||
of nkVarSection, nkLetSection:
|
of nkVarSection, nkLetSection:
|
||||||
for i in countup(0, sonsLen(n) - 1):
|
for i in countup(0, sonsLen(n) - 1):
|
||||||
|
|
|
||||||
|
|
@ -286,7 +286,7 @@ proc semTry(c: PContext, n: PNode): PNode =
|
||||||
var typeNode = a.sons[j] # e.g. `Exception`
|
var typeNode = a.sons[j] # e.g. `Exception`
|
||||||
var symbolNode: PNode = nil # e.g. `foobar`
|
var symbolNode: PNode = nil # e.g. `foobar`
|
||||||
# Handle the case where the `Exception as foobar` syntax is used.
|
# Handle the case where the `Exception as foobar` syntax is used.
|
||||||
if typeNode.isExceptAs():
|
if typeNode.isInfixAs():
|
||||||
typeNode = a.sons[j].sons[1]
|
typeNode = a.sons[j].sons[1]
|
||||||
symbolNode = a.sons[j].sons[2]
|
symbolNode = a.sons[j].sons[2]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -703,7 +703,7 @@ proc transformCall(c: PTransf, n: PNode): PTransNode =
|
||||||
|
|
||||||
proc transformExceptBranch(c: PTransf, n: PNode): PTransNode =
|
proc transformExceptBranch(c: PTransf, n: PNode): PTransNode =
|
||||||
result = transformSons(c, n)
|
result = transformSons(c, n)
|
||||||
if n[0].isExceptAs():
|
if n[0].isInfixAs():
|
||||||
let excTypeNode = n[0][1]
|
let excTypeNode = n[0][1]
|
||||||
let actions = newTransNode(nkStmtList, n[1].info, 2)
|
let actions = newTransNode(nkStmtList, n[1].info, 2)
|
||||||
# Generating `let exc = (excType)(getCurrentException())`
|
# Generating `let exc = (excType)(getCurrentException())`
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,25 @@
|
||||||
discard """
|
discard """
|
||||||
output: '''Hello'''
|
output: '''Hello
|
||||||
|
Hello
|
||||||
|
'''
|
||||||
"""
|
"""
|
||||||
proc test[T]() =
|
proc test[T]() =
|
||||||
try:
|
try:
|
||||||
raise newException(T, "Hello")
|
raise newException(T, "Hello")
|
||||||
except T as foobar:
|
except T as foobar:
|
||||||
echo(foobar.msg)
|
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]()
|
test[Exception]()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue