diff options
| author | Ganesh Viswanathan <dev@genotrance.com> | 2020-05-06 14:18:15 -0500 |
|---|---|---|
| committer | Ganesh Viswanathan <dev@genotrance.com> | 2020-05-06 14:18:15 -0500 |
| commit | 1a1ae30456aa05083cdffdf22b56473390ad5f10 (patch) | |
| tree | 4a86fc1ca6abf0fd496970d52679e663689c001a | |
| parent | fabb46a639ad38c349e22f5fc0ab37b187772ec3 (diff) | |
| parent | c7060f4c5598228585f35057b57bc7435c7f09ce (diff) | |
| download | nimterop-1a1ae30456aa05083cdffdf22b56473390ad5f10.tar.gz nimterop-1a1ae30456aa05083cdffdf22b56473390ad5f10.zip | |
Merge branch 'master' of https://github.com/nimterop/nimterop
| -rw-r--r-- | nimterop/ast2.nim | 50 | ||||
| -rw-r--r-- | nimterop/comphelp.nim | 50 | ||||
| -rw-r--r-- | nimterop/exprparser.nim | 21 | ||||
| -rw-r--r-- | tests/include/tast2.h | 2 | ||||
| -rw-r--r-- | tests/tast2.nim | 3 |
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 |
