@@ -32,11 +32,11 @@ proc genProcIdent(x: NimNode): NimNode {.compileTime.} =
32
32
#
33
33
# Setter
34
34
#
35
- macro setter *(obj: untyped ) =
35
+ macro setters *(obj: untyped ) =
36
36
## Generate setter procs from object fields
37
37
discard # todo
38
38
39
- macro setter *(excludes: untyped , obj: untyped ) =
39
+ macro setters *(excludes: untyped , obj: untyped ) =
40
40
## Optionally, you can exclude fields from generation
41
41
expectKind excludes, nnkBracket
42
42
excludeFields = excludes.mapIt($it)
@@ -54,53 +54,69 @@ macro expandSetters* =
54
54
#
55
55
# Getter
56
56
#
57
+ proc walkField(f: NimNode, id: NimNode) {.compileTime.} =
58
+ var
59
+ procName: NimNode
60
+ returnType = f[^ 2 ]
61
+ fieldName: string
62
+ for x in f[0 ..^ 3 ]:
63
+ case x.kind
64
+ of nnkIdent, nnkAccQuoted:
65
+ if excludeFields.contains($ x):
66
+ continue
67
+ fieldName = $ x
68
+ procName = genProcIdent(x)
69
+ else : discard
70
+ var body = newStmtList()
71
+ add body, newCommentStmtNode(" Getter handle to return `" & $ fieldName & " `" )
72
+ add genGetters[id.strVal],
73
+ newProc(
74
+ nnkPostfix.newTree(ident(" *" ), procName),
75
+ params = [
76
+ returnType,
77
+ nnkIdentDefs.newTree(
78
+ ident(id.strVal[0 ].toLowerAscii & id.strVal[1 ..^ 1 ]),
79
+ id,
80
+ newEmptyNode()
81
+ ),
82
+ ],
83
+ body = body
84
+ )
85
+
57
86
macro getters* (obj: untyped ) =
58
- # # Generate getter procs from object fields
59
87
let objident = obj[0 ][0 ][1 ]
60
- let objf = obj[2 ][0 ][2 ]
88
+ var objf: NimNode
89
+ if obj[2 ].kind == nnkRefTy:
90
+ objf = obj[2 ][0 ][2 ]
91
+ else :
92
+ objf = obj[2 ][2 ]
61
93
obj[0 ] = obj[0 ][0 ]
62
94
expectKind objf, nnkRecList
63
95
genGetters[objident.strVal] = newStmtList()
64
96
for f in objf:
65
- var procName: NimNode
66
- var returnType = f[^ 2 ]
67
- var fieldName: string
68
- for x in f[0 ..^ 3 ]:
69
- case x.kind
70
- of nnkIdent, nnkAccQuoted:
71
- if excludeFields.contains($ x):
72
- continue
73
- fieldName = $ x
74
- procName = genProcIdent(x)
75
- else : discard
76
- var body = newStmtList()
77
- add body, newCommentStmtNode(" Getter handle to return `" & $ fieldName & " `" )
78
- add genGetters[objident.strVal],
79
- newProc(
80
- nnkPostfix.newTree(ident(" *" ), procName),
81
- params = [
82
- returnType,
83
- nnkIdentDefs.newTree(
84
- ident(objident.strVal[0 ].toLowerAscii & objident.strVal[1 ..^ 1 ]),
85
- objident,
86
- newEmptyNode()
87
- ),
88
- ],
89
- body = body
90
- )
97
+ case f.kind
98
+ of nnkRecCase:
99
+ for ff in f[1 ..^ 1 ]:
100
+ expectKind(ff[1 ], nnkRecList)
101
+ ff[1 ][0 ].walkField(objident)
102
+ else :
103
+ f.walkField(objident)
91
104
obj
92
105
93
106
macro getters* (excludes: untyped , obj: untyped ) =
94
- # # Optionally, you can exclude fields from generation
95
107
expectKind excludes, nnkBracket
96
108
excludeFields = excludes.mapIt($ it)
97
109
echo obj[0 ].treeRepr
98
110
add obj[0 ][1 ], ident(" getters" )
99
111
obj
100
112
101
- macro expandGetters* =
102
- # # Required to inject the generated getters in your code
113
+ macro expandGetters* (identRenameCallback: static proc (x: string ): string = nil ) =
114
+ # # This is required to insert generated getters
115
+ # # Use `identRename` to rename
103
116
result = newStmtList()
104
117
for k, x in genGetters:
118
+ if identRenameCallback != nil :
119
+ for p in x:
120
+ p[0 ][1 ] = ident(identRenameCallback(p[0 ][1 ].strVal))
105
121
add result , x
106
122
clear(genGetters)
0 commit comments