* `nix-instantiate --print-args' prints out the arguments of a

top-level function.
This commit is contained in:
Eelco Dolstra 2006-07-25 21:21:50 +00:00
parent 0e6dc72a7a
commit 2317d8f671
3 changed files with 28 additions and 7 deletions

View file

@ -124,8 +124,8 @@ static void getDerivations(EvalState & state, Expr e,
DrvInfos & drvs, Exprs & doneExprs, const string & attrPath, DrvInfos & drvs, Exprs & doneExprs, const string & attrPath,
const string & pathTaken) const string & pathTaken)
{ {
/* Automatically call functions that have defaults for all /* Automatically call functions for which each argument has a
arguments. */ default value. */
ATermList formals; ATermList formals;
ATerm body, pos; ATerm body, pos;
if (matchFunction(e, formals, body, pos)) { if (matchFunction(e, formals, body, pos)) {

View file

@ -15,4 +15,6 @@ Options:
--eval-only: evaluate and print resulting term; do not instantiate --eval-only: evaluate and print resulting term; do not instantiate
--parse-only: parse and print abstract syntax tree --parse-only: parse and print abstract syntax tree
--attr / -A PATH: select an attribute from the top-level expression
--add-root: add garbage collector roots for the result --add-root: add garbage collector roots for the result

View file

@ -33,11 +33,25 @@ static int rootNr = 0;
static bool indirectRoot = false; static bool indirectRoot = false;
static void printResult(EvalState & state, Expr e, bool evalOnly, static void printResult(EvalState & state, Expr e,
const string & attrPath) bool evalOnly, bool printArgs, const string & attrPath)
{ {
if (evalOnly) if (evalOnly)
cout << format("%1%\n") % e; cout << format("%1%\n") % e;
else if (printArgs) {
ATermList formals;
ATerm body, pos;
if (matchFunction(e, formals, body, pos)) {
for (ATermIterator i(formals); i; ++i) {
Expr name; ATerm d1, d2;
if (!matchFormal(*i, name, d1, d2)) abort();
cout << format("%1%\n") % aterm2String(name);
}
} else
printMsg(lvlError, "warning: expression does not evaluate to a function");
}
else { else {
DrvInfos drvs; DrvInfos drvs;
getDerivations(state, e, drvs, attrPath); getDerivations(state, e, drvs, attrPath);
@ -62,6 +76,7 @@ void run(Strings args)
bool readStdin = false; bool readStdin = false;
bool evalOnly = false; bool evalOnly = false;
bool parseOnly = false; bool parseOnly = false;
bool printArgs = false;
string attrPath; string attrPath;
for (Strings::iterator i = args.begin(); for (Strings::iterator i = args.begin();
@ -79,6 +94,10 @@ void run(Strings args)
readOnlyMode = true; readOnlyMode = true;
parseOnly = evalOnly = true; parseOnly = evalOnly = true;
} }
else if (arg == "--print-args") {
readOnlyMode = true;
printArgs = true;
}
else if (arg == "--add-root") { else if (arg == "--add-root") {
if (i == args.end()) if (i == args.end())
throw UsageError("`--add-root requires an argument"); throw UsageError("`--add-root requires an argument");
@ -101,7 +120,7 @@ void run(Strings args)
if (readStdin) { if (readStdin) {
Expr e = evalStdin(state, parseOnly); Expr e = evalStdin(state, parseOnly);
printResult(state, e, evalOnly, attrPath); printResult(state, e, evalOnly, printArgs, attrPath);
} }
for (Strings::iterator i = files.begin(); for (Strings::iterator i = files.begin();
@ -111,7 +130,7 @@ void run(Strings args)
Expr e = parseOnly Expr e = parseOnly
? parseExprFromFile(state, path) ? parseExprFromFile(state, path)
: evalFile(state, path); : evalFile(state, path);
printResult(state, e, evalOnly, attrPath); printResult(state, e, evalOnly, printArgs, attrPath);
} }
printEvalStats(state); printEvalStats(state);