Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 24 additions & 8 deletions src/genny/common.nim
Original file line number Diff line number Diff line change
Expand Up @@ -68,18 +68,34 @@ proc toVarCase*(s: string): string =
if i < s.len:
result.add s[i .. ^1]

proc getSeqName*(sym: NimNode): string =
if sym.kind == nnkBracketExpr:
result = &"Seq{sym[1]}"
proc getName*(sym: NimNode): string =
if sym.kind == nnkSym:
let impl = sym.getImpl()
if impl.kind == nnkProcDef and impl[5].kind != nnkEmpty:
# generic procedure instance
# for now, just add every type to the name
#
# we could only add the generic one, but that requires smart
# matching between the impl & the TypeInst
var res= sym.repr
for param in sym.getTypeInst()[0][1..^1]:
res &= capitalizeAscii(param[1].getName())
res
else:
sym.repr
elif sym.kind == nnkBracketExpr:
for gen in sym:
result &= capitalizeAscii(gen.getName())
result
else:
result = &"Seq{sym}"
result[3] = toUpperAscii(result[3])
sym.repr

proc getName*(sym: NimNode): string =
proc getSeqName*(sym: NimNode): string =
if sym.kind == nnkBracketExpr:
sym.getSeqName()
sym.getName()
else:
sym.repr
"Seq" & sym.getName()


proc raises*(procSym: NimNode): bool =
for pragma in procSym.getImpl()[4]:
Expand Down
16 changes: 8 additions & 8 deletions src/genny/internal.nim
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ proc exportProcInternal*(
prefixes: openarray[NimNode] = []
) =
let
procName = sym.repr
procName = getName(sym)
procNameSnaked = toSnakeCase(procName)
procType = sym.getTypeInst()
procParams = procType[0][1 .. ^1]
procReturn = procType[0][0]
procRaises = sym.raises()
procReturnsSeq = procReturn.kind == nnkBracketExpr
procReturnsSeq = procReturn.kind == nnkBracketExpr and procReturn[0].repr == "seq"

