From a64bbe049e19618c33a878154f2e69029d45ecd7 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 15 May 2009 13:46:13 +0000 Subject: * 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 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index 2ee3833fe61f..c4afb72eacd5 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; } } -- cgit 1.4.1