本文整理汇总了Golang中github.com/TheJumpCloud/rsc/cc.Expr.XDecl方法的典型用法代码示例。如果您正苦于以下问题:Golang Expr.XDecl方法的具体用法?Golang Expr.XDecl怎么用?Golang Expr.XDecl使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类github.com/TheJumpCloud/rsc/cc.Expr
的用法示例。
在下文中一共展示了Expr.XDecl方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: doSideEffects
func doSideEffects(x *cc.Expr, before, after *[]*cc.Stmt, mode int) {
if x == nil {
return
}
// Cannot hoist side effects from conditionally evaluated expressions
// into unconditionally evaluated statement lists.
// For now, detect but do not handle.
switch x.Op {
case cc.Cond:
doSideEffects(x.List[0], before, after, mode&^sideStmt|sideNoAfter)
checkNoSideEffects(x.List[1], 0)
checkNoSideEffects(x.List[2], 0)
case cc.AndAnd, cc.OrOr:
doSideEffects(x.Left, before, after, mode&^sideStmt|sideNoAfter)
checkNoSideEffects(x.Right, 0)
case cc.Comma:
var leftover []*cc.Expr
for i, y := range x.List {
m := mode | sideNoAfter
if i+1 < len(x.List) {
m |= sideStmt
}
doSideEffects(y, before, after, m)
switch y.Op {
case cc.PostInc, cc.PostDec, cc.Eq, cc.AddEq, cc.SubEq, cc.MulEq, cc.DivEq, cc.ModEq, cc.XorEq, cc.OrEq, cc.AndEq, cc.LshEq, cc.RshEq:
*before = append(*before, &cc.Stmt{Op: cc.StmtExpr, Expr: y})
default:
leftover = append(leftover, y)
}
}
x.List = leftover
default:
doSideEffects(x.Left, before, after, mode&^sideStmt)
doSideEffects(x.Right, before, after, mode&^sideStmt)
for _, y := range x.List {
doSideEffects(y, before, after, mode&^sideStmt)
}
}
if mode&sideStmt != 0 {
// Expression as statement.
// Can leave x++ alone, can rewrite ++x to x++, can leave x [op]= y alone.
switch x.Op {
case cc.PreInc:
x.Op = cc.PostInc
return
case cc.PreDec:
x.Op = cc.PostDec
return
case cc.PostInc, cc.PostDec:
return
case cc.Eq, cc.AddEq, cc.SubEq, cc.MulEq, cc.DivEq, cc.ModEq, cc.XorEq, cc.OrEq, cc.AndEq, cc.LshEq, cc.RshEq:
return
case cc.Call:
return
}
}
switch x.Op {
case cc.Eq, cc.AddEq, cc.SubEq, cc.MulEq, cc.DivEq, cc.ModEq, cc.XorEq, cc.OrEq, cc.AndEq, cc.LshEq, cc.RshEq:
x.Left = forceCheap(before, x.Left)
old := copyExpr(x)
*before = append(*before, &cc.Stmt{Op: cc.StmtExpr, Expr: old})
fixMerge(x, x.Left)
case cc.PreInc, cc.PreDec:
x.Left = forceCheap(before, x.Left)
old := copyExpr(x)
old.SyntaxInfo = cc.SyntaxInfo{}
if old.Op == cc.PreInc {
old.Op = cc.PostInc
} else {
old.Op = cc.PostDec
}
*before = append(*before, &cc.Stmt{Op: cc.StmtExpr, Expr: old})
fixMerge(x, x.Left)
case cc.PostInc, cc.PostDec:
x.Left = forceCheap(before, x.Left)
if mode&sideNoAfter != 0 {
// Not allowed to generate fixups afterward.
d := &cc.Decl{
Name: fmt.Sprintf("tmp%d", <-tmpGen),
Type: x.Left.XType,
}
eq := &cc.Expr{
Op: c2go.ColonEq,
Left: &cc.Expr{Op: cc.Name, Text: d.Name, XDecl: d},
Right: x.Left,
}
old := copyExpr(x.Left)
old.SyntaxInfo = cc.SyntaxInfo{}
*before = append(*before,
&cc.Stmt{Op: cc.StmtExpr, Expr: eq},
&cc.Stmt{Op: cc.StmtExpr, Expr: &cc.Expr{Op: x.Op, Left: old}},
)
//.........这里部分代码省略.........
示例2: fixGoTypesExpr
//.........这里部分代码省略.........
right := fixGoTypesExpr(fn, x.Right, targ)
return fixBinary(fn, x, left, right, targ)
case cc.AddEq, cc.AndEq, cc.DivEq, cc.Eq, cc.ModEq, cc.MulEq, cc.OrEq, cc.SubEq, cc.XorEq:
left := fixGoTypesExpr(fn, x.Left, nil)
if x.Op == cc.AndEq && x.Right.Op == cc.Twid {
x.Op = c2go.AndNotEq
x.Right = x.Right.Left
}
if x.Op == cc.AddEq && isSliceOrString(left) {
fixGoTypesExpr(fn, x.Right, nil)
old := copyExpr(x.Left)
x.Op = cc.Eq
x.Right = &cc.Expr{Op: c2go.ExprSlice, List: []*cc.Expr{old, x.Right, nil}}
return left
}
if x.Op == cc.Eq && x.Left.Op == cc.Index && sameType(x.Left.Left.XType, stringType) && c2go.GoString(x.Left.Right) == "0" && c2go.GoString(x.Right) == "0" {
x.Left = x.Left.Left
x.Right = &cc.Expr{Op: cc.Name, Text: `""`}
return x.Left.XType
}
forceGoType(fn, x.Right, left)
return left
case c2go.ColonEq:
left := fixGoTypesExpr(fn, x.Right, nil)
x.Left.XType = left
x.Left.XDecl.Type = left
return left
case cc.Addr:
left := fixGoTypesExpr(fn, x.Left, nil)
if left == nil {
return nil
}
if targ != nil && targ.Kind == c2go.Slice && sameType(targ.Base, left) {
l := x.Left
l.Op = c2go.ExprSlice
l.List = []*cc.Expr{l.Left, l.Right, nil}
l.Left = nil
l.Right = nil
fixMerge(x, l)
return targ
}
return &cc.Type{Kind: cc.Ptr, Base: left}
case cc.AndAnd, cc.OrOr, cc.Not:
fixGoTypesExpr(fn, x.Left, boolType)
if x.Right != nil {
fixGoTypesExpr(fn, x.Right, boolType)
}
return boolType
case cc.Arrow, cc.Dot:
left := fixGoTypesExpr(fn, x.Left, nil)
if x.Op == cc.Arrow && isSliceOrString(left) {
x.Left = &cc.Expr{Op: cc.Index, Left: x.Left, Right: &cc.Expr{Op: cc.Number, Text: "0"}}