diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2018-03-24 19:56:24 +0200 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2018-03-24 19:59:37 +0200 |
| commit | 02ededcd1b5f420847cf3be8322b4efaaf769e41 (patch) | |
| tree | 5acf90eec458edb1f1c6a017f70bac3ccc286fef | |
| parent | b16ac04c11c9301cd535587a0b54c7a6827d1562 (diff) | |
| download | nimpb-02ededcd1b5f420847cf3be8322b4efaaf769e41.tar.gz nimpb-02ededcd1b5f420847cf3be8322b4efaaf769e41.zip | |
Simplify
| -rw-r--r-- | src/protobuf/gen.nim | 118 |
1 files changed, 52 insertions, 66 deletions
diff --git a/src/protobuf/gen.nim b/src/protobuf/gen.nim index 5d9e1b5..06805b6 100644 --- a/src/protobuf/gen.nim +++ b/src/protobuf/gen.nim @@ -178,84 +178,70 @@ proc generateNewMessageProc(desc: NimNode): NimNode = @[ident(getMessageName(desc))], body) -proc generateClearFieldProc(desc, field: NimNode): NimNode = - let body = nnkStmtList.newTree() - - let messageName = getMessageName(desc) - let fieldName = getFieldName(field) +proc fieldProcName(prefix: string, field: NimNode): string = + result = prefix & capitalizeAscii(getFieldName(field)) - add(body, fieldInitializer("message", field)) +proc fieldProcIdent(prefix: string, field: NimNode): NimNode = + result = postfix(ident(fieldProcName(prefix, field)), "*") - add(body, nnkCall.newTree( - ident("excl"), - nnkDotExpr.newTree( - ident("message"), - ident("hasField") - ), - newLit(getFieldNumber(field)) - )) +proc generateClearFieldProc(desc, field: NimNode): NimNode = + let + messageId = ident("message") + fname = newDotExpr(messageId, ident(getFieldName(field))) + defvalue = defaultValue(field) + hasField = newDotExpr(messageId, ident("hasField")) + number = getFieldNumber(field) + procName = fieldProcIdent("clear", field) + mtype = ident(getMessageName(desc)) - result = newProc(postfix(ident("clear" & capitalizeAscii(fieldName)), "*"), - @[newEmptyNode(), newIdentDefs(ident("message"), ident(messageName))], - body) + result = quote do: + proc `procName`(`messageId`: `mtype`) = + `fname` = `defvalue` + excl(`hasfield`, `number`) proc generateHasFieldProc(desc, field: NimNode): NimNode = - let body = nnkCall.newTree( - ident("contains"), - newDotExpr(ident("message"), ident("hasField")), - newLit(getFieldNumber(field)) - ) - - let messageName = getMessageName(desc) - let fieldName = getFieldName(field) + let + messageId = ident("message") + hasField = newDotExpr(messageId, ident("hasField")) + number = getFieldNumber(field) + mtype = ident(getMessageName(desc)) + procName = fieldProcIdent("has", field) - result = newProc(postfix(ident("has" & capitalizeAscii(fieldName)), "*"), - @[ident("bool"), newIdentDefs(ident("message"), ident(messageName))], - body) + result = quote do: + proc `procName`(`messageId`: `mtype`): bool = + contains(`hasfield`, `number`) proc generateSetFieldProc(desc, field: NimNode): NimNode = - # let body = nnkStmtList.newTree(nnkDiscardStmt.newTree(newEmptyNode())) - - let body = newStmtList() - - let messageName = getMessageName(desc) - let fieldName = getFieldName(field) - - add(body, newAssignment(newDotExpr(ident("message"), ident(fieldName)), ident("value"))) - - add(body, newCall("incl", newDotExpr(ident("message"), ident("hasField")), - newLit(getFieldNumber(field)))) - - let ftype = getFullFieldType(field) + let + messageId = ident("message") + hasField = newDotExpr(messageId, ident("hasField")) + number = getFieldNumber(field) + valueId = ident("value") + fname = newDotExpr(messageId, ident(getFieldName(field))) + procName = fieldProcIdent("set", field) + mtype = ident(getMessageName(desc)) + ftype = getFullFieldType(field) - result = newProc(postfix(ident("set" & capitalizeAscii(fieldName)), "*"), - @[newEmptyNode(), newIdentDefs(ident("message"), - ident(messageName)), - newIdentDefs(ident("value"), ftype)], - body) + result = quote do: + proc `procName`(`messageId`: `mtype`, `valueId`: `ftype`) = + `fname` = `valueId` + incl(`hasfield`, `number`) proc generateAddToFieldProc(desc, field: NimNode): NimNode = - let body = newStmtList() - - let messageName = getMessageName(desc) - let fieldName = getFieldName(field) - - add(body, newCall( - ident("add"), - newDotExpr(ident("message"), ident(fieldName)), - ident("value") - )) - - add(body, newCall("incl", newDotExpr(ident("message"), ident("hasField")), - newLit(getFieldNumber(field)))) - - let ftype = ident(getFieldTypeAsString(field)) + let + procName = fieldProcIdent("add", field) + messageId = ident("message") + mtype = ident(getMessageName(desc)) + valueId = ident("value") + ftype = ident(getFieldTypeAsString(field)) + hasField = newDotExpr(messageId, ident("hasField")) + number = getFieldNumber(field) + fname = newDotExpr(messageId, ident(getFieldName(field))) - result = newProc(postfix(ident("add" & capitalizeAscii(fieldName)), "*"), - @[newEmptyNode(), newIdentDefs(ident("message"), - ident(messageName)), - newIdentDefs(ident("value"), ftype)], - body) + result = quote do: + proc `procName`(`messageId`: `mtype`, `valueId`: `ftype`) = + add(`fname`, `valueId`) + incl(`hasfield`, `number`) proc ident(wt: WireType): NimNode = result = newDotExpr(ident("WireType"), ident($wt)) |
