aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGanesh Viswanathan <dev@genotrance.com>2020-03-17 16:34:11 -0500
committerGanesh Viswanathan <dev@genotrance.com>2020-03-17 16:34:11 -0500
commit9d2626bb5fd1603ed0f6db1757b0184d9e5b29e4 (patch)
tree36ac08e113a75acb5ddb3106cb18aa2710bb6d5e
parent1a9911fc259a5dd5ac9a6097c4d41d6e3e50169b (diff)
downloadnimterop-9d2626bb5fd1603ed0f6db1757b0184d9e5b29e4.tar.gz
nimterop-9d2626bb5fd1603ed0f6db1757b0184d9e5b29e4.zip
Initial ast2 proc support
-rw-r--r--nimterop/ast2.nim121
-rw-r--r--tests/include/tast2.h2
2 files changed, 103 insertions, 20 deletions
diff --git a/nimterop/ast2.nim b/nimterop/ast2.nim
index ca0fc51..8c2fc3f 100644
--- a/nimterop/ast2.nim
+++ b/nimterop/ast2.nim
@@ -1,4 +1,4 @@
-import macros, os, sets, strutils, tables, times
+import macros, os, sets, strformat, strutils, tables, times
import regex
@@ -19,6 +19,9 @@ proc getPtrType*(str: string): string =
else:
str
+proc parseString(nimState: NimState, str: string): PNode =
+ result = parseString(str, nimState.identCache, nimState.config)
+
proc getLit*(nimState: NimState, str: string): PNode =
# Used to convert #define literals into const and expressions
# in array sizes
@@ -43,9 +46,7 @@ proc getLit*(nimState: NimState, str: string): PNode =
result = newStrNode(nkStrLit, str[1 .. ^2])
else:
- result = parseString(
- nimState.getNimExpression(str),
- nimState.identCache, nimState.config)
+ result = nimState.parseString(nimState.getNimExpression(str))
if result.isNil:
result = newNode(nkNilLit)
@@ -93,7 +94,7 @@ proc addConst(nimState: NimState, node: TSNode) =
nimState.printDebug(constDef)
-proc newPragma(nimState: NimState, node: TSNode, pragmas: Table[string, string]): PNode =
+proc newPragma(nimState: NimState, node: TSNode, pragmas: OrderedTable[string, string]): PNode =
# Create nkPragma tree for name:value
#
# {.name1, name2: value2.}
@@ -108,7 +109,7 @@ proc newPragma(nimState: NimState, node: TSNode, pragmas: Table[string, string])
result = newNode(nkPragma)
for name, value in pragmas.pairs:
let
- (_, pinfo) = nimState.getNameInfo(node, nskUnknown)
+ (_, pinfo) = nimState.getNameInfo(node.getAtom(), nskUnknown)
pident = nimState.getIdent(name, pinfo, exported = false)
if value.len == 0:
@@ -121,7 +122,7 @@ proc newPragma(nimState: NimState, node: TSNode, pragmas: Table[string, string])
colExpr.add pvalue
result.add colExpr
-proc newPragmaExpr(nimState: NimState, node: TSNode, ident: PNode, pragmas: Table[string, string]): PNode =
+proc newPragmaExpr(nimState: NimState, node: TSNode, ident: PNode, pragmas: OrderedTable[string, string]): PNode =
# Create nkPragmaExpr tree
#
# nkPragmaExpr(
@@ -155,7 +156,7 @@ proc newTypeIdent(nimState: NimState, node: TSNode, override = "", union = false
nimState.getIdent(name, info)
prident =
if union:
- nimState.newPragmaExpr(node, ident, {"union": ""}.toTable())
+ nimState.newPragmaExpr(node, ident, {"union": ""}.toOrderedTable())
else:
ident
@@ -215,7 +216,7 @@ proc newPtrTree(nimState: NimState, count: int, typ: PNode): PNode =
proc newArrayTree(nimState: NimState, node: TSNode, typ, size: PNode): PNode =
# Create nkBracketExpr tree depending on input
let
- (_, info) = nimState.getNameInfo(node, nskType)
+ (_, info) = nimState.getNameInfo(node.getAtom(), nskType)
ident = nimState.getIdent("array", info, exported = false)
# array[size, typ]
@@ -264,7 +265,7 @@ proc newIdentDefs(nimState: NimState, name: string, node: TSNode, offset: SomeIn
start = getStartAtom(node)
# node[start] - param type
- (tname, tinfo) = nimState.getNameInfo(node[start], nskType)
+ (tname, tinfo) = nimState.getNameInfo(node[start].getAtom(), nskType)
tident = nimState.getIdent(tname, tinfo, exported = false)
if start == node.len - 1:
@@ -327,13 +328,21 @@ proc newIdentDefs(nimState: NimState, name: string, node: TSNode, offset: SomeIn
else:
result = nil
-proc newProcTree(nimState: NimState, name: string, node: TSNode, rtyp: PNode): PNode =
- # Create nkProcTy tree for specified proc type
- let
- fparam = newNode(nkFormalParams)
+proc newFormalParams(nimState: NimState, name: string, node: TSNode, rtyp: PNode): PNode =
+ # Create nkFormalParams tree for specified params and return type
+ #
+ # proc(pname: ptyp ..): rtyp
+ #
+ # nkFormalParams(
+ # rtyp,
+ # nkIdentDefs( # multiple depending on params
+ # ..
+ # )
+ # )
+ result = newNode(nkFormalParams)
# Add return type
- fparam.add rtyp
+ result.add rtyp
if not node.isNil:
for i in 0 ..< node.len:
@@ -341,7 +350,10 @@ proc newProcTree(nimState: NimState, name: string, node: TSNode, rtyp: PNode): P
let
param = nimState.newIdentDefs(name, node[i], i, exported = false)
if not param.isNil:
- fparam.add param
+ result.add param
+
+proc newProcTy(nimState: NimState, name: string, node: TSNode, rtyp: PNode): PNode =
+ # Create nkProcTy tree for specified proc type
# proc(pname: ptyp ..): rtyp
#
@@ -355,7 +367,7 @@ proc newProcTree(nimState: NimState, name: string, node: TSNode, rtyp: PNode): P
# nkEmpty()
# )
result = newNode(nkProcTy)
- result.add fparam
+ result.add nimState.newFormalParams(name, node, rtyp)
result.add newNode(nkEmpty)
proc newRecListTree(nimState: NimState, name: string, node: TSNode): PNode =
@@ -600,7 +612,7 @@ proc getTypeProc(nimState: NimState, name: string, node: TSNode): PNode =
retType = nimState.newPtrTree(tcount, retType)
# Proc with return type and params
- result = nimState.newProcTree(name, plist, retType)
+ result = nimState.newProcTy(name, plist, retType)
if ncount > 1:
result = nimState.newPtrTree(ncount-1, result)
@@ -850,9 +862,77 @@ proc addEnum(nimState: NimState, node: TSNode) =
nimState.printDebug(node)
proc addProc(nimState: NimState, node: TSNode) =
+ # Add a proc
decho("addProc()")
nimState.printDebug(node)
+ let
+ start = getStartAtom(node)
+
+ # node[start] = identifier = return type name
+ (rname, rinfo) = nimState.getNameInfo(node[start].getAtom(), nskType)
+
+ # Parameter list
+ plist = node[start+1].anyChildInTree("parameter_list")
+
+ # node[start+1] = identifier = name
+ # TODO - check blank and override
+ ident = nimState.newTypeIdent(node[start+1])
+ name = $ident[0][1]
+
+ # node[start+1] could have nested pointers
+ tcount = node[start+1].getPtrCount()
+
+ procDef = newNode(nkProcDef)
+
+ # proc X(a1: Y, a2: Z): P {.pragma.}
+ #
+ # nkProcDef(
+ # nkPostfix(
+ # nkIdent("*"),
+ # nkIdent("X")
+ # ),
+ # nkEmpty(),
+ # nkEmpty(),
+ # nkFormalParams(
+ # nkPtrTy( # optional, nested
+ # nkIdent(retType)
+ # ),
+ # nkIdentDefs(
+ # nkIdent(param),
+ # nkPtrTy(
+ # nkIdent(ptype)
+ # ),
+ # nkEmpty()
+ # ),
+ # ...
+ # ),
+ # nkPragma(...),
+ # nkEmpty(),
+ # nkEmpty()
+ # )
+
+ procDef.add ident
+ procDef.add newNode(nkEmpty)
+ procDef.add newNode(nkEmpty)
+
+ # Return type
+ var
+ retType = nimState.getIdent(rname, rinfo, exported = false)
+ if tcount > 0:
+ retType = nimState.newPtrTree(tcount, retType)
+
+ # Proc with return type and params
+ procDef.add nimState.newFormalParams(name, plist, retType)
+ procDef.add newNode(nkEmpty) # Pragmas
+ procDef.add newNode(nkEmpty)
+ procDef.add newNode(nkEmpty)
+
+ # nkProcSection.add
+ nimState.procSection.add procDef
+
+ nimState.printDebug(procDef)
+
proc processNode(nimState: NimState, node: TSNode): bool =
result = true
@@ -926,14 +1006,15 @@ import nimterop/types
""" % [$now(), getAppFilename(), commandLineParams().join(" ")]
proc printNim*(gState: State, fullpath: string, root: TSNode) =
- var
+ let
nimState = new(NimState)
- #fp = fullpath.replace("\\", "/")
+ fp = fullpath.replace("\\", "/")
nimState.identifiers = newTable[string, string]()
nimState.gState = gState
nimState.currentHeader = getCurrentHeader(fullpath)
+ nimState.impShort = nimState.currentHeader.replace("header", "imp")
nimState.sourceFile = fullpath
# Nim compiler objects
diff --git a/tests/include/tast2.h b/tests/include/tast2.h
index 90e96c6..200b4c8 100644
--- a/tests/include/tast2.h
+++ b/tests/include/tast2.h
@@ -40,3 +40,5 @@ typedef union U2 { int **f1; int abc[123+132]; } U2;
// Anonymous
//typedef struct { char a1; };
+
+struct A2 test_proc1(struct A0 a); \ No newline at end of file