github.com/goplusjs/gopherjs@v1.2.6-0.20211206034512-f187917453b8/compiler/filter/incdecstmt.go (about)

     1  package filter
     2  
     3  import (
     4  	"go/ast"
     5  	"go/constant"
     6  	"go/token"
     7  	"go/types"
     8  )
     9  
    10  func IncDecStmt(stmt ast.Stmt, info *types.Info) ast.Stmt {
    11  	if s, ok := stmt.(*ast.IncDecStmt); ok {
    12  		t := info.TypeOf(s.X)
    13  		if iExpr, isIExpr := s.X.(*ast.IndexExpr); isIExpr {
    14  			switch u := info.TypeOf(iExpr.X).Underlying().(type) {
    15  			case *types.Array:
    16  				t = u.Elem()
    17  			case *types.Slice:
    18  				t = u.Elem()
    19  			case *types.Map:
    20  				t = u.Elem()
    21  			}
    22  		}
    23  
    24  		tok := token.ADD_ASSIGN
    25  		if s.Tok == token.DEC {
    26  			tok = token.SUB_ASSIGN
    27  		}
    28  
    29  		one := &ast.BasicLit{Kind: token.INT}
    30  		info.Types[one] = types.TypeAndValue{Type: t, Value: constant.MakeInt64(1)}
    31  
    32  		return &ast.AssignStmt{
    33  			Lhs: []ast.Expr{s.X},
    34  			Tok: tok,
    35  			Rhs: []ast.Expr{one},
    36  		}
    37  	}
    38  	return stmt
    39  }