Add multiple pointer support
This commit is contained in:
parent
87eef11ec1
commit
d5c15d0d3a
5 changed files with 54 additions and 52 deletions
|
|
@ -8,17 +8,6 @@ import "."/treesitter/api
|
|||
|
||||
import "."/[comphelp, exprparser, globals, getters, tshelp]
|
||||
|
||||
proc getPtrType*(str: string): string =
|
||||
result = case str:
|
||||
of "cchar":
|
||||
"cstring"
|
||||
of "object":
|
||||
"pointer"
|
||||
of "FILE":
|
||||
"File"
|
||||
else:
|
||||
str
|
||||
|
||||
proc getOverrideOrSkip(gState: State, node: TSNode, origname: string, kind: NimSymKind): PNode =
|
||||
# Check if symbol `origname` of `kind` and `origname` has any cOverride defined
|
||||
# and use that if present
|
||||
|
|
@ -405,43 +394,6 @@ proc newXIdent(gState: State, node: TSNode, kind = nskType, fname = "", pragmas:
|
|||
else:
|
||||
gecho &"# $1 '{origname}' is duplicate, skipped" % getKeyword(kind)
|
||||
|
||||
proc newPtrTree(gState: State, 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
|
||||
if typ.kind == nkIdent:
|
||||
let
|
||||
tname = typ.ident.s
|
||||
ptname = getPtrType(tname)
|
||||
if tname != ptname:
|
||||
# If Nim type available, use that ident
|
||||
result = gState.getIdent(ptname, typ.info, exported = false)
|
||||
# One ptr reduced
|
||||
count -= 1
|
||||
if count > 0:
|
||||
# Nested nkPtrTy(typ) depending on count
|
||||
#
|
||||
# [ptr ...] typ
|
||||
#
|
||||
# nkPtrTy(
|
||||
# nkPtrTy(
|
||||
# typ
|
||||
# )
|
||||
# )
|
||||
var
|
||||
nresult = newNode(nkPtrTy)
|
||||
parent = nresult
|
||||
child: PNode
|
||||
for i in 1 ..< count:
|
||||
child = newNode(nkPtrTy)
|
||||
parent.add child
|
||||
parent = child
|
||||
parent.add result
|
||||
result = nresult
|
||||
|
||||
proc newArrayTree(gState: State, node: TSNode, typ, size: PNode = nil): PNode =
|
||||
# Create nkBracketExpr tree depending on input
|
||||
#
|
||||
|
|
|
|||
|
|
@ -15,4 +15,52 @@ proc parseString*(gState: State, str: string): PNode =
|
|||
str, gState.identCache, gState.config, errorHandler = handleError
|
||||
)
|
||||
except:
|
||||
decho getCurrentExceptionMsg()
|
||||
decho getCurrentExceptionMsg()
|
||||
|
||||
proc getPtrType*(str: string): string =
|
||||
result = case str:
|
||||
of "cchar":
|
||||
"cstring"
|
||||
of "object":
|
||||
"pointer"
|
||||
of "FILE":
|
||||
"File"
|
||||
else:
|
||||
str
|
||||
|
||||
proc newPtrTree*(gState: State, 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
|
||||
if typ.kind == nkIdent:
|
||||
let
|
||||
tname = typ.ident.s
|
||||
ptname = getPtrType(tname)
|
||||
if tname != ptname:
|
||||
# If Nim type available, use that ident
|
||||
result = gState.getIdent(ptname, typ.info, exported = false)
|
||||
# One ptr reduced
|
||||
count -= 1
|
||||
if count > 0:
|
||||
# Nested nkPtrTy(typ) depending on count
|
||||
#
|
||||
# [ptr ...] typ
|
||||
#
|
||||
# nkPtrTy(
|
||||
# nkPtrTy(
|
||||
# typ
|
||||
# )
|
||||
# )
|
||||
var
|
||||
nresult = newNode(nkPtrTy)
|
||||
parent = nresult
|
||||
child: PNode
|
||||
for i in 1 ..< count:
|
||||
child = newNode(nkPtrTy)
|
||||
parent.add child
|
||||
parent = child
|
||||
parent.add result
|
||||
result = nresult
|
||||
|
|
@ -550,12 +550,12 @@ proc processTSNode(gState: State, node: TSNode, typeofNode: var PNode): PNode =
|
|||
result = gState.parseString(node.val)
|
||||
of "type_descriptor":
|
||||
let pointerDecl = node.anyChildInTree("abstract_pointer_declarator")
|
||||
|
||||
if pointerDecl.isNil:
|
||||
result = gState.processTSNode(node[0], typeofNode)
|
||||
else:
|
||||
result = nkPtrTy.newTree(
|
||||
gState.processTSNode(node[0], typeofNode)
|
||||
)
|
||||
let pointerCount = pointerDecl.getXCount("abstract_pointer_declarator")
|
||||
result = gState.newPtrTree(pointerCount, gState.processTSNode(node[0], typeofNode))
|
||||
of "sized_type_specifier", "primitive_type", "type_identifier":
|
||||
# Input -> int, unsigned int, long int, etc
|
||||
# Output -> cint, cuint, clong, etc
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ extern "C" {
|
|||
#define COERCE2 645635634896 + 35436ul
|
||||
#define BINEXPR ~(-(1u << !-1)) ^ (10 >> 1)
|
||||
#define POINTEREXPR (int*)0
|
||||
#define POINTERPOINTERPOINTEREXPR (int***)0
|
||||
#define BOOL true
|
||||
#define MATHEXPR (1 + 2/3*20 - 100)
|
||||
#define ANDEXPR (100 & 11000)
|
||||
|
|
|
|||
|
|
@ -151,6 +151,7 @@ assert SHL2 == (1.uint shl 2)
|
|||
assert SHL3 == (1.uint shl 3)
|
||||
|
||||
assert typeof(POINTEREXPR) is (ptr cint)
|
||||
assert typeof(POINTERPOINTERPOINTEREXPR) is (ptr ptr ptr cint)
|
||||
|
||||
assert ALLSHL == (SHL1 or SHL2 or SHL3)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue