made AST renderer more robust for wrong macros

This commit is contained in:
Andreas Rumpf 2016-02-19 12:59:11 +01:00
commit f9f5bd6dd8

View file

@ -803,6 +803,12 @@ proc doParamsAux(g: var TSrcGen, params: PNode) =
putWithSpace(g, tkOpr, "->") putWithSpace(g, tkOpr, "->")
gsub(g, params.sons[0]) gsub(g, params.sons[0])
proc gsub(g: var TSrcGen; n: PNode; i: int) =
if i < n.len:
gsub(g, n[i])
else:
put(g, tkOpr, "<<" & $i & "th child missing for " & $n.kind & " >>")
proc gsub(g: var TSrcGen, n: PNode, c: TContext) = proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
if isNil(n): return if isNil(n): return
var var
@ -837,8 +843,8 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
gcomma(g, n, 1) gcomma(g, n, 1)
put(g, tkParRi, ")") put(g, tkParRi, ")")
of nkCallStrLit: of nkCallStrLit:
gsub(g, n.sons[0]) gsub(g, n, 0)
if n.sons[1].kind == nkRStrLit: if n.len > 1 and n.sons[1].kind == nkRStrLit:
put(g, tkRStrLit, '\"' & replace(n[1].strVal, "\"", "\"\"") & '\"') put(g, tkRStrLit, '\"' & replace(n[1].strVal, "\"", "\"\"") & '\"')
else: else:
gsub(g, n.sons[1]) gsub(g, n.sons[1])
@ -846,10 +852,10 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
of nkCast: of nkCast:
put(g, tkCast, "cast") put(g, tkCast, "cast")
put(g, tkBracketLe, "[") put(g, tkBracketLe, "[")
gsub(g, n.sons[0]) gsub(g, n, 0)
put(g, tkBracketRi, "]") put(g, tkBracketRi, "]")
put(g, tkParLe, "(") put(g, tkParLe, "(")
gsub(g, n.sons[1]) gsub(g, n, 1)
put(g, tkParRi, ")") put(g, tkParRi, ")")
of nkAddr: of nkAddr:
put(g, tkAddr, "addr") put(g, tkAddr, "addr")
@ -860,29 +866,29 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
of nkStaticExpr: of nkStaticExpr:
put(g, tkStatic, "static") put(g, tkStatic, "static")
put(g, tkSpaces, Space) put(g, tkSpaces, Space)
gsub(g, n.sons[0]) gsub(g, n, 0)
of nkBracketExpr: of nkBracketExpr:
gsub(g, n.sons[0]) gsub(g, n, 0)
put(g, tkBracketLe, "[") put(g, tkBracketLe, "[")
gcomma(g, n, 1) gcomma(g, n, 1)
put(g, tkBracketRi, "]") put(g, tkBracketRi, "]")
of nkCurlyExpr: of nkCurlyExpr:
gsub(g, n.sons[0]) gsub(g, n, 0)
put(g, tkCurlyLe, "{") put(g, tkCurlyLe, "{")
gcomma(g, n, 1) gcomma(g, n, 1)
put(g, tkCurlyRi, "}") put(g, tkCurlyRi, "}")
of nkPragmaExpr: of nkPragmaExpr:
gsub(g, n.sons[0]) gsub(g, n, 0)
gcomma(g, n, 1) gcomma(g, n, 1)
of nkCommand: of nkCommand:
gsub(g, n.sons[0]) gsub(g, n, 0)
put(g, tkSpaces, Space) put(g, tkSpaces, Space)
gcomma(g, n, 1) gcomma(g, n, 1)
of nkExprEqExpr, nkAsgn, nkFastAsgn: of nkExprEqExpr, nkAsgn, nkFastAsgn:
gsub(g, n.sons[0]) gsub(g, n, 0)
put(g, tkSpaces, Space) put(g, tkSpaces, Space)
putWithSpace(g, tkEquals, "=") putWithSpace(g, tkEquals, "=")
gsub(g, n.sons[1]) gsub(g, n, 1)
of nkChckRangeF: of nkChckRangeF:
put(g, tkSymbol, "chckRangeF") put(g, tkSymbol, "chckRangeF")
put(g, tkParLe, "(") put(g, tkParLe, "(")
@ -936,33 +942,34 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
gcomma(g, n, c) gcomma(g, n, c)
put(g, tkBracketRi, "]") put(g, tkBracketRi, "]")
of nkDotExpr: of nkDotExpr:
gsub(g, n.sons[0]) gsub(g, n, 0)
put(g, tkDot, ".") put(g, tkDot, ".")
gsub(g, n.sons[1]) gsub(g, n, 1)
of nkBind: of nkBind:
putWithSpace(g, tkBind, "bind") putWithSpace(g, tkBind, "bind")
gsub(g, n.sons[0]) gsub(g, n, 0)
of nkCheckedFieldExpr, nkHiddenAddr, nkHiddenDeref: of nkCheckedFieldExpr, nkHiddenAddr, nkHiddenDeref:
gsub(g, n.sons[0]) gsub(g, n, 0)
of nkLambda: of nkLambda:
putWithSpace(g, tkProc, "proc") putWithSpace(g, tkProc, "proc")
gsub(g, n.sons[paramsPos]) gsub(g, n, paramsPos)
gsub(g, n.sons[pragmasPos]) gsub(g, n, pragmasPos)
put(g, tkSpaces, Space) put(g, tkSpaces, Space)
putWithSpace(g, tkEquals, "=") putWithSpace(g, tkEquals, "=")
gsub(g, n.sons[bodyPos]) gsub(g, n, bodyPos)
of nkDo: of nkDo:
putWithSpace(g, tkDo, "do") putWithSpace(g, tkDo, "do")
if paramsPos < n.len:
doParamsAux(g, n.sons[paramsPos]) doParamsAux(g, n.sons[paramsPos])
gsub(g, n.sons[pragmasPos]) gsub(g, n, pragmasPos)
put(g, tkColon, ":") put(g, tkColon, ":")
gsub(g, n.sons[bodyPos]) gsub(g, n, bodyPos)
of nkConstDef, nkIdentDefs: of nkConstDef, nkIdentDefs:
gcomma(g, n, 0, -3) gcomma(g, n, 0, -3)
var L = sonsLen(n) var L = sonsLen(n)
if L >= 2 and n.sons[L - 2].kind != nkEmpty: if L >= 2 and n.sons[L - 2].kind != nkEmpty:
putWithSpace(g, tkColon, ":") putWithSpace(g, tkColon, ":")
gsub(g, n.sons[L - 2]) gsub(g, n, L - 2)
if L >= 1 and n.sons[L - 1].kind != nkEmpty: if L >= 1 and n.sons[L - 1].kind != nkEmpty:
put(g, tkSpaces, Space) put(g, tkSpaces, Space)
putWithSpace(g, tkEquals, "=") putWithSpace(g, tkEquals, "=")
@ -975,20 +982,20 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
putWithSpace(g, tkEquals, "=") putWithSpace(g, tkEquals, "=")
gsub(g, lastSon(n), c) gsub(g, lastSon(n), c)
of nkExprColonExpr: of nkExprColonExpr:
gsub(g, n.sons[0]) gsub(g, n, 0)
putWithSpace(g, tkColon, ":") putWithSpace(g, tkColon, ":")
gsub(g, n.sons[1]) gsub(g, n, 1)
of nkInfix: of nkInfix:
gsub(g, n.sons[1]) gsub(g, n, 1)
put(g, tkSpaces, Space) put(g, tkSpaces, Space)
gsub(g, n.sons[0]) # binary operator gsub(g, n, 0) # binary operator
if not fits(g, lsub(n.sons[2]) + lsub(n.sons[0]) + 1): if not fits(g, lsub(n.sons[2]) + lsub(n.sons[0]) + 1):
optNL(g, g.indent + longIndentWid) optNL(g, g.indent + longIndentWid)
else: else:
put(g, tkSpaces, Space) put(g, tkSpaces, Space)
gsub(g, n.sons[2]) gsub(g, n, 2)
of nkPrefix: of nkPrefix:
gsub(g, n.sons[0]) gsub(g, n, 0)
if n.len > 1: if n.len > 1:
put(g, tkSpaces, Space) put(g, tkSpaces, Space)
if n.sons[1].kind == nkInfix: if n.sons[1].kind == nkInfix:
@ -998,14 +1005,14 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
else: else:
gsub(g, n.sons[1]) gsub(g, n.sons[1])
of nkPostfix: of nkPostfix:
gsub(g, n.sons[1]) gsub(g, n, 1)
gsub(g, n.sons[0]) gsub(g, n, 0)
of nkRange: of nkRange:
gsub(g, n.sons[0]) gsub(g, n, 0)
put(g, tkDotDot, "..") put(g, tkDotDot, "..")
gsub(g, n.sons[1]) gsub(g, n, 1)
of nkDerefExpr: of nkDerefExpr:
gsub(g, n.sons[0]) gsub(g, n, 0)
put(g, tkOpr, "[]") put(g, tkOpr, "[]")
of nkAccQuoted: of nkAccQuoted:
put(g, tkAccent, "`") put(g, tkAccent, "`")
@ -1016,19 +1023,19 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
put(g, tkAccent, "`") put(g, tkAccent, "`")
of nkIfExpr: of nkIfExpr:
putWithSpace(g, tkIf, "if") putWithSpace(g, tkIf, "if")
gsub(g, n.sons[0].sons[0]) if n.len > 0: gsub(g, n.sons[0], 0)
putWithSpace(g, tkColon, ":") putWithSpace(g, tkColon, ":")
gsub(g, n.sons[0].sons[1]) if n.len > 0: gsub(g, n.sons[0], 1)
gsons(g, n, emptyContext, 1) gsons(g, n, emptyContext, 1)
of nkElifExpr: of nkElifExpr:
putWithSpace(g, tkElif, " elif") putWithSpace(g, tkElif, " elif")
gsub(g, n.sons[0]) gsub(g, n, 0)
putWithSpace(g, tkColon, ":") putWithSpace(g, tkColon, ":")
gsub(g, n.sons[1]) gsub(g, n, 1)
of nkElseExpr: of nkElseExpr:
put(g, tkElse, " else") put(g, tkElse, " else")
putWithSpace(g, tkColon, ":") putWithSpace(g, tkColon, ":")
gsub(g, n.sons[0]) gsub(g, n, 0)
of nkTypeOfExpr: of nkTypeOfExpr:
put(g, tkType, "type") put(g, tkType, "type")
put(g, tkParLe, "(") put(g, tkParLe, "(")
@ -1065,10 +1072,10 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
else: else:
put(g, tkDistinct, "distinct") put(g, tkDistinct, "distinct")
of nkTypeDef: of nkTypeDef:
gsub(g, n.sons[0]) gsub(g, n, 0)
gsub(g, n.sons[1]) gsub(g, n, 1)
put(g, tkSpaces, Space) put(g, tkSpaces, Space)
if n.sons[2].kind != nkEmpty: if n.len > 2 and n.sons[2].kind != nkEmpty:
putWithSpace(g, tkEquals, "=") putWithSpace(g, tkEquals, "=")
gsub(g, n.sons[2]) gsub(g, n.sons[2])
of nkObjectTy: of nkObjectTy:
@ -1090,19 +1097,19 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
putNL(g) putNL(g)
of nkOfInherit: of nkOfInherit:
putWithSpace(g, tkOf, "of") putWithSpace(g, tkOf, "of")
gsub(g, n.sons[0]) gsub(g, n, 0)
of nkProcTy: of nkProcTy:
if sonsLen(n) > 0: if sonsLen(n) > 0:
putWithSpace(g, tkProc, "proc") putWithSpace(g, tkProc, "proc")
gsub(g, n.sons[0]) gsub(g, n, 0)
gsub(g, n.sons[1]) gsub(g, n, 1)
else: else:
put(g, tkProc, "proc") put(g, tkProc, "proc")
of nkIteratorTy: of nkIteratorTy:
if sonsLen(n) > 0: if sonsLen(n) > 0:
putWithSpace(g, tkIterator, "iterator") putWithSpace(g, tkIterator, "iterator")
gsub(g, n.sons[0]) gsub(g, n, 0)
gsub(g, n.sons[1]) gsub(g, n, 1)
else: else:
put(g, tkIterator, "iterator") put(g, tkIterator, "iterator")
of nkStaticTy: of nkStaticTy:
@ -1123,10 +1130,10 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
else: else:
put(g, tkEnum, "enum") put(g, tkEnum, "enum")
of nkEnumFieldDef: of nkEnumFieldDef:
gsub(g, n.sons[0]) gsub(g, n, 0)
put(g, tkSpaces, Space) put(g, tkSpaces, Space)
putWithSpace(g, tkEquals, "=") putWithSpace(g, tkEquals, "=")
gsub(g, n.sons[1]) gsub(g, n, 1)
of nkStmtList, nkStmtListExpr, nkStmtListType: gstmts(g, n, emptyContext) of nkStmtList, nkStmtListExpr, nkStmtListType: gstmts(g, n, emptyContext)
of nkIfStmt: of nkIfStmt:
putWithSpace(g, tkIf, "if") putWithSpace(g, tkIf, "if")
@ -1183,22 +1190,22 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
gsub(g, n.sons[0]) gsub(g, n.sons[0])
of nkReturnStmt: of nkReturnStmt:
putWithSpace(g, tkReturn, "return") putWithSpace(g, tkReturn, "return")
gsub(g, n.sons[0]) gsub(g, n, 0)
of nkRaiseStmt: of nkRaiseStmt:
putWithSpace(g, tkRaise, "raise") putWithSpace(g, tkRaise, "raise")
gsub(g, n.sons[0]) gsub(g, n, 0)
of nkYieldStmt: of nkYieldStmt:
putWithSpace(g, tkYield, "yield") putWithSpace(g, tkYield, "yield")
gsub(g, n.sons[0]) gsub(g, n, 0)
of nkDiscardStmt: of nkDiscardStmt:
putWithSpace(g, tkDiscard, "discard") putWithSpace(g, tkDiscard, "discard")
gsub(g, n.sons[0]) gsub(g, n, 0)
of nkBreakStmt: of nkBreakStmt:
putWithSpace(g, tkBreak, "break") putWithSpace(g, tkBreak, "break")
gsub(g, n.sons[0]) gsub(g, n, 0)
of nkContinueStmt: of nkContinueStmt:
putWithSpace(g, tkContinue, "continue") putWithSpace(g, tkContinue, "continue")
gsub(g, n.sons[0]) gsub(g, n, 0)
of nkPragma: of nkPragma:
if renderNoPragmas notin g.flags: if renderNoPragmas notin g.flags:
if g.inPragma <= 0: if g.inPragma <= 0:
@ -1226,7 +1233,7 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
putWithSpace(g, tkImport, "import") putWithSpace(g, tkImport, "import")
else: else:
putWithSpace(g, tkExport, "export") putWithSpace(g, tkExport, "export")
gsub(g, n.sons[0]) gsub(g, n, 0)
put(g, tkSpaces, Space) put(g, tkSpaces, Space)
putWithSpace(g, tkExcept, "except") putWithSpace(g, tkExcept, "except")
gcommaAux(g, n, g.indent, 1) gcommaAux(g, n, g.indent, 1)
@ -1234,7 +1241,7 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
putNL(g) putNL(g)
of nkFromStmt: of nkFromStmt:
putWithSpace(g, tkFrom, "from") putWithSpace(g, tkFrom, "from")
gsub(g, n.sons[0]) gsub(g, n, 0)
put(g, tkSpaces, Space) put(g, tkSpaces, Space)
putWithSpace(g, tkImport, "import") putWithSpace(g, tkImport, "import")
gcomma(g, n, emptyContext, 1) gcomma(g, n, emptyContext, 1)
@ -1257,10 +1264,10 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
gcoms(g) gcoms(g)
gstmts(g, lastSon(n), c) gstmts(g, lastSon(n), c)
of nkImportAs: of nkImportAs:
gsub(g, n.sons[0]) gsub(g, n, 0)
put(g, tkSpaces, Space) put(g, tkSpaces, Space)
putWithSpace(g, tkAs, "as") putWithSpace(g, tkAs, "as")
gsub(g, n.sons[1]) gsub(g, n, 1)
of nkBindStmt: of nkBindStmt:
putWithSpace(g, tkBind, "bind") putWithSpace(g, tkBind, "bind")
gcomma(g, n, c) gcomma(g, n, c)
@ -1270,7 +1277,7 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
of nkElifBranch: of nkElifBranch:
optNL(g) optNL(g)
putWithSpace(g, tkElif, "elif") putWithSpace(g, tkElif, "elif")
gsub(g, n.sons[0]) gsub(g, n, 0)
putWithSpace(g, tkColon, ":") putWithSpace(g, tkColon, ":")
gcoms(g) gcoms(g)
gstmts(g, n.sons[1], c) gstmts(g, n.sons[1], c)
@ -1304,7 +1311,7 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
put(g, tkParLe, "(") put(g, tkParLe, "(")
gsemicolon(g, n, 1) gsemicolon(g, n, 1)
put(g, tkParRi, ")") put(g, tkParRi, ")")
if n.sons[0].kind != nkEmpty: if n.len > 0 and n.sons[0].kind != nkEmpty:
putWithSpace(g, tkColon, ":") putWithSpace(g, tkColon, ":")
gsub(g, n.sons[0]) gsub(g, n.sons[0])
of nkTupleTy: of nkTupleTy:
@ -1316,7 +1323,7 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
put(g, tkTuple, "tuple") put(g, tkTuple, "tuple")
of nkMetaNode_Obsolete: of nkMetaNode_Obsolete:
put(g, tkParLe, "(META|") put(g, tkParLe, "(META|")
gsub(g, n.sons[0]) gsub(g, n, 0)
put(g, tkParRi, ")") put(g, tkParRi, ")")
of nkGotoState, nkState: of nkGotoState, nkState:
var c: TContext var c: TContext