aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGanesh Viswanathan <dev@genotrance.com>2019-01-15 17:55:38 -0600
committerGanesh Viswanathan <dev@genotrance.com>2019-01-15 17:55:38 -0600
commit11c896f82e00fce82e159d781243c2036346cc58 (patch)
treea5a178a4e2b0b2e68fbba56965cb7c52e2dccf37
parent04d01a5f6ebf85f846ab54bd86011f733b42879c (diff)
downloadnimterop-11c896f82e00fce82e159d781243c2036346cc58.tar.gz
nimterop-11c896f82e00fce82e159d781243c2036346cc58.zip
Support array pointer in struct
-rw-r--r--nimterop/ast.nim22
-rw-r--r--nimterop/grammar.nim21
2 files changed, 31 insertions, 12 deletions
diff --git a/nimterop/ast.nim b/nimterop/ast.nim
index 8f880da..8a61fe0 100644
--- a/nimterop/ast.nim
+++ b/nimterop/ast.nim
@@ -33,15 +33,25 @@ proc saveNodeData(node: TSNode): bool =
if name in ["math_expression", "primitive_type", "sized_type_specifier"]:
val = val.getType()
- if node.tsNodePrevNamedSibling().tsNodeIsNull() and
- ((node.isPName("pointer_declarator") and not node.isPPName("function_declarator")) or
- (node.getPName() in ["function_declarator", "array_declarator"] and node.isPPName("pointer_declarator"))):
- gStateRT.data.add(("pointer_declarator", ""))
+ let
+ pname = node.getPName()
+ ppname = node.tsNodeParent().getPName()
+
+ if node.tsNodePrevNamedSibling().tsNodeIsNull():
+ if pname == "pointer_declarator":
+ if ppname notin ["function_declarator", "array_declarator"]:
+ gStateRT.data.add(("pointer_declarator", ""))
+ elif ppname == "array_declarator":
+ gStateRT.data.add(("array_pointer_declarator", ""))
+ elif pname in ["function_declarator", "array_declarator"]:
+ if ppname == "pointer_declarator":
+ gStateRT.data.add(("pointer_declarator", ""))
gStateRT.data.add((name, val))
- if node.tsNodeType() == "field_identifier" and node.isPName("pointer_declarator") and
- node.isPPName("function_declarator"):
+ if node.tsNodeType() == "field_identifier" and
+ pname == "pointer_declarator" and
+ ppname == "function_declarator":
gStateRT.data.add(("function_declarator", ""))
elif name in ["abstract_pointer_declarator", "enumerator", "field_declaration", "function_declarator"]:
diff --git a/nimterop/grammar.nim b/nimterop/grammar.nim
index ab80356..a72df53 100644
--- a/nimterop/grammar.nim
+++ b/nimterop/grammar.nim
@@ -165,25 +165,31 @@ proc initGrammar() =
i = fstart
ftyp, fname: string
fptr = ""
+ aptr = ""
while i < gStateRT.data.len-fend:
fptr = ""
+ aptr = ""
if gStateRT.data[i].name == "field_declaration":
i += 1
continue
- if gStateRT.data[i].name notin ["field_identifier", "pointer_declarator"]:
+ if gStateRT.data[i].name notin ["field_identifier", "pointer_declarator", "array_pointer_declarator"]:
ftyp = gStateRT.data[i].val.getType()
i += 1
- if gStateRT.data[i].name == "pointer_declarator":
- fptr = "ptr "
- i += 1
+ case gStateRT.data[i].name:
+ of "pointer_declarator":
+ fptr = "ptr "
+ i += 1
+ of "array_pointer_declarator":
+ aptr = "ptr "
+ i += 1
fname = gStateRT.data[i].val.getIdentifier()
if i+1 < gStateRT.data.len-fend and gStateRT.data[i+1].name in ["identifier", "number_literal"]:
let
flen = gStateRT.data[i+1].val.getIdentifier()
- gStateRT.typeStr &= &" {fname}*: array[{flen}, {fptr}{ftyp}]\n"
+ gStateRT.typeStr &= &" {fname}*: {aptr}array[{flen}, {fptr}{ftyp}]\n"
i += 2
elif i+1 < gStateRT.data.len-fend and gStateRT.data[i+1].name == "function_declarator":
var
@@ -219,7 +225,10 @@ proc initGrammar() =
fieldGrammar = &"""
(field_identifier!)
(array_declarator!
- (field_identifier)
+ (field_identifier!)
+ (pointer_declarator
+ (field_identifier)
+ )
(identifier|number_literal)
)
(function_declarator+