Commit 032258fdce5994ce1793dd9dd307f81692cfcdb3
1 parent
f149dc12
various improvements
Showing
2 changed files
with
16 additions
and
28 deletions
src/squeaknim.nim
| ... | ... | @@ -10,12 +10,15 @@ const |
| 10 | 10 | var |
| 11 | 11 | dllName {.compileTime.}: string = "SqueakNimTest" |
| 12 | 12 | stCode {.compileTime.}: string = "" |
| 13 | + gPrefix {.compileTime.}: string = "" | |
| 13 | 14 | |
| 14 | -template setModulename*(s: string) = | |
| 15 | +template setModulename*(s, prefix: string) = | |
| 15 | 16 | ## Sets the DLL name. This is also used to set the 'category' in the generated |
| 16 | - ## classes. | |
| 17 | + ## classes. 'prefix' is added to every generated class that wraps a Nim | |
| 18 | + ## object. | |
| 17 | 19 | static: |
| 18 | 20 | dllName = s |
| 21 | + gPrefix = prefix | |
| 19 | 22 | |
| 20 | 23 | template writeExternalLibrary*() = |
| 21 | 24 | static: |
| ... | ... | @@ -37,22 +40,8 @@ template writeSmallTalkCode*(filename: string) = |
| 37 | 40 | proc mapTypeToC(symbolicType: NimNode): string {.compileTime.} = |
| 38 | 41 | let t = symbolicType.getType |
| 39 | 42 | if symbolicType.kind == nnkSym and t.typeKind == ntyObject: |
| 40 | - return $symbolicType | |
| 43 | + return gPrefix & $symbolicType | |
| 41 | 44 | case t.typeKind |
| 42 | - of ntyTuple: | |
| 43 | - result = $t | |
| 44 | - when false: | |
| 45 | - let tt = if t.kind == nnkBracketExpr: t else: t.getType | |
| 46 | - expectKind t, nnkBracketExpr | |
| 47 | - result = "struct {" | |
| 48 | - for i in 0 .. < tt.len: | |
| 49 | - result.addf "$# Field$#;\n", mapTypeToC(tt[i]), $i | |
| 50 | - result.add "}" | |
| 51 | - of ntyArray, ntyArrayConstr: | |
| 52 | - # implement this! | |
| 53 | - result = "XXX" | |
| 54 | - of ntyOpenArray: | |
| 55 | - result = mapTypeToC(t[1]) & "* " & intType | |
| 56 | 45 | of ntyPtr, ntyVar: |
| 57 | 46 | expectKind t, nnkBracketExpr |
| 58 | 47 | result = mapTypeToC(t[1]) & "*" |
| ... | ... | @@ -110,17 +99,17 @@ macro exportSt*(className: string; body: stmt): stmt = |
| 110 | 99 | apicall.add(mapTypeToC(typ)) |
| 111 | 100 | inc counter |
| 112 | 101 | apicall.add(") module: '" & dllName & "'>\n" & |
| 113 | - " ^self externalCallFailed.\n") | |
| 114 | - stCode.add(st & "\n\"Generated by NimSqueak\"\n" & apicall) | |
| 102 | + "\t^self externalCallFailed.\n") | |
| 103 | + stCode.add(st & "\n\t\"Generated by NimSqueak\"\n\t" & apicall) | |
| 115 | 104 | |
| 116 | -macro wrapObject*(name: string; typ: stmt): stmt = | |
| 105 | +macro wrapObject*(typ: stmt): stmt = | |
| 117 | 106 | ## Declares a SmallTalk wrapper class. |
| 118 | - let name = name.strVal.capitalize | |
| 119 | 107 | var t = typ.getType() |
| 120 | 108 | if t.typeKind == ntyTypeDesc: |
| 121 | 109 | expectKind t, nnkBracketExpr |
| 122 | 110 | t = t[1] |
| 123 | - | |
| 111 | + expectKind t, nnkSym | |
| 112 | + let name = gPrefix & ($t).capitalize | |
| 124 | 113 | if t.kind != nnkObjectTy: t = t.getType |
| 125 | 114 | expectKind t, nnkObjectTy |
| 126 | 115 | t = t[1] |
| ... | ... | @@ -128,7 +117,7 @@ macro wrapObject*(name: string; typ: stmt): stmt = |
| 128 | 117 | var fields = "" |
| 129 | 118 | for i in 0.. < t.len: |
| 130 | 119 | expectKind t[i], nnkSym |
| 131 | - fields.addf "($# '$#')\n", $t[i], mapTypeToC(t[i]) | |
| 120 | + fields.addf "\t($# '$#')\n", $t[i], mapTypeToC(t[i]) | |
| 132 | 121 | |
| 133 | 122 | let st = """ExternalStructure subclass: #$1 |
| 134 | 123 | instanceVariableNames: '' |
| ... | ... | @@ -142,10 +131,9 @@ $1 class |
| 142 | 131 | !$1 class methodsFor: 'field definition' stamp: 'SqueakNim'! |
| 143 | 132 | fields |
| 144 | 133 | ^#( |
| 145 | - $3 | |
| 134 | +$3 | |
| 146 | 135 | )! ! |
| 147 | 136 | |
| 148 | - $1 compileFields! | |
| 149 | 137 | $1 defineFields. |
| 150 | 138 | |
| 151 | 139 | """ % [name, dllName, fields] | ... | ... |
tests/test1.nim
| ... | ... | @@ -6,13 +6,13 @@ type |
| 6 | 6 | Vector3 = object |
| 7 | 7 | x, y, z: MyFloat |
| 8 | 8 | |
| 9 | -setModulename "urhonimo" | |
| 9 | +setModulename "urhonimo", "UR" | |
| 10 | 10 | |
| 11 | -wrapObject("Vector3", Vector3) | |
| 11 | +wrapObject(Vector3) | |
| 12 | 12 | |
| 13 | 13 | writeExternalLibrary() |
| 14 | 14 | |
| 15 | -proc foo(a, b: Vector3; c: openArray[int]): cstring {.exportSt: "bar".} = | |
| 15 | +proc foo(a, b: Vector3): cstring {.exportSt: "bar".} = | |
| 16 | 16 | result = "some string here" |
| 17 | 17 | |
| 18 | 18 | writeSmallTalkCode("test1.st") | ... | ... |