From ee8163a2076dbd22a33325e52c5c540adcaae764 Mon Sep 17 00:00:00 2001 From: noiryuh Date: Wed, 10 Aug 2022 04:20:20 +0700 Subject: [PATCH 01/13] clean code and make ref object use opaque --- src/genny/languages/zig.nim | 250 ++++++++---------------------------- 1 file changed, 54 insertions(+), 196 deletions(-) diff --git a/src/genny/languages/zig.nim b/src/genny/languages/zig.nim index 48402ae..c8bcf9c 100644 --- a/src/genny/languages/zig.nim +++ b/src/genny/languages/zig.nim @@ -3,11 +3,6 @@ import ../common, macros, strformat, strutils var code {.compiletime.}: string -const operators = ["add", "sub", "mul", "div"] - -proc unCapitalize(s: string): string = - s[0].toLowerAscii() & s[1 .. ^1] - proc exportTypeZig(sym: NimNode): string = if sym.kind == nnkBracketExpr: if sym[0].repr == "array": @@ -20,30 +15,33 @@ proc exportTypeZig(sym: NimNode): string = else: error(&"Unexpected bracket expression {sym[0].repr}[") else: - result = - case sym.repr: - of "string": "[:0]const u8" - of "bool": "bool" - of "int8": "i8" - of "byte": "u8" - of "int16": "i16" - of "int32": "i32" - of "int64": "i63" - of "int": "isize" - of "uint8": "u8" - of "uint16": "u16" - of "uint32": "u32" - of "uint64": "u64" - of "uint": "usize" - of "float32": "f32" - of "float64": "f64" - of "float": "f64" - of "Rune": "i32" - of "Vec2": "Vector2" - of "Mat3": "Matrix3" - of "", "nil": "void" + if sym.typeKind == ntyRef: + result = &"*{sym.repr}" else: - sym.repr + result = + case sym.repr: + of "string": "[:0]const u8" + of "bool": "bool" + of "int8": "i8" + of "byte": "u8" + of "int16": "i16" + of "int32": "i32" + of "int64": "i63" + of "int": "isize" + of "uint8": "u8" + of "uint16": "u16" + of "uint32": "u32" + of "uint64": "u64" + of "uint": "usize" + of "float32": "f32" + of "float64": "f64" + of "float": "f64" + of "Rune": "u21" + of "Vec2": "Vector2" + of "Mat3": "Matrix3" + of "", "nil": "void" + else: + sym.repr proc convertExportFromZig*(inner: string, sym: string): string = if sym == "string": @@ -61,12 +59,12 @@ proc toArgTypes(args: openarray[NimNode]): seq[string] = for arg in args: result.add exportTypeZig(arg) +proc toArgSeq(args: seq[NimNode]): seq[(string, string)] = + for i, arg in args[0 .. ^1]: + result.add (arg[0].repr, arg[1].exportTypeZig()) + proc dllProc*(procName: string, args: openarray[string], resType: string) = - var argTypes = join(args, ", ") - argTypes.removeSuffix ", " - code.add &"{procName}.argtypes = [{argTypes}]\n" - code.add &"{procName}.restype = {resType}\n" - code.add "\n" + discard proc exportConstZig*(sym: NimNode) = code.add &"pub const {toSnakeCase(sym.repr)} = {sym.getImpl()[2].repr};\n\n" @@ -74,13 +72,8 @@ proc exportConstZig*(sym: NimNode) = proc exportEnumZig*(sym: NimNode) = code.add &"pub const {sym.repr} = enum(u8) " & "{\n" for i, entry in sym.getImpl()[2][1 .. ^1]: - code.add &" {toCapSnakeCase(entry.repr).toLowerAscii()} = {i},\n" - code.removeSuffix "\n" - code.add "\n};\n\n" - -proc toArgSeq(args: seq[NimNode]): seq[(string, string)] = - for i, arg in args[0 .. ^1]: - result.add (arg[0].repr, arg[1].exportTypeZig) + code.add &" {toCapSnakeCase(entry.repr).toLowerAscii()} = {i},\n" + code.add "};\n\n" proc exportProc( procName: string, @@ -102,26 +95,23 @@ proc exportProc( if indent: code.add " " - code.add &"extern \"$lib\" fn {apiProcName}(" + code.add &"extern fn {apiProcName}(" for i, param in procParams: if onClass and i == 0: code.add "self" - code.add ": " - code.add owner else: code.add toSnakeCase(param[0]) - code.add ": " - code.add param[1].replace("[:0]const", "[*:0]const") + code.add ": " + code.add param[1].replace("[:0]", "[*:0]") code.add &", " code.removeSuffix ", " - code.add ") callconv(.C)" + code.add ") callconv(.C) " if procReturn != "": - code.add procReturn; + code.add procReturn.replace("[:0]", "[*:0]"); else: code.add "void" code.add ";\n" - if comments != "": for line in comments.split("\n"): var line = line @@ -137,12 +127,10 @@ proc exportProc( for i, param in procParams[0 .. ^1]: if onClass and i == 0: code.add "self" - code.add ": " - code.add owner else: code.add toSnakeCase(param[0]) - code.add ": " - code.add param[1] + code.add ": " + code.add param[1] code.add &", " code.removeSuffix ", " code.add ") " @@ -155,9 +143,7 @@ proc exportProc( if indent: code.add " " - code.add &" " - if procReturn != "": - code.add "return " + code.add " return " var call = "" call.add apiProcName @@ -192,7 +178,7 @@ proc exportProcZig*( procNameSnaked = toSnakeCase(procName) procType = sym.getTypeInst() procParams = procType[0][1 .. ^1].toArgSeq() - procReturn = procType[0][0].exportTypeZig + procReturn = procType[0][0].exportTypeZig() procRaises = sym.raises() comments = if sym.getImpl()[6][0].kind == nnkCommentStmt: @@ -227,6 +213,10 @@ proc exportProcZig*( comments ) +proc exportCloseObjectZig*() = + code.removeSuffix "\n" + code.add "};\n\n" + proc exportObjectZig*(sym: NimNode, constructor: NimNode) = let objName = sym.repr @@ -242,93 +232,16 @@ proc exportObjectZig*(sym: NimNode, constructor: NimNode) = if constructor != nil: exportProcZig(constructor, indent = true, rename = "init") - else: - code.add &" pub inline fn init(" - for identDefs in sym.getImpl()[2][2]: - for property in identDefs[0 .. ^3]: - code.add toSnakeCase(property[1].repr) - code.add ": " - code.add exportTypeZig(identDefs[^2]) - code.add ", " - code.removeSuffix ", " - code.add ") " - code.add objName - code.add " {\n" - code.add &" var self: {objName} = undefined;\n" - for identDefs in sym.getImpl()[2][2]: - for property in identDefs[0 .. ^3]: - code.add &" self." - code.add toSnakeCase(property[1].repr) - code.add " = " - code.add toSnakeCase(property[1].repr) - code.add ";\n" - code.add " return self;\n" - code.add " }\n\n" - - -proc exportCloseObjectZig*() = - code.add "};\n\n" proc genRefObject(objName: string) = - code.add &"pub const {objName} = extern struct " & "{\n\n" - - code.add " reference: u64,\n" - - # code.add " def __bool__(self):\n" - # code.add " return self.ref != None\n" - # code.add "\n" - - # code.add " def __eq__(self, obj):\n" - # code.add " return self.ref == obj.ref\n" - # code.add "\n" + code.add &"pub const {objName} = opaque " & "{\n" let unrefLibProc = &"$lib_{toSnakeCase(objName)}_unref" - code.add &" extern fn {unrefLibProc}(self: {objName}) callconv(.C) void;\n" - code.add &" pub inline fn deinit(self: {objName}) void " & "{\n" - code.add &" {unrefLibProc}(self);\n" + code.add &" extern fn {unrefLibProc}(self: *{objName}) callconv(.C) void;\n" + code.add &" pub inline fn deinit(self: *{objName}) void " & "{\n" + code.add &" return {unrefLibProc}(self);\n" code.add " }\n\n" -proc genSeqProcs(objName, procPrefix, selfSuffix: string, entryType: NimNode) = - discard - # var baseIndent = " " - # if selfSuffix != "": # This is a bound seq - # baseIndent = " " - - # code.add &"{baseIndent}def __len__(self):\n" - # code.add &"{baseIndent} return dll.{procPrefix}_len(self{selfSuffix})\n" - # code.add "\n" - - # code.add &"{baseIndent}def __getitem__(self, index):\n" - # code.add &"{baseIndent} return dll.{procPrefix}_get(self{selfSuffix}, index){convertImportToZig(entryType)}\n" - # code.add "\n" - - # code.add &"{baseIndent}def __setitem__(self, index, value):\n" - # code.add &"{baseIndent} dll.{procPrefix}_set(self{selfSuffix}, index, value{convertExportFromZig(entryType)})\n" - # code.add "\n" - - # code.add &"{baseIndent}def __delitem__(self, index):\n" - # code.add &"{baseIndent} dll.{procPrefix}_delete(self{selfSuffix}, index)\n" - # code.add "\n" - - # code.add &"{baseIndent}def append(self, value):\n" - # code.add &"{baseIndent} dll.{procPrefix}_add(self{selfSuffix}, value)\n" - # code.add "\n" - - # code.add &"{baseIndent}def clear(self):\n" - # code.add &"{baseIndent} dll.{procPrefix}_clear(self{selfSuffix})\n" - # code.add "\n" - - # code.add &"{baseIndent}def __iter__(self):\n" - # code.add &"{baseIndent} return SeqIterator(self)\n" - # code.add "\n" - - # dllProc(&"dll.{procPrefix}_len", [objName], "c_longlong") - # dllProc(&"dll.{procPrefix}_get", [objName, "c_longlong"], exportTypeZig(entryType)) - # dllProc(&"dll.{procPrefix}_set", [objName, "c_longlong", exportTypeZig(entryType)], "None") - # dllProc(&"dll.{procPrefix}_delete", [objName, "c_longlong"], "None") - # dllProc(&"dll.{procPrefix}_add", [objName, exportTypeZig(entryType)], "None") - # dllProc(&"dll.{procPrefix}_clear", [objName], "None") - proc exportRefObjectZig*( sym: NimNode, fields: seq[(string, NimNode)], @@ -352,7 +265,7 @@ proc exportRefObjectZig*( exportProc( "get" & fieldName.capitalizeAscii(), &"$lib_{objNameSnaked}_get_{fieldNameSnaked}", - @[("self", objName)], + @[("self", &"*{objName}")], fieldType.exportTypeZig(), indent = true ) @@ -360,52 +273,12 @@ proc exportRefObjectZig*( exportProc( "set" & fieldName.capitalizeAscii(), &"$lib_{objNameSnaked}_set_{fieldNameSnaked}", - @[("self", objName), ("value", fieldType.exportTypeZig())], + @[("self", &"*{objName}"), ("value", fieldType.exportTypeZig())], indent = true ) - # code.add " @property\n" - # code.add &" def {fieldNameSnaked}(self):\n" - # code.add " " - # code.add &"return {getProcName}(self){convertImportToZig(fieldType)}\n" - - # let setProcName = &"dll.$lib_{objNameSnaked}_set_{fieldNameSnaked}" - - # code.add "\n" - # code.add &" @{fieldNameSnaked}.setter\n" - # code.add &" def {fieldNameSnaked}(self, {fieldNameSnaked}):\n" - # code.add " " - # code.add &"{setProcName}(self, " - # code.add &"{fieldNameSnaked}{convertExportFromZig(fieldType)}" - # code.add ")\n" - # code.add "\n" - - # dllProc(getProcName, toArgTypes([sym]), exportTypeZig(fieldType)) - # dllProc(setProcName, toArgTypes([sym, fieldType]), exportTypeZig(nil)) - - else: - discard - # var helperName = fieldName - # helperName[0] = toUpperAscii(helperName[0]) - # let helperClassName = objName & helperName - - # code.add &" class {helperClassName}:\n" - # code.add "\n" - # code.add &" def __init__(self, {toSnakeCase(objName)}):\n" - # code.add &" self.{toSnakeCase(objName)} = {toSnakeCase(objName)}\n" - # code.add "\n" - - # genSeqProcs( - # objName, - # &"$lib_{objNameSnaked}_{fieldNameSnaked}", - # &".{toSnakeCase(objName)}", - # fieldType[1] - # ) - - # code.add " @property\n" - # code.add &" def {toSnakeCase(helperName)}(self):\n" - # code.add &" return self.{helperClassName}(self)\n" - # code.add "\n" +proc genSeqProcs(objName, procPrefix, selfSuffix: string, entryType: NimNode) = + discard proc exportSeqZig*(sym: NimNode) = let @@ -414,21 +287,6 @@ proc exportSeqZig*(sym: NimNode) = genRefObject(seqName) - # let newSeqProc = &"dll.$lib_new_{toSnakeCase(seqName)}" - - # code.add " def __init__(self):\n" - # code.add &" self.ref = {newSeqProc}()\n" - # code.add "\n" - - # dllProc(newSeqProc, [], "c_ulonglong") - - # genSeqProcs( - # sym.getName(), - # &"$lib_{seqNameSnaked}", - # "", - # sym[1] - # ) - const header = """ const std = @import("std"); From 3aae708f074690ed68da3ee73df4e652615f1c87 Mon Sep 17 00:00:00 2001 From: noiryuh Date: Wed, 10 Aug 2022 12:31:37 +0700 Subject: [PATCH 02/13] nil is also a ref object --- src/genny/languages/zig.nim | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/genny/languages/zig.nim b/src/genny/languages/zig.nim index c8bcf9c..ca66061 100644 --- a/src/genny/languages/zig.nim +++ b/src/genny/languages/zig.nim @@ -15,7 +15,7 @@ proc exportTypeZig(sym: NimNode): string = else: error(&"Unexpected bracket expression {sym[0].repr}[") else: - if sym.typeKind == ntyRef: + if sym.typeKind == ntyRef and sym.repr != "nil": result = &"*{sym.repr}" else: result = @@ -55,10 +55,6 @@ proc convertImportToZig*(inner: string, sym: string): string = else: inner -proc toArgTypes(args: openarray[NimNode]): seq[string] = - for arg in args: - result.add exportTypeZig(arg) - proc toArgSeq(args: seq[NimNode]): seq[(string, string)] = for i, arg in args[0 .. ^1]: result.add (arg[0].repr, arg[1].exportTypeZig()) @@ -190,6 +186,8 @@ proc exportProcZig*( else: "" + echo owner.repr + var apiProcName = "" apiProcName.add "$lib_" if owner != nil: From 2ea84d09864cf3ab3f43eb01833ce61ba761812c Mon Sep 17 00:00:00 2001 From: noiryuh Date: Wed, 10 Aug 2022 14:34:53 +0700 Subject: [PATCH 03/13] support seq[T] generating --- src/genny/languages/zig.nim | 63 ++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/src/genny/languages/zig.nim b/src/genny/languages/zig.nim index ca66061..6df8259 100644 --- a/src/genny/languages/zig.nim +++ b/src/genny/languages/zig.nim @@ -11,7 +11,7 @@ proc exportTypeZig(sym: NimNode): string = entryType = exportTypeZig(sym[2]) result = &"[{entryCount}]{entryType}" elif sym[0].repr == "seq": - result = sym.getSeqName() + result = &"*{sym.getSeqName()}" else: error(&"Unexpected bracket expression {sym[0].repr}[") else: @@ -186,8 +186,6 @@ proc exportProcZig*( else: "" - echo owner.repr - var apiProcName = "" apiProcName.add "$lib_" if owner != nil: @@ -276,7 +274,49 @@ proc exportRefObjectZig*( ) proc genSeqProcs(objName, procPrefix, selfSuffix: string, entryType: NimNode) = - discard + exportProc( + "len", + &"{procPrefix}_len", + @[("self", objName)], + "isize", + indent = true + ) + + exportProc( + "get", + &"{procPrefix}_get", + @[("self", objName), ("index", "isize")], + entryType.exportTypeZig(), + indent = true + ) + + exportProc( + "set", + &"{procPrefix}_set", + @[("self", objName), ("index", "isize"), ("value", entryType.exportTypeZig())], + indent = true + ) + + exportProc( + "append", + &"{procPrefix}_add", + @[("self", objName), ("value", entryType.exportTypeZig())], + indent = true + ) + + exportProc( + "orderedRemove", + &"{procPrefix}_add", + @[("self", objName), ("index", "isize")], + indent = true + ) + + exportProc( + "clear", + &"{procPrefix}_clear", + @[("self", objName)], + indent = true + ) proc exportSeqZig*(sym: NimNode) = let @@ -285,6 +325,21 @@ proc exportSeqZig*(sym: NimNode) = genRefObject(seqName) + exportProc( + "init", + &"$lib_new_{seqNameSnaked}", + @[], + &"*{seqName}", + indent = true + ) + + genSeqProcs( + &"*{seqName}", + &"$lib_{seqNameSnaked}", + "", + sym[1] + ) + const header = """ const std = @import("std"); From 438fdcdebcf4c6d042f03cd68552ab215a895b59 Mon Sep 17 00:00:00 2001 From: noiryuh Date: Wed, 10 Aug 2022 15:37:53 +0700 Subject: [PATCH 04/13] add 'eql' function for object --- src/genny/languages/zig.nim | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/genny/languages/zig.nim b/src/genny/languages/zig.nim index 6df8259..45ef2eb 100644 --- a/src/genny/languages/zig.nim +++ b/src/genny/languages/zig.nim @@ -229,6 +229,14 @@ proc exportObjectZig*(sym: NimNode, constructor: NimNode) = if constructor != nil: exportProcZig(constructor, indent = true, rename = "init") + exportProc( + "eql", + &"$lib_{toSnakeCase(objName)}_eq", + @[("self", objName), ("other", objName)], + "bool", + indent = true + ) + proc genRefObject(objName: string) = code.add &"pub const {objName} = opaque " & "{\n" From 2d05474ea26add05cb7e5278c7eec5a2b21357d4 Mon Sep 17 00:00:00 2001 From: noiryuh Date: Wed, 10 Aug 2022 15:57:12 +0700 Subject: [PATCH 05/13] fix convertExport/convertImport not working for string --- src/genny/languages/zig.nim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/genny/languages/zig.nim b/src/genny/languages/zig.nim index 45ef2eb..84fff8c 100644 --- a/src/genny/languages/zig.nim +++ b/src/genny/languages/zig.nim @@ -44,13 +44,13 @@ proc exportTypeZig(sym: NimNode): string = sym.repr proc convertExportFromZig*(inner: string, sym: string): string = - if sym == "string": + if sym == "[:0]const u8": inner & ".ptr" else: inner proc convertImportToZig*(inner: string, sym: string): string = - if sym == "string": + if sym == "[:0]const u8": "std.mem.span(" & inner & ")" else: inner From ec5a13548bcc7b0c3d62ec6a66348998c91934e0 Mon Sep 17 00:00:00 2001 From: noiryuh Date: Wed, 10 Aug 2022 16:16:37 +0700 Subject: [PATCH 06/13] support error in Zig --- src/genny/languages/zig.nim | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/genny/languages/zig.nim b/src/genny/languages/zig.nim index 84fff8c..9fecd4f 100644 --- a/src/genny/languages/zig.nim +++ b/src/genny/languages/zig.nim @@ -82,15 +82,14 @@ proc exportProc( comments = "" ) = let onClass = owner notin ["void", ""] - let indent = - if onClass: - true - else: - indent - if indent: - code.add " " + var baseIndent = + if onClass or indent: + " " + else: + "" + code.add baseIndent code.add &"extern fn {apiProcName}(" for i, param in procParams: if onClass and i == 0: @@ -112,13 +111,10 @@ proc exportProc( for line in comments.split("\n"): var line = line line.removePrefix("##") - if indent: - code.add " " + code.add baseIndent code.add "/// " & line.strip() & "\n" - if indent: - code.add " " - + code.add baseIndent code.add &"pub inline fn {procName}(" for i, param in procParams[0 .. ^1]: if onClass and i == 0: @@ -130,6 +126,8 @@ proc exportProc( code.add &", " code.removeSuffix ", " code.add ") " + if procRaises: + code.add "!" if procReturn != "": code.add procReturn; else: @@ -137,9 +135,11 @@ proc exportProc( code.add " " code.add "{\n" - if indent: - code.add " " - code.add " return " + code.add baseIndent + if procRaises: + code.add " const result = " + else: + code.add " return " var call = "" call.add apiProcName @@ -157,8 +157,11 @@ proc exportProc( call.add &")" code.add convertImportToZig(call, procReturn) code.add ";\n" - if indent: - code.add " " + if procRaises: + code.add &"{baseIndent} if (checkError())\n" + code.add &"{baseIndent} return error.UnknownError;\n" + code.add &"{baseIndent} return result;\n" + code.add baseIndent code.add "}\n\n" proc exportProcZig*( From bb9c6eed09a84647a6f639d4bc607148a8f46ab0 Mon Sep 17 00:00:00 2001 From: noiryuh Date: Wed, 10 Aug 2022 23:57:33 +0700 Subject: [PATCH 07/13] revert "support error in Zig" This reverts commit ec5a13548bcc7b0c3d62ec6a66348998c91934e0. --- src/genny/languages/zig.nim | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/src/genny/languages/zig.nim b/src/genny/languages/zig.nim index 9fecd4f..84fff8c 100644 --- a/src/genny/languages/zig.nim +++ b/src/genny/languages/zig.nim @@ -82,14 +82,15 @@ proc exportProc( comments = "" ) = let onClass = owner notin ["void", ""] - - var baseIndent = - if onClass or indent: - " " + let indent = + if onClass: + true else: - "" + indent + + if indent: + code.add " " - code.add baseIndent code.add &"extern fn {apiProcName}(" for i, param in procParams: if onClass and i == 0: @@ -111,10 +112,13 @@ proc exportProc( for line in comments.split("\n"): var line = line line.removePrefix("##") - code.add baseIndent + if indent: + code.add " " code.add "/// " & line.strip() & "\n" - code.add baseIndent + if indent: + code.add " " + code.add &"pub inline fn {procName}(" for i, param in procParams[0 .. ^1]: if onClass and i == 0: @@ -126,8 +130,6 @@ proc exportProc( code.add &", " code.removeSuffix ", " code.add ") " - if procRaises: - code.add "!" if procReturn != "": code.add procReturn; else: @@ -135,11 +137,9 @@ proc exportProc( code.add " " code.add "{\n" - code.add baseIndent - if procRaises: - code.add " const result = " - else: - code.add " return " + if indent: + code.add " " + code.add " return " var call = "" call.add apiProcName @@ -157,11 +157,8 @@ proc exportProc( call.add &")" code.add convertImportToZig(call, procReturn) code.add ";\n" - if procRaises: - code.add &"{baseIndent} if (checkError())\n" - code.add &"{baseIndent} return error.UnknownError;\n" - code.add &"{baseIndent} return result;\n" - code.add baseIndent + if indent: + code.add " " code.add "}\n\n" proc exportProcZig*( From 90001bffad4232483da9a115fe5b9fe6f282c919 Mon Sep 17 00:00:00 2001 From: noiryuh Date: Thu, 11 Aug 2022 00:25:48 +0700 Subject: [PATCH 08/13] bring back init for object --- src/genny/languages/zig.nim | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/genny/languages/zig.nim b/src/genny/languages/zig.nim index 84fff8c..694ec7e 100644 --- a/src/genny/languages/zig.nim +++ b/src/genny/languages/zig.nim @@ -228,6 +228,27 @@ proc exportObjectZig*(sym: NimNode, constructor: NimNode) = if constructor != nil: exportProcZig(constructor, indent = true, rename = "init") + else: + code.add " pub fn init(" + for identDefs in sym.getImpl()[2][2]: + for property in identDefs[0 .. ^3]: + code.add toSnakeCase(property[1].repr) + code.add ": " + code.add exportTypeZig(identDefs[^2]) + code.add ", " + code.removeSuffix ", " + code.add ") " + code.add objName + code.add " {\n" + code.add &" return {objName}" & "{\n" + for identDefs in sym.getImpl()[2][2]: + for property in identDefs[0 .. ^3]: + code.add &" .{toSnakeCase(property[1].repr)}" + code.add " = " + code.add &"{toSnakeCase(property[1].repr)}" + code.add ",\n" + code.add " };\n" + code.add " }\n\n" exportProc( "eql", From 662c7c78ef31998447e081d8c6271e555ffbec67 Mon Sep 17 00:00:00 2001 From: noiryuh Date: Thu, 11 Aug 2022 00:53:52 +0700 Subject: [PATCH 09/13] fix typo in seq procs --- src/genny/languages/zig.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/genny/languages/zig.nim b/src/genny/languages/zig.nim index 694ec7e..a4d20bf 100644 --- a/src/genny/languages/zig.nim +++ b/src/genny/languages/zig.nim @@ -335,7 +335,7 @@ proc genSeqProcs(objName, procPrefix, selfSuffix: string, entryType: NimNode) = exportProc( "orderedRemove", - &"{procPrefix}_add", + &"{procPrefix}_delete", @[("self", objName), ("index", "isize")], indent = true ) From 30bf7009e1aff642f3a68eb16f5d6093e0a54c33 Mon Sep 17 00:00:00 2001 From: noiryuh Date: Thu, 11 Aug 2022 04:02:59 +0700 Subject: [PATCH 10/13] change style --- src/genny/languages/zig.nim | 88 ++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 46 deletions(-) diff --git a/src/genny/languages/zig.nim b/src/genny/languages/zig.nim index a4d20bf..d88bcf7 100644 --- a/src/genny/languages/zig.nim +++ b/src/genny/languages/zig.nim @@ -267,86 +267,82 @@ proc genRefObject(objName: string) = code.add &" return {unrefLibProc}(self);\n" code.add " }\n\n" -proc exportRefObjectZig*( - sym: NimNode, - fields: seq[(string, NimNode)], - constructor: NimNode -) = - discard - let - objName = sym.repr - objNameSnaked = toSnakeCase(objName) - objType = sym.getType()[1].getType() - - genRefObject(objName) - - if constructor != nil: - exportProcZig(constructor, indent = true, rename = "init") - - for (fieldName, fieldType) in fields: - let fieldNameSnaked = toSnakeCase(fieldName) - - if fieldType.kind != nnkBracketExpr: - exportProc( - "get" & fieldName.capitalizeAscii(), - &"$lib_{objNameSnaked}_get_{fieldNameSnaked}", - @[("self", &"*{objName}")], - fieldType.exportTypeZig(), - indent = true - ) - - exportProc( - "set" & fieldName.capitalizeAscii(), - &"$lib_{objNameSnaked}_set_{fieldNameSnaked}", - @[("self", &"*{objName}"), ("value", fieldType.exportTypeZig())], - indent = true - ) - proc genSeqProcs(objName, procPrefix, selfSuffix: string, entryType: NimNode) = exportProc( - "len", + &"len{selfSuffix}", &"{procPrefix}_len", @[("self", objName)], "isize", indent = true ) - exportProc( - "get", + &"get{selfSuffix}", &"{procPrefix}_get", @[("self", objName), ("index", "isize")], entryType.exportTypeZig(), indent = true ) - exportProc( - "set", + &"set{selfSuffix}", &"{procPrefix}_set", @[("self", objName), ("index", "isize"), ("value", entryType.exportTypeZig())], indent = true ) - exportProc( - "append", + &"append{selfSuffix}", &"{procPrefix}_add", @[("self", objName), ("value", entryType.exportTypeZig())], indent = true ) - exportProc( - "orderedRemove", + &"orderedRemove{selfSuffix}", &"{procPrefix}_delete", @[("self", objName), ("index", "isize")], indent = true ) - exportProc( - "clear", + &"clear{selfSuffix}", &"{procPrefix}_clear", @[("self", objName)], indent = true ) +proc exportRefObjectZig*( + sym: NimNode, + fields: seq[(string, NimNode)], + constructor: NimNode +) = + discard + let + objName = sym.repr + objNameSnaked = toSnakeCase(objName) + objType = sym.getType()[1].getType() + + genRefObject(objName) + + if constructor != nil: + exportProcZig(constructor, indent = true, rename = "init") + + for (fieldName, fieldType) in fields: + let + fieldNameSnaked = toSnakeCase(fieldName) + fieldNameCapped = capitalizeAscii(fieldName) + + if fieldType.kind != nnkBracketExpr: + exportProc( + "get" & fieldNameCapped, + &"$lib_{objNameSnaked}_get_{fieldNameSnaked}", + @[("self", &"*{objName}")], + fieldType.exportTypeZig(), + indent = true + ) + exportProc( + "set" & fieldNameCapped, + &"$lib_{objNameSnaked}_set_{fieldNameSnaked}", + @[("self", &"*{objName}"), ("value", fieldType.exportTypeZig())], + indent = true + ) + proc exportSeqZig*(sym: NimNode) = let seqName = sym.getName() From c6f2e970793ff198bd52faa179c67b725541b2aa Mon Sep 17 00:00:00 2001 From: noiryuh Date: Thu, 11 Aug 2022 04:21:50 +0700 Subject: [PATCH 11/13] add support for seq[T] field in ref object --- src/genny/languages/zig.nim | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/genny/languages/zig.nim b/src/genny/languages/zig.nim index d88bcf7..4e69479 100644 --- a/src/genny/languages/zig.nim +++ b/src/genny/languages/zig.nim @@ -342,6 +342,14 @@ proc exportRefObjectZig*( @[("self", &"*{objName}"), ("value", fieldType.exportTypeZig())], indent = true ) + else: + echo fieldNameCapped + genSeqProcs( + &"*{objName}", + &"$lib_{objNameSnaked}_{fieldNameSnaked}", + fieldNameCapped, + fieldType[1] + ) proc exportSeqZig*(sym: NimNode) = let From b91054d33934a02ca80109430fc8e4315048adab Mon Sep 17 00:00:00 2001 From: noiryuh Date: Thu, 11 Aug 2022 04:29:34 +0700 Subject: [PATCH 12/13] remove debug echo --- src/genny/languages/zig.nim | 1 - 1 file changed, 1 deletion(-) diff --git a/src/genny/languages/zig.nim b/src/genny/languages/zig.nim index 4e69479..9331268 100644 --- a/src/genny/languages/zig.nim +++ b/src/genny/languages/zig.nim @@ -343,7 +343,6 @@ proc exportRefObjectZig*( indent = true ) else: - echo fieldNameCapped genSeqProcs( &"*{objName}", &"$lib_{objNameSnaked}_{fieldNameSnaked}", From 43a62792f41ed77057fa40539ad46ef1dcb56bc4 Mon Sep 17 00:00:00 2001 From: noiryuh Date: Thu, 11 Aug 2022 14:30:45 +0700 Subject: [PATCH 13/13] use remove instead of orderedRemove --- src/genny/languages/zig.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/genny/languages/zig.nim b/src/genny/languages/zig.nim index 9331268..e37c206 100644 --- a/src/genny/languages/zig.nim +++ b/src/genny/languages/zig.nim @@ -295,7 +295,7 @@ proc genSeqProcs(objName, procPrefix, selfSuffix: string, entryType: NimNode) = indent = true ) exportProc( - &"orderedRemove{selfSuffix}", + &"remove{selfSuffix}", &"{procPrefix}_delete", @[("self", objName), ("index", "isize")], indent = true