From 5fd44654dbca02f188957279eb25a33a3ecfe96b Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 3 Oct 2006 15:38:59 +0000 Subject: [PATCH] * toXML: propagate the context to allow derivations to be used in the argument. --- src/libexpr/expr-to-xml.cc | 19 +++++++++++++------ src/libexpr/expr-to-xml.hh | 3 ++- src/libexpr/primops.cc | 5 +++-- src/nix-instantiate/main.cc | 4 +++- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/libexpr/expr-to-xml.cc b/src/libexpr/expr-to-xml.cc index b84c0058e..085488bb5 100644 --- a/src/libexpr/expr-to-xml.cc +++ b/src/libexpr/expr-to-xml.cc @@ -15,14 +15,21 @@ static XMLAttrs singletonAttrs(const string & name, const string & value) } -static void printTermAsXML(Expr e, XMLWriter & doc) +static void printTermAsXML(Expr e, XMLWriter & doc, ATermList & context) { XMLAttrs attrs; ATerm s; int i; + Expr e2; ATermList as, es, formals; ATerm body, pos; + while (matchContext(e, es, e2)) { + e = e2; + for (ATermIterator i(es); i; ++i) + context = ATinsert(context, *i); + } + if (matchStr(e, s)) doc.writeEmptyElement("string", singletonAttrs("value", aterm2String(s))); @@ -53,14 +60,14 @@ static void printTermAsXML(Expr e, XMLWriter & doc) names.insert(aterm2String(i->key)); for (StringSet::iterator i = names.begin(); i != names.end(); ++i) { XMLOpenElement _(doc, "attr", singletonAttrs("name", *i)); - printTermAsXML(attrs.get(toATerm(*i)), doc); + printTermAsXML(attrs.get(toATerm(*i)), doc, context); } } else if (matchList(e, es)) { XMLOpenElement _(doc, "list"); for (ATermIterator i(es); i; ++i) - printTermAsXML(*i, doc); + printTermAsXML(*i, doc, context); } else if (matchFunction(e, formals, body, pos)) { @@ -75,7 +82,7 @@ static void printTermAsXML(Expr e, XMLWriter & doc) if (matchValidValues(valids, valids2)) { for (ATermIterator j(valids2); j; ++j) { XMLOpenElement _(doc, "value"); - printTermAsXML(*j, doc); + printTermAsXML(*j, doc, context); } } } @@ -86,11 +93,11 @@ static void printTermAsXML(Expr e, XMLWriter & doc) } -void printTermAsXML(Expr e, std::ostream & out) +void printTermAsXML(Expr e, std::ostream & out, ATermList & context) { XMLWriter doc(true, out); XMLOpenElement root(doc, "expr"); - printTermAsXML(e, doc); + printTermAsXML(e, doc, context); } diff --git a/src/libexpr/expr-to-xml.hh b/src/libexpr/expr-to-xml.hh index 6b95c88f5..eb628660d 100644 --- a/src/libexpr/expr-to-xml.hh +++ b/src/libexpr/expr-to-xml.hh @@ -5,10 +5,11 @@ #include #include "nixexpr.hh" +#include "aterm.hh" namespace nix { -void printTermAsXML(Expr e, std::ostream & out); +void printTermAsXML(Expr e, std::ostream & out, ATermList & context); } diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 926ea7b80..babd6df37 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -507,8 +507,9 @@ static Expr primToPath(EvalState & state, const ATermVector & args) static Expr primToXML(EvalState & state, const ATermVector & args) { std::ostringstream out; - printTermAsXML(strictEvalExpr(state, args[0]), out); - return makeStr(toATerm(out.str())); + ATermList context = ATempty; + printTermAsXML(strictEvalExpr(state, args[0]), out, context); + return wrapInContext(context, makeStr(toATerm(out.str()))); } diff --git a/src/nix-instantiate/main.cc b/src/nix-instantiate/main.cc index fefc17c48..93b7c03be 100644 --- a/src/nix-instantiate/main.cc +++ b/src/nix-instantiate/main.cc @@ -41,9 +41,11 @@ static bool indirectRoot = false; static void printResult(EvalState & state, Expr e, bool evalOnly, bool xmlOutput, const ATermMap & autoArgs) { + ATermList context; + if (evalOnly) if (xmlOutput) - printTermAsXML(e, std::cout); + printTermAsXML(e, std::cout, context); else std::cout << format("%1%\n") % e;