package core import ( "git.urbach.dev/cli/q/src/errors" "git.urbach.dev/cli/q/src/expression" "git.urbach.dev/cli/q/src/linter" "git.urbach.dev/cli/q/src/ssa" "git.urbach.dev/cli/q/src/token" "git.urbach.dev/cli/q/src/types" ) // evaluateSlice converts a slice expression to an SSA value. func (f *Function) evaluateSlice(expr *expression.Expression, index *expression.Expression, address ssa.Value, length ssa.Value) (ssa.Value, error) { if f.Env.Build.LintSlices { err := linter.LintSlice(expr, index, f.File) if err != nil { return nil, err } } switch len(index.Children) { case 1: from, err := f.evaluateRight(index.Children[0]) if err != nil { return nil, err } if !types.Is(from.Type(), types.AnyInt) { return nil, errors.New(&TypeMismatch{Encountered: from.Type().Name(), Expected: types.AnyInt.Name()}, f.File, index.Children[0].Source()) } return f.makeSlice(address, from, length, expr.Source()), nil case 2: if index.Children[0].Token.Kind == token.Invalid { to, err := f.evaluateRight(index.Children[1]) if err != nil { return nil, err } if !types.Is(to.Type(), types.AnyInt) { return nil, errors.New(&TypeMismatch{Encountered: to.Type().Name(), Expected: types.AnyInt.Name()}, f.File, index.Children[1].Source()) } elementType := types.Unwrap(address.Type()).(*types.Pointer).To sliceType := f.Env.Slice(elementType) slice := f.makeStruct(sliceType, []ssa.Value{address, to}, expr.Source()) return slice, nil } from, err := f.evaluateRight(index.Children[0]) if err != nil { return nil, err } if !types.Is(from.Type(), types.AnyInt) { return nil, errors.New(&TypeMismatch{Encountered: from.Type().Name(), Expected: types.AnyInt.Name()}, f.File, index.Children[0].Source()) } to, err := f.evaluateRight(index.Children[1]) if err != nil { return nil, err } if !types.Is(to.Type(), types.AnyInt) { return nil, errors.New(&TypeMismatch{Encountered: to.Type().Name(), Expected: types.AnyInt.Name()}, f.File, index.Children[1].Source()) } return f.makeSlice(address, from, to, expr.Source()), nil } return nil, errors.New(InvalidExpression, f.File, expr.Source()) }