func()

in mockgen/parse.go [511:549]


func (p *fileParser) parseArrayLength(expr ast.Expr) (string, error) {
	switch val := expr.(type) {
	case (*ast.BasicLit):
		return val.Value, nil
	case (*ast.Ident):
		// when the length is a const defined locally
		return val.Obj.Decl.(*ast.ValueSpec).Values[0].(*ast.BasicLit).Value, nil
	case (*ast.SelectorExpr):
		// when the length is a const defined in an external package
		usedPkg, err := importer.Default().Import(fmt.Sprintf("%s", val.X))
		if err != nil {
			return "", p.errorf(expr.Pos(), "unknown package in array length: %v", err)
		}
		ev, err := types.Eval(token.NewFileSet(), usedPkg, token.NoPos, val.Sel.Name)
		if err != nil {
			return "", p.errorf(expr.Pos(), "unknown constant in array length: %v", err)
		}
		return ev.Value.String(), nil
	case (*ast.ParenExpr):
		return p.parseArrayLength(val.X)
	case (*ast.BinaryExpr):
		x, err := p.parseArrayLength(val.X)
		if err != nil {
			return "", err
		}
		y, err := p.parseArrayLength(val.Y)
		if err != nil {
			return "", err
		}
		biExpr := fmt.Sprintf("%s%v%s", x, val.Op, y)
		tv, err := types.Eval(token.NewFileSet(), nil, token.NoPos, biExpr)
		if err != nil {
			return "", p.errorf(expr.Pos(), "invalid expression in array length: %v", err)
		}
		return tv.Value.String(), nil
	default:
		return "", p.errorf(expr.Pos(), "invalid expression in array length: %v", val)
	}
}