Fix string returns in godotapigen

This commit is contained in:
Ruslan Mustakov 2017-08-09 16:34:28 +07:00
commit 34753b7a27

View file

@ -93,7 +93,7 @@ proc newCommand(left, right: PNode): PNode =
result.add(left) result.add(left)
result.add(right) result.add(right)
proc newInfix(left, op, right: PNode): PNode = proc infix(left, op, right: PNode): PNode =
result = newNode(nkInfix) result = newNode(nkInfix)
result.add(op) result.add(op)
result.add(left) result.add(left)
@ -104,6 +104,11 @@ proc postfix(left: PNode, op: string): PNode =
result.add(ident(op)) result.add(ident(op))
result.add(left) result.add(left)
proc prefix(op: string, right: PNode): PNode =
result = newNode(nkPrefix)
result.add(ident(op))
result.add(right)
proc newBracketExpr(first, bracket: PNode): PNode = proc newBracketExpr(first, bracket: PNode): PNode =
newNode(nkBracketExpr).addChain(first, bracket) newNode(nkBracketExpr).addChain(first, bracket)
@ -387,10 +392,10 @@ proc doGenerateMethod(tree: PNode, methodBindRegistry: var HashSet[string],
else: args.len - 1 else: args.len - 1
if not varargsName.isNil: if not varargsName.isNil:
argLenNode = newCall("cint", argLenNode = newCall("cint",
newInfix(newIntLit(staticArgsLen), infix(newIntLit(staticArgsLen),
ident("+"), ident("+"),
newDotExpr(ident(varargsName), ident("len")))) newDotExpr(ident(varargsName), ident("len"))))
argsAlloc.add(newCall("godotAlloc", newCall("cint", newInfix( argsAlloc.add(newCall("godotAlloc", newCall("cint", infix(
newCall("sizeof", ident("Variant")), ident("*"), newCall("sizeof", ident("Variant")), ident("*"),
newNode(nkPar).addChain(argLenNode)))) newNode(nkPar).addChain(argLenNode))))
) )
@ -410,7 +415,7 @@ proc doGenerateMethod(tree: PNode, methodBindRegistry: var HashSet[string],
if arg.isVarargs: if arg.isVarargs:
argName = newNode(nkBracketExpr).addChain( argName = newNode(nkBracketExpr).addChain(
ident(varargsName), ident(varargsName),
newInfix(ident("idx"), ident("-"), newIntLit(staticArgsLen))) infix(ident("idx"), ident("-"), newIntLit(staticArgsLen)))
let argIdx = if arg.isVarargs: ident("idx") else: newIntLit(idx) let argIdx = if arg.isVarargs: ident("idx") else: newIntLit(idx)
let isStandardType = arg.typ in standardTypes let isStandardType = arg.typ in standardTypes
let isWrappedType = arg.typ in wrapperTypes let isWrappedType = arg.typ in wrapperTypes
@ -449,7 +454,7 @@ proc doGenerateMethod(tree: PNode, methodBindRegistry: var HashSet[string],
newIntLit(staticArgsLen)))) newIntLit(staticArgsLen))))
let argLoop = newNode(nkWhileStmt) let argLoop = newNode(nkWhileStmt)
argConversions.add(argLoop) argConversions.add(argLoop)
argLoop.add(newInfix(ident("idx"), ident("<"), argLenNode) argLoop.add(infix(ident("idx"), ident("<"), argLenNode)
) )
argLoop.add(newNode(nkStmtList).addChain( argLoop.add(newNode(nkStmtList).addChain(
argAsgn, argAsgn,
@ -541,7 +546,7 @@ proc doGenerateMethod(tree: PNode, methodBindRegistry: var HashSet[string],
body.add(freeCall) body.add(freeCall)
if not varargsName.isNil: if not varargsName.isNil:
let errCheck = newIfStmt( let errCheck = newIfStmt(
newInfix(newDotExpr(ident("callError"), ident("error")), ident("!="), infix(newDotExpr(ident("callError"), ident("error")), ident("!="),
newDotExpr(ident("VariantCallErrorType"), ident("OK"))), newDotExpr(ident("VariantCallErrorType"), ident("OK"))),
newNode(nkRaiseStmt).addChain( newNode(nkRaiseStmt).addChain(
newCall("newCallError", ident("callError"))) newCall("newCallError", ident("callError")))
@ -553,7 +558,7 @@ proc doGenerateMethod(tree: PNode, methodBindRegistry: var HashSet[string],
newCall("fromVariant", ident("result"), newCall("fromVariant", ident("result"),
newCall("newVariant", retValIdent)))) newCall("newVariant", retValIdent))))
let convCheck = newIfStmt( let convCheck = newIfStmt(
newInfix(ident("convErr"), ident("!="), infix(ident("convErr"), ident("!="),
newDotExpr(ident("ConversionResult"), ident("OK"))), newDotExpr(ident("ConversionResult"), ident("OK"))),
newNode(nkRaiseStmt).addChain( newNode(nkRaiseStmt).addChain(
newCall("newConversionError", ident("convErr"))) newCall("newConversionError", ident("convErr")))
@ -561,6 +566,8 @@ proc doGenerateMethod(tree: PNode, methodBindRegistry: var HashSet[string],
body.add(convErrDef) body.add(convErrDef)
body.add(convCheck) body.add(convCheck)
if isStringRet: if isStringRet:
body.add(newNode(nkAsgn).addChain(
ident("result"), prefix("$", retValIdent)))
body.add(newCall("deinit", retValIdent)) body.add(newCall("deinit", retValIdent))
elif isConversionRet: elif isConversionRet:
body.add(newNode(nkAsgn).addChain( body.add(newNode(nkAsgn).addChain(