fixes #1161
This commit is contained in:
parent
405cd7d1fb
commit
212293197f
3 changed files with 47 additions and 11 deletions
|
|
@ -63,7 +63,7 @@ proc optInd*(p: var TParser, n: PNode)
|
||||||
proc indAndComment*(p: var TParser, n: PNode)
|
proc indAndComment*(p: var TParser, n: PNode)
|
||||||
proc setBaseFlags*(n: PNode, base: TNumericalBase)
|
proc setBaseFlags*(n: PNode, base: TNumericalBase)
|
||||||
proc parseSymbol*(p: var TParser, allowNil = false): PNode
|
proc parseSymbol*(p: var TParser, allowNil = false): PNode
|
||||||
proc parseTry(p: var TParser): PNode
|
proc parseTry(p: var TParser; isExpr: bool): PNode
|
||||||
proc parseCase(p: var TParser): PNode
|
proc parseCase(p: var TParser): PNode
|
||||||
# implementation
|
# implementation
|
||||||
|
|
||||||
|
|
@ -845,7 +845,7 @@ proc parseIdentColonEquals(p: var TParser, flags: TDeclaredIdentFlags): PNode =
|
||||||
addSon(result, parseTypeDesc(p))
|
addSon(result, parseTypeDesc(p))
|
||||||
else:
|
else:
|
||||||
addSon(result, ast.emptyNode)
|
addSon(result, ast.emptyNode)
|
||||||
if (p.tok.tokType != tkEquals) and not (withBothOptional in flags):
|
if p.tok.tokType != tkEquals and withBothOptional notin flags:
|
||||||
parMessage(p, errColonOrEqualsExpected, p.tok)
|
parMessage(p, errColonOrEqualsExpected, p.tok)
|
||||||
if p.tok.tokType == tkEquals:
|
if p.tok.tokType == tkEquals:
|
||||||
getTok(p)
|
getTok(p)
|
||||||
|
|
@ -1004,13 +1004,13 @@ proc parseExpr(p: var TParser): PNode =
|
||||||
#| expr = (ifExpr
|
#| expr = (ifExpr
|
||||||
#| | whenExpr
|
#| | whenExpr
|
||||||
#| | caseExpr
|
#| | caseExpr
|
||||||
#| | tryStmt)
|
#| | tryExpr)
|
||||||
#| / simpleExpr
|
#| / simpleExpr
|
||||||
case p.tok.tokType:
|
case p.tok.tokType:
|
||||||
of tkIf: result = parseIfExpr(p, nkIfExpr)
|
of tkIf: result = parseIfExpr(p, nkIfExpr)
|
||||||
of tkWhen: result = parseIfExpr(p, nkWhenExpr)
|
of tkWhen: result = parseIfExpr(p, nkWhenExpr)
|
||||||
of tkCase: result = parseCase(p)
|
of tkCase: result = parseCase(p)
|
||||||
of tkTry: result = parseTry(p)
|
of tkTry: result = parseTry(p, isExpr=true)
|
||||||
else: result = simpleExpr(p)
|
else: result = simpleExpr(p)
|
||||||
|
|
||||||
proc parseEnum(p: var TParser): PNode
|
proc parseEnum(p: var TParser): PNode
|
||||||
|
|
@ -1363,22 +1363,25 @@ proc parseCase(p: var TParser): PNode =
|
||||||
if wasIndented:
|
if wasIndented:
|
||||||
p.currInd = oldInd
|
p.currInd = oldInd
|
||||||
|
|
||||||
proc parseTry(p: var TParser): PNode =
|
proc parseTry(p: var TParser; isExpr: bool): PNode =
|
||||||
#| tryStmt = 'try' colcom stmt &(IND{=}? 'except'|'finally')
|
#| tryStmt = 'try' colcom stmt &(IND{=}? 'except'|'finally')
|
||||||
#| (IND{=}? 'except' exprList colcom stmt)*
|
#| (IND{=}? 'except' exprList colcom stmt)*
|
||||||
#| (IND{=}? 'finally' colcom stmt)?
|
#| (IND{=}? 'finally' colcom stmt)?
|
||||||
|
#| tryExpr = 'try' colcom stmt &(optInd 'except'|'finally')
|
||||||
|
#| (optInd 'except' exprList colcom stmt)*
|
||||||
|
#| (optInd 'finally' colcom stmt)?
|
||||||
result = newNodeP(nkTryStmt, p)
|
result = newNodeP(nkTryStmt, p)
|
||||||
getTok(p)
|
getTok(p)
|
||||||
eat(p, tkColon)
|
eat(p, tkColon)
|
||||||
skipComment(p, result)
|
skipComment(p, result)
|
||||||
addSon(result, parseStmt(p))
|
addSon(result, parseStmt(p))
|
||||||
var b: PNode = nil
|
var b: PNode = nil
|
||||||
while sameOrNoInd(p):
|
while sameOrNoInd(p) or isExpr:
|
||||||
case p.tok.tokType
|
case p.tok.tokType
|
||||||
of tkExcept:
|
of tkExcept:
|
||||||
b = newNodeP(nkExceptBranch, p)
|
b = newNodeP(nkExceptBranch, p)
|
||||||
exprList(p, tkColon, b)
|
exprList(p, tkColon, b)
|
||||||
of tkFinally:
|
of tkFinally:
|
||||||
b = newNodeP(nkFinally, p)
|
b = newNodeP(nkFinally, p)
|
||||||
getTokNoInd(p)
|
getTokNoInd(p)
|
||||||
eat(p, tkColon)
|
eat(p, tkColon)
|
||||||
|
|
@ -1877,7 +1880,7 @@ proc complexOrSimpleStmt(p: var TParser): PNode =
|
||||||
of tkIf: result = parseIfOrWhen(p, nkIfStmt)
|
of tkIf: result = parseIfOrWhen(p, nkIfStmt)
|
||||||
of tkWhile: result = parseWhile(p)
|
of tkWhile: result = parseWhile(p)
|
||||||
of tkCase: result = parseCase(p)
|
of tkCase: result = parseCase(p)
|
||||||
of tkTry: result = parseTry(p)
|
of tkTry: result = parseTry(p, isExpr=false)
|
||||||
of tkFinally: result = parseExceptBlock(p, nkFinally)
|
of tkFinally: result = parseExceptBlock(p, nkFinally)
|
||||||
of tkExcept: result = parseExceptBlock(p, nkExceptBranch)
|
of tkExcept: result = parseExceptBlock(p, nkExceptBranch)
|
||||||
of tkFor: result = parseFor(p)
|
of tkFor: result = parseFor(p)
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ distinct = 'distinct' optInd typeDesc
|
||||||
expr = (ifExpr
|
expr = (ifExpr
|
||||||
| whenExpr
|
| whenExpr
|
||||||
| caseExpr
|
| caseExpr
|
||||||
| tryStmt)
|
| tryExpr)
|
||||||
/ simpleExpr
|
/ simpleExpr
|
||||||
typeKeyw = 'var' | 'ref' | 'ptr' | 'shared' | 'type' | 'tuple'
|
typeKeyw = 'var' | 'ref' | 'ptr' | 'shared' | 'type' | 'tuple'
|
||||||
| 'proc' | 'iterator' | 'distinct' | 'object' | 'enum'
|
| 'proc' | 'iterator' | 'distinct' | 'object' | 'enum'
|
||||||
|
|
@ -135,6 +135,9 @@ caseStmt = 'case' expr ':'? COMMENT?
|
||||||
tryStmt = 'try' colcom stmt &(IND{=}? 'except'|'finally')
|
tryStmt = 'try' colcom stmt &(IND{=}? 'except'|'finally')
|
||||||
(IND{=}? 'except' exprList colcom stmt)*
|
(IND{=}? 'except' exprList colcom stmt)*
|
||||||
(IND{=}? 'finally' colcom stmt)?
|
(IND{=}? 'finally' colcom stmt)?
|
||||||
|
tryExpr = 'try' colcom stmt &(optInd 'except'|'finally')
|
||||||
|
(optInd 'except' exprList colcom stmt)*
|
||||||
|
(optInd 'finally' colcom stmt)?
|
||||||
exceptBlock = 'except' colcom stmt
|
exceptBlock = 'except' colcom stmt
|
||||||
forStmt = 'for' (identWithPragma ^+ comma) 'in' expr colcom stmt
|
forStmt = 'for' (identWithPragma ^+ comma) 'in' expr colcom stmt
|
||||||
blockStmt = 'block' symbol? colcom stmt
|
blockStmt = 'block' symbol? colcom stmt
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,8 @@ discard """
|
||||||
1244
|
1244
|
||||||
6
|
6
|
||||||
abcdefghijklmnopqrstuvwxyz
|
abcdefghijklmnopqrstuvwxyz
|
||||||
145 23'''
|
145 23
|
||||||
|
3'''
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import strutils
|
import strutils
|
||||||
|
|
@ -92,3 +93,32 @@ proc parseResponse(): PJsonNode =
|
||||||
#bug #992
|
#bug #992
|
||||||
var se = @[1,2]
|
var se = @[1,2]
|
||||||
let b = (se[1] = 1; 1)
|
let b = (se[1] = 1; 1)
|
||||||
|
|
||||||
|
|
||||||
|
# bug #1161
|
||||||
|
|
||||||
|
type
|
||||||
|
PFooBase = ref object of PObject
|
||||||
|
field: int
|
||||||
|
|
||||||
|
PFoo[T] = ref object of PFooBase
|
||||||
|
field2: T
|
||||||
|
|
||||||
|
var testIf =
|
||||||
|
if true:
|
||||||
|
2
|
||||||
|
else:
|
||||||
|
3
|
||||||
|
|
||||||
|
var testCase =
|
||||||
|
case 8
|
||||||
|
of 8: 9
|
||||||
|
else: 10
|
||||||
|
|
||||||
|
var testTry =
|
||||||
|
try:
|
||||||
|
PFoo[string](field: 3, field2: "asfasf")
|
||||||
|
except:
|
||||||
|
PFooBase(field: 5)
|
||||||
|
|
||||||
|
echo(testTry.field)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue