diff --git a/src/libcmd/repl.cc b/src/libcmd/repl.cc index 9e3d99d75d13..d33ac8ac76d2 100644 --- a/src/libcmd/repl.cc +++ b/src/libcmd/repl.cc @@ -902,7 +902,13 @@ ExprAttrs * NixRepl::parseReplBindings(std::string s) // Try parsing as bindings try { return state->parseReplBindings(s, basePath, staticEnv); - } catch (ParseError &) { + } catch (ParseError & e) { + // If the input is incomplete (e.g. `a = {` without closing `}`), + // signal the main loop to prompt for continuation instead of falling + // through to expression evaluation (which would produce a confusing + // "unexpected '='" error). + if (isIncompleteInput(e)) + throw IncompleteReplExpr(e.msg()); } // Try with semicolon appended (for `inherit foo` shorthand) diff --git a/tests/functional/suites/repl/cases/multiline-attrset-binding.expected b/tests/functional/suites/repl/cases/multiline-attrset-binding.expected new file mode 100644 index 000000000000..52542b688894 --- /dev/null +++ b/tests/functional/suites/repl/cases/multiline-attrset-binding.expected @@ -0,0 +1,9 @@ +Nix +Type :? for help. + +nix-repl> a = { + > b = 1; + > } + +nix-repl> a +{ b = 1; } diff --git a/tests/functional/suites/repl/cases/multiline-attrset-binding.in b/tests/functional/suites/repl/cases/multiline-attrset-binding.in new file mode 100644 index 000000000000..742f7cdec687 --- /dev/null +++ b/tests/functional/suites/repl/cases/multiline-attrset-binding.in @@ -0,0 +1,5 @@ +# COM: Multi-line attribute set in binding should trigger continuation (issue #16310) +a = { + b = 1; +} +a diff --git a/tests/functional/suites/repl/cases/multiline-attrset-expr.expected b/tests/functional/suites/repl/cases/multiline-attrset-expr.expected new file mode 100644 index 000000000000..e644eddd32a3 --- /dev/null +++ b/tests/functional/suites/repl/cases/multiline-attrset-expr.expected @@ -0,0 +1,7 @@ +Nix +Type :? for help. + +nix-repl> { + > x = 1; + > } +{ x = 1; } diff --git a/tests/functional/suites/repl/cases/multiline-attrset-expr.in b/tests/functional/suites/repl/cases/multiline-attrset-expr.in new file mode 100644 index 000000000000..57c538a6fb61 --- /dev/null +++ b/tests/functional/suites/repl/cases/multiline-attrset-expr.in @@ -0,0 +1,4 @@ +# COM: Multi-line attribute set expression (not binding) should still trigger continuation (issue #16310) +{ + x = 1; +}