ast2 pragmas for types

This commit is contained in:
Ganesh Viswanathan 2020-03-24 15:48:54 -05:00
commit e98564528e
2 changed files with 25 additions and 8 deletions

View file

@ -192,8 +192,13 @@ proc addPragma(nimState: NimState, node: TSNode, pragma: PNode, name: string, va
colExpr.add value
pragma.add colExpr
proc addPragma(nimState: NimState, node: TSNode, pragma: PNode, pragmas: seq[string]) =
# Add sequence of pragmas to an existing nkPragma tree
for name in pragmas:
nimState.addPragma(node, pragma, name)
proc addPragma(nimState: NimState, node: TSNode, pragma: PNode, pragmas: OrderedTable[string, PNode]) =
# Add pragmas to an existing nkPragma tree
# Add a table of name:value pragmas to an existing nkPragma tree
for name, value in pragmas.pairs:
nimState.addPragma(node, pragma, name, value)
@ -212,7 +217,7 @@ proc newPragma(nimState: NimState, node: TSNode, name: string, value: PNode = ni
result = newNode(nkPragma)
nimState.addPragma(node, result, name, value)
proc newPragma(nimState: NimState, node: TSNode, pragmas: OrderedTable[string, PNode]): PNode =
proc newPragma(nimState: NimState, node: TSNode, pragmas: seq[string] | OrderedTable[string, PNode]): PNode =
# Create nkPragma tree for multiple name:value
result = newNode(nkPragma)
nimState.addPragma(node, result, pragmas)
@ -237,13 +242,13 @@ proc newPragmaExpr(nimState: NimState, node: TSNode, ident: PNode, name: string,
result.add ident
result.add nimState.newPragma(node, name, value)
proc newPragmaExpr(nimState: NimState, node: TSNode, ident: PNode, pragmas: OrderedTable[string, PNode]): PNode {.used.} =
proc newPragmaExpr(nimState: NimState, node: TSNode, ident: PNode, pragmas: seq[string] | OrderedTable[string, PNode]): PNode =
# Create nkPragmaExpr tree for multiple name:value
result = newNode(nkPragmaExpr)
result.add ident
result.add nimState.newPragma(node, pragmas)
proc newTypeIdent(nimState: NimState, node: TSNode, fname = "", union = false): PNode =
proc newTypeIdent(nimState: NimState, node: TSNode, fname = "", pragmas: seq[string] = @[]): PNode =
# Create nkTypeDef PNode with first ident
#
# If `fname`, use it instead of node.getAtom() for name
@ -258,8 +263,8 @@ proc newTypeIdent(nimState: NimState, node: TSNode, fname = "", union = false):
ident = nimState.getIdent(name, info)
prident =
if union:
nimState.newPragmaExpr(node, ident, "union")
if pragmas.nBl and not ident.isNil:
nimState.newPragmaExpr(node, ident, pragmas)
else:
ident
@ -509,9 +514,15 @@ proc addTypeObject(nimState: NimState, node: TSNode, typeDef: PNode = nil, fname
# If `fname` is set, use it as the name when creating new PNode
decho("addTypeObject()")
let
pragmas =
if union:
@["union", "bycopy"]
else:
@["bycopy"]
typeDef =
if typeDef.isNil:
nimState.newTypeIdent(node, fname, union = union)
nimState.newTypeIdent(node, fname, pragmas)
else:
typeDef
@ -546,6 +557,12 @@ proc addTypeObject(nimState: NimState, node: TSNode, typeDef: PNode = nil, fname
typeDef.add obj
# If typeDef was passed in, need to add pragmas if any
if pragmas.nBl and typeDef[0].kind != nkPragmaExpr:
let
npexpr = nimState.newPragmaExpr(node, typedef[0], pragmas)
typedef[0] = npexpr
# nkTypeSection.add
nimState.typeSection.add typeDef

View file

@ -958,7 +958,7 @@ macro getHeader*(header: static[string], giturl: static[string] = "", dlurl: sta
preBuild = newIdentNode(name & "PreBuild")
# Regex for library search
lre = "(lib)?$1[_]?(static)?[0-9.\\-]*\\"
lre = "(lib)?$1[_-]?(static)?[0-9.\\-]*\\"
# If -d:xxx set with setDefines()
stdVal = gDefines.hasKey(stdStr)