aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGanesh Viswanathan <dev@genotrance.com>2020-05-06 14:18:15 -0500
committerGanesh Viswanathan <dev@genotrance.com>2020-05-06 14:18:15 -0500
commit1a1ae30456aa05083cdffdf22b56473390ad5f10 (patch)
tree4a86fc1ca6abf0fd496970d52679e663689c001a
parentfabb46a639ad38c349e22f5fc0ab37b187772ec3 (diff)
parentc7060f4c5598228585f35057b57bc7435c7f09ce (diff)
downloadnimterop-1a1ae30456aa05083cdffdf22b56473390ad5f10.tar.gz
nimterop-1a1ae30456aa05083cdffdf22b56473390ad5f10.zip
Merge branch 'master' of https://github.com/nimterop/nimterop
-rw-r--r--nimterop/ast2.nim50
-rw-r--r--nimterop/comphelp.nim50
-rw-r--r--nimterop/exprparser.nim21
-rw-r--r--tests/include/tast2.h2
-rw-r--r--tests/tast2.nim3
5 files changed, 75 insertions, 51 deletions
diff --git a/nimterop/ast2.nim b/nimterop/ast2.nim
index fd70b46..6f05a34 100644
--- a/nimterop/ast2.nim
+++ b/nimterop/ast2.nim
@@ -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
@@ -117,7 +106,7 @@ proc newConstDef(gState: State, node: TSNode, fname = "", fval = ""): PNode =
if not maybeTyNode.isNil:
let name = maybeTyNode.getName()
case name
- of "type_descriptor", "sized_type_specifier":
+ of "type_descriptor", "sized_type_specifier", "primitive_type", "type_identifier":
discard
else:
# Can't do gState.parseCExpression(root) here for some reason?
@@ -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
#
diff --git a/nimterop/comphelp.nim b/nimterop/comphelp.nim
index 1709f8b..18915b0 100644
--- a/nimterop/comphelp.nim
+++ b/nimterop/comphelp.nim
@@ -15,4 +15,52 @@ proc parseString*(gState: State, str: string): PNode =
str, gState.identCache, gState.config, errorHandler = handleError
)
except:
- decho getCurrentExceptionMsg() \ No newline at end of file
+ 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 \ No newline at end of file
diff --git a/nimterop/exprparser.nim b/nimterop/exprparser.nim
index e68c0b1..b0c34c1 100644
--- a/nimterop/exprparser.nim
+++ b/nimterop/exprparser.nim
@@ -548,7 +548,26 @@ proc processTSNode(gState: State, node: TSNode, typeofNode: var PNode): PNode =
# Input -> true, false
# Output -> true, false
result = gState.parseString(node.val)
- of "type_descriptor", "sized_type_specifier":
+ of "type_descriptor":
+ # Input => int*
+ # (type_descriptor 1 2 4 "int*"
+ # (type_identifier 1 2 3 "int")
+ # (abstract_pointer_declarator 1 3 1 "*")
+ # )
+ #
+ # Output => ptr int
+ #
+ # nkPtrTy(
+ # nkIdent("int")
+ # )
+ let pointerDecl = node.anyChildInTree("abstract_pointer_declarator")
+
+ if pointerDecl.isNil:
+ result = gState.processTSNode(node[0], typeofNode)
+ else:
+ 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
let ty = getType(node.val)
diff --git a/tests/include/tast2.h b/tests/include/tast2.h
index 2ddb58e..0b1fca2 100644
--- a/tests/include/tast2.h
+++ b/tests/include/tast2.h
@@ -20,6 +20,8 @@ extern "C" {
#define COERCE 645635634896ull + 35436
#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)
diff --git a/tests/tast2.nim b/tests/tast2.nim
index 54b89e5..6cdd606 100644
--- a/tests/tast2.nim
+++ b/tests/tast2.nim
@@ -150,6 +150,9 @@ assert SHL1 == (1.uint shl 1)
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)
assert A0 is object