node: support die()
This commit is contained in:
parent
daf5000404
commit
334db21fd6
27
node.go
27
node.go
@ -850,6 +850,33 @@ func (this *conversionState) convertNoFreeFloating(n_ node.Node) (string, error)
|
|||||||
|
|
||||||
return this.convert(expr.NewFunctionCall(transparentNameNode, n.ArgumentList))
|
return this.convert(expr.NewFunctionCall(transparentNameNode, n.ArgumentList))
|
||||||
|
|
||||||
|
case *expr.Exit:
|
||||||
|
// die(0) - set process exit code and exit
|
||||||
|
// die("message") - print to stdout and exit 0
|
||||||
|
// die - exit 0
|
||||||
|
|
||||||
|
this.importPackages["os"] = struct{}{}
|
||||||
|
|
||||||
|
if n.Expr == nil {
|
||||||
|
return "os.Exit(0)", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
child, err := this.convert(n.Expr)
|
||||||
|
if err != nil {
|
||||||
|
return "", parseErr{n, err}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Although it might have been a more complex string expression - we
|
||||||
|
// don't currently know that
|
||||||
|
// TODO type inference
|
||||||
|
switch n.Expr.(type) {
|
||||||
|
case *scalar.String:
|
||||||
|
this.importPackages["fmt"] = struct{}{}
|
||||||
|
return "fmt.Print(" + child + ")\nos.Exit(0)", nil // hopefully die() was standalone, and not "or die"
|
||||||
|
default:
|
||||||
|
return "os.Exit(" + child + ")", nil
|
||||||
|
}
|
||||||
|
|
||||||
case *expr.PreInc:
|
case *expr.PreInc:
|
||||||
// """In Go, i++ is a statement, not an expression. So you can't use its value in another expression such as a function call."""
|
// """In Go, i++ is a statement, not an expression. So you can't use its value in another expression such as a function call."""
|
||||||
v, err := this.convert(n.Variable)
|
v, err := this.convert(n.Variable)
|
||||||
|
Loading…
Reference in New Issue
Block a user