var apiProcName = &"$lib_"
if owner != nil:
Expand Down Expand Up @@ -51,7 +51,7 @@ proc exportProcInternal*(
internal.add " "
if procReturnsSeq:
internal.add &"{procReturn.getSeqName()}(s: "
internal.add &"{procName}("
internal.add &"{sym.repr}("
for param in procParams:
for i in 0 .. param.len - 3:
internal.add &"{toSnakeCase(param[i].repr)}"
Expand All @@ -71,7 +71,7 @@ proc exportProcInternal*(

proc exportObjectInternal*(sym: NimNode, constructor: NimNode) =
let
objName = sym.repr
objName = sym.getName()
objNameSnaked = toSnakeCase(objName)

if constructor != nil:
Expand All @@ -97,14 +97,14 @@ proc exportObjectInternal*(sym: NimNode, constructor: NimNode) =
fieldType = fieldSym.getTypeInst()
internal.add &"{toSnakeCase(fieldName)}: {exportTypeNim(fieldType)}, "
internal.removeSuffix ", "
internal.add &"): {objName} {exportProcPragmas} =\n"
internal.add &"): {sym.repr} {exportProcPragmas} =\n"
for fieldSym in objType[2]:
let
fieldName = fieldSym.repr
internal.add &" result.{toSnakeCase(fieldName)} = {toSnakeCase(fieldName)}\n"
internal.add "\n"

internal.add &"proc $lib_{objNameSnaked}_eq*(a, b: {objName}): bool {exportProcPragmas}=\n"
internal.add &"proc $lib_{objNameSnaked}_eq*(a, b: {sym.repr}): bool {exportProcPragmas}=\n"
let objType = sym.getType()
internal.add " "
for fieldSym in objType[2]:
Expand All @@ -120,11 +120,11 @@ proc exportRefObjectInternal*(
constructor: NimNode
) =
let
objName = sym.repr
objName = getName(sym)
objNameSnaked = toSnakeCase(objName)
objType = sym.getType()[1].getType()

internal.add &"proc $lib_{objNameSnaked}_unref*(x: {objName}) {exportProcPragmas}"
internal.add &"proc $lib_{objNameSnaked}_unref*(x: {repr(sym)}) {exportProcPragmas}"
internal.add " =\n"
internal.add " GC_unref(x)\n"
internal.add "\n"
Expand Down
20 changes: 11 additions & 9 deletions src/genny/languages/c.nim
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ proc exportTypeC(sym: NimNode): string =
elif sym[0].repr == "seq":
result = sym.getSeqName()
else:
error(&"Unexpected bracket expression {sym[0].repr}[")
result = sym.getName()
else:
result =
case sym.repr:
Expand Down Expand Up @@ -52,7 +52,7 @@ proc exportTypeC(sym: NimNode, name: string): string =
elif sym[0].repr == "seq":
result = sym.getSeqName() & " " & name
else:
error(&"Unexpected bracket expression {sym[0].repr}[")
result = sym.getName()
else:
result = exportTypeC(sym) & " " & name

Expand Down Expand Up @@ -90,7 +90,7 @@ proc exportProcC*(
prefixes: openarray[NimNode] = []
) =
let
procName = sym.repr
procName = sym.getName()
procNameSnaked = toSnakeCase(procName)
procType = sym.getTypeInst()
procParams = procType[0][1 .. ^1]
Expand Down Expand Up @@ -131,21 +131,23 @@ proc exportProcC*(
dllProc(&"$lib_{apiProcName}", dllParams, exportTypeC(procReturn))

proc exportObjectC*(sym: NimNode, constructor: NimNode) =
let objName = sym.repr
let
objName = sym.getName()
impl = sym.getTypeImpl()

types.add &"typedef struct {objName} " & "{\n"
for identDefs in sym.getImpl()[2][2]:
for identDefs in impl[2]:
for property in identDefs[0 .. ^3]:
types.add &" {exportTypeC(identDefs[^2], toSnakeCase(property[1].repr))};\n"
types.add &" {exportTypeC(identDefs[^2], toSnakeCase(property.repr))};\n"
types.add "} " & &"{objName};\n\n"

if constructor != nil:
exportProcC(constructor)
else:
procs.add &"{objName} $lib_{toSnakeCase(objName)}("
for identDefs in sym.getImpl()[2][2]:
for identDefs in impl[2]:
for property in identDefs[0 .. ^3]:
procs.add &"{exportTypeC(identDefs[^2], toSnakeCase(property[1].repr))}, "
procs.add &"{exportTypeC(identDefs[^2], toSnakeCase(property.repr))}, "
procs.removeSuffix ", "
procs.add ");\n\n"

Expand Down Expand Up @@ -173,7 +175,7 @@ proc exportRefObjectC*(
constructor: NimNode
) =
let
objName = sym.repr
objName = sym.getName()
objNameSnaked = toSnakeCase(objName)
objType = sym.getType()[1].getType()

Expand Down
32 changes: 17 additions & 15 deletions src/genny/languages/nim.nim
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ var

proc exportTypeNim*(sym: NimNode): string =
if sym.kind == nnkBracketExpr:
if sym[0].repr != "seq":
error(&"Unexpected bracket expression {sym[0].repr}[", sym)
result = sym.getSeqName()
if sym[0].repr == "seq":
result = sym.getSeqName()
else:
result = sym.repr
else:
if sym.repr == "string":
result = "cstring"
Expand All @@ -28,9 +29,8 @@ proc convertExportFromNim*(sym: NimNode): string =

proc convertImportToNim*(sym: NimNode): string =
if sym.kind == nnkBracketExpr:
if sym[0].repr != "seq":
error(&"Unexpected bracket expression {sym[0].repr}[", sym)
result = ".s"
if sym[0].repr == "seq":
result = ".s"
else:
if sym.repr == "string":
result = ".`$`"
Expand All @@ -55,7 +55,7 @@ proc exportProcNim*(
prefixes: openarray[NimNode] = []
) =
let
procName = sym.repr
procName = sym.getName()
procNameSnaked = toSnakeCase(procName)
procType = sym.getTypeInst()
procParams = procType[0][1 .. ^1]
Expand Down Expand Up @@ -92,7 +92,7 @@ proc exportProcNim*(
procs.add "\n"
procs.add "\n"

procs.add &"proc {procName}*("
procs.add &"proc {sym.repr}*("
for i, param in procParams:
var paramType = param[1]
if paramType.repr.endsWith(":type"):
Expand Down Expand Up @@ -125,13 +125,15 @@ proc exportProcNim*(
procs.add "\n"

proc exportObjectNim*(sym: NimNode, constructor: NimNode) =
let objName = sym.repr
let
objName = sym.getName()
impl = sym.getTypeImpl()

if objName in ["Vector2", "Matrix3", "Rect", "Color"]:
return

types.add &"type {objName}* = object\n"
for identDefs in sym.getImpl()[2][2]:
for identDefs in impl[2]:
for property in identDefs[0 .. ^3]:
types.add &" {property.repr}: {identDefs[^2].repr}\n"
types.add "\n"
Expand All @@ -140,15 +142,15 @@ proc exportObjectNim*(sym: NimNode, constructor: NimNode) =
exportProcNim(constructor)
else:
types.add &"proc {toVarCase(objName)}*("
for identDefs in sym.getImpl()[2][2]:
for identDefs in impl[2]:
for property in identDefs[0 .. ^3]:
types.add &"{toSnakeCase(property[1].repr)}: {identDefs[^2].repr}, "
types.add &"{toSnakeCase(property.repr)}: {identDefs[^2].repr}, "
types.removeSuffix ", "
types.add &"): {objName} =\n"
for identDefs in sym.getImpl()[2][2]:
for identDefs in impl[2]:
for property in identDefs[0 .. ^3]:
types.add &" result.{toSnakeCase(property[1].repr)} = "
types.add &"{toSnakeCase(property[1].repr)}\n"
types.add &" result.{toSnakeCase(property.repr)} = "
types.add &"{toSnakeCase(property.repr)}\n"
types.add "\n"

proc genRefObject(objName: string) =
Expand Down
30 changes: 16 additions & 14 deletions src/genny/languages/node.nim
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ proc exportTypeNode(sym: NimNode): string =
elif sym[0].repr == "seq":
result = sym.getSeqName()
else:
error(&"Unexpected bracket expression {sym[0].repr}[")
result = sym.getName()
else:
result =
case sym.repr:
Expand Down Expand Up @@ -43,7 +43,7 @@ proc exportTypeNode(sym: NimNode): string =

of "": "'void'"
else:
sym.repr
sym.getName()

proc convertExportFromNode*(sym: NimNode): string =
discard
Expand Down Expand Up @@ -79,7 +79,7 @@ proc exportProcNode*(
prefixes: openarray[NimNode] = []
) =
let
procName = sym.repr
procName = sym.getName()
procNameSnaked = toSnakeCase(procName)
procType = sym.getTypeInst()
procParams = procType[0][1 .. ^1]
Expand Down Expand Up @@ -181,13 +181,15 @@ proc exportProcNode*(
dllProc(apiProcName, procParams, exportTypeNode(procReturn))

proc exportObjectNode*(sym: NimNode, constructor: NimNode) =
let objName = sym.repr
let
objName = sym.getName()
impl = sym.getTypeImpl()

exports.add &"exports.{objName} = {objName};\n"
types.add &"const {objName} = Struct(" & "{\n"
for identDefs in sym.getImpl()[2][2]:
for identDefs in impl[2]:
for property in identDefs[0 .. ^3]:
types.add &" '{property[1].repr}':"
types.add &" '{property.repr}':"
types.add &"{exportTypeNode(identDefs[^2])},\n"
types.removeSuffix ",\n"
types.add "\n})\n"
Expand Down Expand Up @@ -217,25 +219,25 @@ proc exportObjectNode*(sym: NimNode, constructor: NimNode) =
else:
exports.add &"exports.{toVarCase(objName)} = {toVarCase(objName)};\n"
types.add &"{toVarCase(objName)} = function("
for identDefs in sym.getImpl()[2][2]:
for identDefs in impl[2]:
for property in identDefs[0 .. ^3]:
types.add &"{toSnakeCase(property[1].repr)}, "
types.add &"{toSnakeCase(property.repr)}, "
types.removeSuffix ", "
types.add "){\n"
types.add &" var v = new {objName}();\n"
for identDefs in sym.getImpl()[2][2]:
for identDefs in impl[2]:
for property in identDefs[0 .. ^3]:
types.add " "
types.add &"v.{toSnakeCase(property[1].repr)} = "
types.add &"{toSnakeCase(property[1].repr)}\n"
types.add &"v.{toSnakeCase(property.repr)} = "
types.add &"{toSnakeCase(property.repr)}\n"
types.add " return v;\n"
types.add "}\n"

types.add &"{objName}.prototype.isEqual = function(other){{\n"
types.add &" return "
for identDefs in sym.getImpl()[2][2]:
for identDefs in impl[2]:
for property in identDefs[0 .. ^3]:
types.add &"self.{property[1].repr} == other.{property[1].repr} && "
types.add &"self.{property.repr} == other.{property.repr} && "
types.removeSuffix " && "
types.add ";\n"
types.add "};\n"
Expand Down Expand Up @@ -298,7 +300,7 @@ proc exportRefObjectNode*(
constructor: NimNode
) =
let
objName = sym.repr
objName = sym.getName()
objNameSnaked = toSnakeCase(objName)
objType = sym.getType()[1].getType()

Expand Down
Loading