From 6a9a35db61e1e47652fa667ff557555e87a6edeb Mon Sep 17 00:00:00 2001 From: Ganesh Viswanathan Date: Wed, 15 Apr 2020 23:42:22 -0500 Subject: ast2 varargs support --- nimterop/ast2.nim | 11 +++++++++++ nimterop/getters.nim | 14 ++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/nimterop/ast2.nim b/nimterop/ast2.nim index 5bb33ae..554c507 100644 --- a/nimterop/ast2.nim +++ b/nimterop/ast2.nim @@ -686,6 +686,10 @@ proc newProcTy(nimState: NimState, name: string, node: TSNode, rtyp: PNode): PNo result.add nimState.newFormalParams(name, node, rtyp) result.add nimState.newPragma(node, nimState.gState.convention) + # Add varargs if ... + if node.getVarargs(): + nimState.addPragma(node, result[^1], "varargs") + proc processNode(nimState: NimState, node: TSNode): bool proc newRecListTree(nimState: NimState, name: string, node: TSNode): PNode = # Create nkRecList tree for specified object @@ -1582,6 +1586,9 @@ proc addProc(nimState: NimState, node, rnode: TSNode) = # {.impnameC.} shortcut nimState.newPragma(node, nimState.impShort & "C") + # Detect ... and add {.varargs.} + pvarargs = plist.getVarargs() + # Need {.convention.} and {.header.} if applicable if name != origname: if nimState.includeHeader(): @@ -1595,6 +1602,10 @@ proc addProc(nimState: NimState, node, rnode: TSNode) = # {.dynlib.} for DLLs nimState.addPragma(node, prident, "dynlib", nimState.getIdent(nimState.gState.dynlib)) + if pvarargs: + # Add {.varargs.} for ... + nimState.addPragma(node, prident, "varargs") + procDef.add prident procDef.add newNode(nkEmpty) procDef.add newNode(nkEmpty) diff --git a/nimterop/getters.nim b/nimterop/getters.nim index aeefbd8..c971bfc 100644 --- a/nimterop/getters.nim +++ b/nimterop/getters.nim @@ -288,6 +288,20 @@ proc getDeclarator*(node: TSNode): TSNode = elif node.len != 0: return node[0].getDeclarator() +proc getVarargs*(node: TSNode): bool = + # Detect ... and add {.varargs.} + # + # `node` is the param list + # + # ... is an unnamed node, second last node and ) is last node + let + nlen = node.tsNodeChildCount() + if nlen > 1: + let + nval = node.tsNodeChild(nlen - 2).getName() + if nval == "...": + result = true + proc firstChildInTree*(node: TSNode, ntype: string): TSNode = # Search for node type in tree - first children var -- cgit v1.2.3