| // Copyright 2021 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package typeparams |
| |
| import ( |
| "go/ast" |
| "go/token" |
| ) |
| |
| func PackIndexExpr(x ast.Expr, lbrack token.Pos, exprs []ast.Expr, rbrack token.Pos) ast.Expr { |
| switch len(exprs) { |
| case 0: |
| panic("internal error: PackIndexExpr with empty expr slice") |
| case 1: |
| return &ast.IndexExpr{ |
| X: x, |
| Lbrack: lbrack, |
| Index: exprs[0], |
| Rbrack: rbrack, |
| } |
| default: |
| return &ast.IndexListExpr{ |
| X: x, |
| Lbrack: lbrack, |
| Indices: exprs, |
| Rbrack: rbrack, |
| } |
| } |
| } |
| |
| // IndexExpr wraps an ast.IndexExpr or ast.IndexListExpr. |
| // |
| // Orig holds the original ast.Expr from which this IndexExpr was derived. |
| type IndexExpr struct { |
| Orig ast.Expr // the wrapped expr, which may be distinct from the IndexListExpr below. |
| *ast.IndexListExpr |
| } |
| |
| func UnpackIndexExpr(n ast.Node) *IndexExpr { |
| switch e := n.(type) { |
| case *ast.IndexExpr: |
| return &IndexExpr{e, &ast.IndexListExpr{ |
| X: e.X, |
| Lbrack: e.Lbrack, |
| Indices: []ast.Expr{e.Index}, |
| Rbrack: e.Rbrack, |
| }} |
| case *ast.IndexListExpr: |
| return &IndexExpr{e, e} |
| } |
| return nil |
| } |