From 0deb2939bf5ec5e4b98149046b0e553f38979c41 Mon Sep 17 00:00:00 2001 From: Joey Yakimowich-Payne Date: Wed, 13 May 2020 17:29:26 -0600 Subject: [PATCH] Make undefined constants keep types --- nimterop/ast2.nim | 29 ++++++++++++----------------- nimterop/toast.nim | 2 ++ tests/include/tast2.h | 12 +++++------- tests/tast2.nim | 6 +++--- 4 files changed, 22 insertions(+), 27 deletions(-) diff --git a/nimterop/ast2.nim b/nimterop/ast2.nim index 574870f..3b708b5 100644 --- a/nimterop/ast2.nim +++ b/nimterop/ast2.nim @@ -574,11 +574,8 @@ iterator newIdentDefs(gState: State, name: string, node: TSNode, offset: SomeInt pident = gState.getIdent(pname, pinfo, exported) result.add pident let tyArray = gState.getTypeArray(node[i], tident, name) - if tyArray.kind != nkNone: - result.add tyArray - result.add newNode(nkEmpty) - else: - result = nil + result.add tyArray + result.add newNode(nkEmpty) else: result = nil @@ -953,14 +950,16 @@ proc getTypeArray(gState: State, node: TSNode, tident: PNode, name: string): PNo for i in 0 ..< acount: if cnode.len == 2: # type name[X] => array[X, type] - let - # Size of array could be a Nim expression - size = gState.parseCExpression(gState.getNodeVal(cnode[1])) - if size.kind != nkNone: - result = gState.newArrayTree(cnode, result, size) - cnode = cnode[0] - else: - result = newNode(nkNone) + var size: PNode + let cnodeVal = gState.getNodeVal(cnode[1]) + # Size of array could be a Nim expression + size = gState.parseCExpression(cnodeVal) + if size.kind == nkNone: + # If the size could not be parsed, leave it alone + size = gState.getIdent(cnodeVal) + + result = gState.newArrayTree(cnode, result, size) + cnode = cnode[0] elif cnode.len == 1: # type name[] = UncheckedArray[type] result = gState.newArrayTree(cnode, result) @@ -991,10 +990,6 @@ proc addTypeArray(gState: State, node: TSNode) = name = typeDef.getIdentName() typ = gState.getTypeArray(node[i], tident, name) - if typ.kind == nkNone: - gecho (&"{gState.getNodeVal(node)} skipped").getCommented() - continue - typeDef.add typ # type X* = [ptr] array[x, [ptr] Y] diff --git a/nimterop/toast.nim b/nimterop/toast.nim index b1f910c..f54aa67 100644 --- a/nimterop/toast.nim +++ b/nimterop/toast.nim @@ -4,6 +4,8 @@ import "."/treesitter/[api, c, cpp] import "."/[ast, ast2, build, globals, getters, grammar, tshelp] +{.passC: "-DNIMTEROP".} + proc process(gState: State, path: string, astTable: AstTable) = doAssert existsFile(path), &"Invalid path {path}" diff --git a/tests/include/tast2.h b/tests/include/tast2.h index 57c060e..b8433f9 100644 --- a/tests/include/tast2.h +++ b/tests/include/tast2.h @@ -42,17 +42,16 @@ extern "C" { #define REG_STR "regular string" #define NOTSUPPORTEDSTR "not a " REG_STR -#define NULLCHAR '\0'/* comments should not break things*/ -#define OCTCHAR '\012' // nor should this comment +#define NULLCHAR '\0' +#define OCTCHAR '\012' #define HEXCHAR '\xFE' #define TRICKYSTR "\x4E\034\nfoo\0\'\"\r\v\a\b\e\f\t\\\?bar" #define ALLSHL (SHL1 | SHL2 | SHL3) -// disable for windows for now -#ifndef _WIN32 -// const not supported yet -const int SOME_CONST = 8; +#ifdef NIMTEROP +#define SOME_CONST 8 +#endif struct some_struct_s { @@ -65,7 +64,6 @@ struct parent_struct_s }; typedef struct some_struct_s SOME_ARRAY[SOME_CONST]; -#endif struct A0; struct A1 {}; diff --git a/tests/tast2.nim b/tests/tast2.nim index f132609..8deb99e 100644 --- a/tests/tast2.nim +++ b/tests/tast2.nim @@ -35,6 +35,7 @@ cOverride: type A1* = A0 +cDefine("SOME_CONST=100") cImport(path, flags="-f:ast2 -ENK_,SDL_ -GVICE=SLICE -TMyInt=cint" & flags) proc getPragmas(n: NimNode): HashSet[string] = @@ -155,9 +156,8 @@ assert typeof(POINTERPOINTERPOINTEREXPR) is (ptr ptr ptr cint) assert ALLSHL == (SHL1 or SHL2 or SHL3) -when not defined(windows): - assert not compiles(parent_struct_s().s) - assert not defined(SOME_ARRAY) +assert typeof(parent_struct_s().s) is array[100, some_struct_s] +assert typeof(SOME_ARRAY) is array[100, some_struct_s] assert A0 is object testFields(A0, "f1!cint")