ast2 bug fixes - getIdentName, ptr object, header const
This commit is contained in:
parent
cadf16293d
commit
c113ecec98
3 changed files with 28 additions and 22 deletions
|
|
@ -81,14 +81,15 @@ proc newConstDef(nimState: NimState, node: TSNode, fname = "", fval = ""): PNode
|
|||
#
|
||||
# If `fname` or `fval` are set, use them as name and val
|
||||
let
|
||||
# node[0] = identifier = const name
|
||||
(cname, origname, info) = nimState.getNameInfo(node.getAtom(), nskConst)
|
||||
|
||||
name =
|
||||
origname =
|
||||
if fname.nBl:
|
||||
fname
|
||||
else:
|
||||
cname
|
||||
# node[0] = identifier = const name
|
||||
nimState.getNodeVal(node.getAtom())
|
||||
|
||||
name = nimState.getIdentifier(origname, nskConst)
|
||||
info = nimState.getLineInfo(node)
|
||||
ident = nimState.getIdent(name, info)
|
||||
|
||||
# node[1] = preproc_arg = value
|
||||
|
|
@ -144,7 +145,7 @@ proc addConst(nimState: NimState, node: TSNode) =
|
|||
if not constDef.isNil:
|
||||
# nkConstSection.add
|
||||
nimState.constSection.add constDef
|
||||
nimState.constIdentifiers.incl $constDef[0][1]
|
||||
nimState.constIdentifiers.incl constDef.getIdentName()
|
||||
|
||||
nimState.printDebug(constDef)
|
||||
|
||||
|
|
@ -259,9 +260,9 @@ proc newPtrTree(nimState: NimState, count: int, typ: PNode): PNode =
|
|||
# Create nkPtrTy tree depending on count
|
||||
#
|
||||
# Reduce by 1 if Nim type available for ptr X - e.g. ptr cchar = cstring
|
||||
result = typ
|
||||
var
|
||||
count = count
|
||||
chng = false
|
||||
if typ.kind == nkIdent:
|
||||
let
|
||||
tname = typ.ident.s
|
||||
|
|
@ -269,7 +270,6 @@ proc newPtrTree(nimState: NimState, count: int, typ: PNode): PNode =
|
|||
if tname != ptname:
|
||||
# If Nim type available, use that ident
|
||||
result = nimState.getIdent(ptname, typ.info, exported = false)
|
||||
chng = true
|
||||
# One ptr reduced
|
||||
count -= 1
|
||||
if count > 0:
|
||||
|
|
@ -282,18 +282,16 @@ proc newPtrTree(nimState: NimState, count: int, typ: PNode): PNode =
|
|||
# typ
|
||||
# )
|
||||
# )
|
||||
result = newNode(nkPtrTy)
|
||||
var
|
||||
parent = result
|
||||
nresult = newNode(nkPtrTy)
|
||||
parent = nresult
|
||||
child: PNode
|
||||
for i in 1 ..< count:
|
||||
child = newNode(nkPtrTy)
|
||||
parent.add child
|
||||
parent = child
|
||||
parent.add typ
|
||||
elif not chng:
|
||||
# Either no ptr, or none left after Nim type adjustment
|
||||
result = typ
|
||||
parent.add result
|
||||
result = nresult
|
||||
|
||||
proc newArrayTree(nimState: NimState, node: TSNode, typ, size: PNode): PNode =
|
||||
# Create nkBracketExpr tree depending on input
|
||||
|
|
@ -501,7 +499,7 @@ proc addTypeObject(nimState: NimState, node: TSNode, typeDef: PNode = nil, fname
|
|||
# )
|
||||
# )
|
||||
let
|
||||
name = $typeDef[0][1]
|
||||
name = typeDef.getIdentName()
|
||||
obj = newNode(nkObjectTy)
|
||||
obj.add newNode(nkEmpty)
|
||||
obj.add newNode(nkEmpty)
|
||||
|
|
@ -555,7 +553,7 @@ proc addTypeTyped(nimState: NimState, node: TSNode, ftname = "", offset = 0) =
|
|||
|
||||
if not typeDef.isNil:
|
||||
let
|
||||
name = $typeDef[0][1]
|
||||
name = typeDef.getIdentName()
|
||||
|
||||
# node[start] = identifier = type name
|
||||
(tname0, _, tinfo) = nimState.getNameInfo(node[start].getAtom(), nskType, parent = name)
|
||||
|
|
@ -573,7 +571,7 @@ proc addTypeTyped(nimState: NimState, node: TSNode, ftname = "", offset = 0) =
|
|||
count = node[i].getPtrCount()
|
||||
|
||||
# Skip typedef X X;
|
||||
if $typeDef[0][1] != tname:
|
||||
if name != tname:
|
||||
if count > 0:
|
||||
# If pointers
|
||||
typeDef.add nimState.newPtrTree(count, ident)
|
||||
|
|
@ -661,7 +659,7 @@ proc addTypeArray(nimState: NimState, node: TSNode) =
|
|||
|
||||
if not typeDef.isNil:
|
||||
let
|
||||
name = $typeDef[0][1]
|
||||
name = typeDef.getIdentName()
|
||||
typ = nimState.getTypeArray(node, name)
|
||||
|
||||
typeDef.add typ
|
||||
|
|
@ -737,7 +735,7 @@ proc addTypeProc(nimState: NimState, node: TSNode) =
|
|||
|
||||
if not typeDef.isNil:
|
||||
let
|
||||
name = $typeDef[0][1]
|
||||
name = typeDef.getIdentName()
|
||||
|
||||
procTy = nimState.getTypeProc(name, node)
|
||||
|
||||
|
|
@ -1064,7 +1062,7 @@ proc addProc(nimState: NimState, node: TSNode) =
|
|||
let
|
||||
# Only need the ident tree, not nkTypeDef parent
|
||||
ident = tident[0]
|
||||
name = $tident[0][1]
|
||||
name = tident.getIdentName()
|
||||
|
||||
# node[start+1] could have nested pointers
|
||||
tcount = node[start+1].getPtrCount()
|
||||
|
|
@ -1197,7 +1195,7 @@ proc setupPragmas(nimState: NimState, root: TSNode, fullpath: string) =
|
|||
|
||||
if nimState.includeHeader():
|
||||
nimState.constSection.add nimState.newConstDef(
|
||||
root, fname = nimState.currentHeader, fval = fullpath)
|
||||
root, fname = nimState.currentHeader, fval = '"' & fullpath & '"')
|
||||
|
||||
nimState.addPragma(root, impPragma, "header", newStrNode(nkStrLit, nimState.currentHeader))
|
||||
|
||||
|
|
|
|||
|
|
@ -453,6 +453,14 @@ proc getIdent*(nimState: NimState, name: string, info: TLineInfo, exported = tru
|
|||
proc getIdent*(nimState: NimState, name: string): PNode =
|
||||
nimState.getIdent(name, nimState.getDefaultLineInfo(), exported = false)
|
||||
|
||||
proc getIdentName*(node: PNode): string =
|
||||
if not node.isNil:
|
||||
for i in 0 ..< node.len:
|
||||
if node[i].kind == nkIdent and $node[i] != "*":
|
||||
result = $node[i]
|
||||
if result.Bl and node.len > 0:
|
||||
result = node[0].getIdentName()
|
||||
|
||||
proc getNameInfo*(nimState: NimState, node: TSNode, kind: NimSymKind, parent = ""):
|
||||
tuple[name, origname: string, info: TLineInfo] =
|
||||
# Shortcut to get identifier name and info (node value and line:col)
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ cOverride:
|
|||
proc weirdfunc(apple: ptr ptr ptr cchar): int {.importc.}
|
||||
proc weirdfunc2(mango: ptr ptr cchar): int {.importc.}
|
||||
|
||||
cImport cSearchPath "test.h"
|
||||
cImport(cSearchPath("test.h"))
|
||||
|
||||
check TEST_INT == 512
|
||||
check TEST_FLOAT == 5.12
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue