From a64bbe049e19618c33a878154f2e69029d45ecd7 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 15 May 2009 13:46:13 +0000 Subject: [PATCH] * Change the scoping of "inherit (e) ..." in recs so that the attributes of the rec are in scope of `e'. This is useful in expressions such as rec { lib = import ./lib; inherit (lib) concatStrings; } It does change the semantics of expressions such as let x = {y = 1;}; in rec { x = {y = 2;}; inherit (x) y; }.y This now returns 2 instead of 1. However, no code in Nixpkgs or NixOS seems to rely on the old behaviour. --- src/libexpr/parser.y | 5 +++-- tests/lang/eval-okay-scope-7.exp | 1 + tests/lang/eval-okay-scope-7.nix | 6 ++++++ 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 tests/lang/eval-okay-scope-7.exp create mode 100644 tests/lang/eval-okay-scope-7.nix diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index 2ee3833f..c4afb72e 100644 --- a/src/libexpr/parser.y +++ b/src/libexpr/parser.y @@ -91,12 +91,13 @@ static Expr fixAttrs(bool recursive, ATermList as) if (matchInherit(*i, src, names, pos)) { bool fromScope = matchScope(src); for (ATermIterator j(names); j; ++j) { - Expr rhs = fromScope ? makeVar(*j) : makeSelect(src, *j); if (attrs.children.find(*j) != attrs.children.end()) throw ParseError(format("duplicate definition of attribute `%1%' at %2%") % showAttrPath(ATmakeList1(*j)) % showPos(pos)); Tree & t(attrs.children[*j]); - t.leaf = rhs; t.pos = pos; if (recursive) t.recursive = false; + t.leaf = fromScope ? makeVar(*j) : makeSelect(src, *j); + t.pos = pos; + if (recursive && fromScope) t.recursive = false; } } diff --git a/tests/lang/eval-okay-scope-7.exp b/tests/lang/eval-okay-scope-7.exp new file mode 100644 index 00000000..067d2b74 --- /dev/null +++ b/tests/lang/eval-okay-scope-7.exp @@ -0,0 +1 @@ +Int(1) diff --git a/tests/lang/eval-okay-scope-7.nix b/tests/lang/eval-okay-scope-7.nix new file mode 100644 index 00000000..4da02968 --- /dev/null +++ b/tests/lang/eval-okay-scope-7.nix @@ -0,0 +1,6 @@ +rec { + inherit (x) y; + x = { + y = 1; + }; +}.y