package core import ( "git.urbach.dev/cli/q/src/ast" "git.urbach.dev/cli/q/src/errors" "git.urbach.dev/cli/q/src/token" ) // compileLoopControl compiles loop control statements. func (f *Function) compileLoopControl(control *ast.LoopControl) error { call := control.Expression if call.Token.Kind != token.Call { return errors.New(InvalidExpression, f.File, control.Expression.Source()) } if len(call.Children) != 1 { return errors.New(InvalidExpression, f.File, control.Expression.Source()) } loop := f.loopStack.Current() if loop == nil { return errors.New(LoopControlWithoutLoop, f.File, control.Expression.Source()) } name := call.Children[0].Token.StringFrom(f.File.Bytes) switch name { case "next": f.loopNext(loop) case "restart": // reserved case "stop": f.jump(loop.Exit) default: correctName := "" if name == "break" { correctName = "stop" } return errors.New(&InvalidLoopControl{Name: name, CorrectName: correctName}, f.File, call.Children[0].Source()) } return nil }