summary refs log tree commit diff
path: root/src/libexpr/expr-to-xml.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2006-10-16 15:55:34 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2006-10-16 15:55:34 +0000
commitd7efd7639420f4c840cbfdfcbbb3c45292f3ac54 (patch)
treed48871893e6d3446b6298b0e5e612086233e3947 /src/libexpr/expr-to-xml.cc
parent4c9aa821b985b8e334790a03497a56af3a021f3b (diff)
downloadguix-d7efd7639420f4c840cbfdfcbbb3c45292f3ac54.tar.gz
* Big cleanup of the semantics of paths, strings, contexts, string
  concatenation and string coercion.  This was a big mess (see
  e.g. NIX-67).  Contexts are now folded into strings, so that they
  don't cause evaluation errors when they're not expected.  The
  semantics of paths has been clarified (see nixexpr-ast.def).
  toString() and coerceToString() have been merged.

  Semantic change: paths are now copied to the store when they're in a
  concatenation (and in most other situations - that's the
  formalisation of the meaning of a path).  So

    "foo " + ./bla

  evaluates to "foo /nix/store/hash...-bla", not "foo
  /path/to/current-dir/bla".  This prevents accidental impurities, and
  is more consistent with the treatment of derivation outputs, e.g.,
  `"foo " + bla' where `bla' is a derivation.  (Here `bla' would be
  replaced by the output path of `bla'.)

Diffstat (limited to 'src/libexpr/expr-to-xml.cc')
-rw-r--r--src/libexpr/expr-to-xml.cc22
1 files changed, 8 insertions, 14 deletions
diff --git a/src/libexpr/expr-to-xml.cc b/src/libexpr/expr-to-xml.cc
index 195cbd7b85..f5b0e74770 100644
--- a/src/libexpr/expr-to-xml.cc
+++ b/src/libexpr/expr-to-xml.cc
@@ -15,26 +15,20 @@ static XMLAttrs singletonAttrs(const string & name, const string & value)
 }
 
 
-static void printTermAsXML(Expr e, XMLWriter & doc, ATermList & context)
+static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context)
 {
     XMLAttrs attrs;
-    ATerm s;
+    string s;
+    ATerm s2;
     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)));
+    if (matchStr(e, s, context)) /* !!! show the context? */
+        doc.writeEmptyElement("string", singletonAttrs("value", s));
 
-    else if (matchPath(e, s))
-        doc.writeEmptyElement("path", singletonAttrs("value", aterm2String(s)));
+    else if (matchPath(e, s2))
+        doc.writeEmptyElement("path", singletonAttrs("value", aterm2String(s2)));
 
     else if (matchNull(e))
         doc.writeEmptyElement("null");
@@ -90,7 +84,7 @@ static void printTermAsXML(Expr e, XMLWriter & doc, ATermList & context)
 }
 
 
-void printTermAsXML(Expr e, std::ostream & out, ATermList & context)
+void printTermAsXML(Expr e, std::ostream & out, PathSet & context)
 {
     XMLWriter doc(true, out);
     XMLOpenElement root(doc, "expr");