From d445da7a7b3cbb4822bcad3904a36f0d914917d3 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 4 Feb 2004 17:23:26 +0000 Subject: [PATCH] * Extended the `inherit' syntax to optionally select attributes from other attribute sets, rather than the current scope. E.g., {inherit (pkgs) gcc binutils;} is equivalent to {gcc = pkgs.gcc; binutils = pkgs.binutils;} I am not so happy about the syntax. --- src/libexpr/parser.cc | 15 ++++++++++----- src/libexpr/parser.y | 11 ++++++++--- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/libexpr/parser.cc b/src/libexpr/parser.cc index 68b367340..c300a0d07 100644 --- a/src/libexpr/parser.cc +++ b/src/libexpr/parser.cc @@ -50,11 +50,16 @@ ATerm fixAttrs(int recursive, ATermList as) ATermList * is = recursive ? &cs : &bs; for (ATermIterator i(as); i; ++i) { ATermList names; - if (atMatch(m, *i) >> "Inherit" >> names) - for (ATermIterator j(names); j; ++j) - *is = ATinsert(*is, - ATmake("Bind(, Var())", *j, *j)); - else bs = ATinsert(bs, *i); + Expr src; + if (atMatch(m, *i) >> "Inherit" >> src >> names) { + bool fromScope = atMatch(m, src) >> "Scope"; + for (ATermIterator j(names); j; ++j) { + Expr rhs = fromScope + ? ATmake("Var()", *j) + : ATmake("Select(, )", src, *j); + *is = ATinsert(*is, ATmake("Bind(, )", *j, rhs)); + } + } else bs = ATinsert(bs, *i); } if (recursive) return ATmake("Rec(, )", bs, cs); diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index 6c0fdbda2..257c0cd38 100644 --- a/src/libexpr/parser.y +++ b/src/libexpr/parser.y @@ -33,7 +33,7 @@ void yyerror(YYLTYPE * loc, yyscan_t scanner, void * data, char * s) } %type start expr expr_function expr_assert expr_op -%type expr_app expr_select expr_simple bind formal +%type expr_app expr_select expr_simple bind inheritsrc formal %type binds ids expr_list formals %token ID INT STR PATH URI %token IF THEN ELSE ASSERT LET REC INHERIT EQ NEQ AND OR IMPL @@ -114,8 +114,13 @@ binds bind : ID '=' expr ';' { $$ = ATmake("Bind(, )", $1, $3); } - | INHERIT ids ';' - { $$ = ATmake("Inherit()", $2); } + | INHERIT inheritsrc ids ';' + { $$ = ATmake("Inherit(, )", $2, $3); } + ; + +inheritsrc + : '(' expr ')' { $$ = $2; } + | { $$ = ATmake("Scope"); } ; ids: ids ID { $$ = ATinsert($1, $2); } | { $$ = ATempty; };