core: EvalSequence to handle EvalEarlyExitError

An earlier commit today reworked this to handle non-fatal errors, which
are returned "smuggled" as a special type of error to avoid changing the
EvalNode interface.

Unfortunately, that change then broke the _other_ special thing we smuggle
through the error return path: early exit.

Now we'll handle them both. This is not perfect because the early-exit
path causes us to discard any warnings we've already collected, but it's
more important that we bail early than retain warnings.
This commit is contained in:
Martin Atkins 2018-05-29 16:33:56 -07:00
parent b6d0abef1d
commit 798adf3ce6
1 changed files with 5 additions and 0 deletions

View File

@ -18,6 +18,11 @@ func (n *EvalSequence) Eval(ctx EvalContext) (interface{}, error) {
} }
if _, err := EvalRaw(n, ctx); err != nil { if _, err := EvalRaw(n, ctx); err != nil {
if _, isEarlyExit := err.(EvalEarlyExitError); isEarlyExit {
// In this path we abort early, losing any non-error
// diagnostics we saw earlier.
return nil, err
}
diags = diags.Append(err) diags = diags.Append(err)
if diags.HasErrors() { if diags.HasErrors() {
// Halt if we get some errors, but warnings are okay. // Halt if we get some errors, but warnings are okay.