From 741b7577c14911fed71b6d52d8d90e88ef2e05ef Mon Sep 17 00:00:00 2001 From: Nicolas Pierron Date: Sun, 14 Mar 2010 11:58:07 +0000 Subject: Merge r20344 & r20346. --- src/libexpr/parser.y | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src/libexpr') diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index c4afb72eacd5..8706ce025477 100644 --- a/src/libexpr/parser.y +++ b/src/libexpr/parser.y @@ -85,6 +85,10 @@ static Expr fixAttrs(bool recursive, ATermList as) { Tree attrs; + /* This ATermMap is needed to ensure that the `leaf' fields in the + Tree nodes are not garbage collected. */ + ATermMap gcRoots; + for (ATermIterator i(as); i; ++i) { ATermList names, attrPath; Expr src, e; ATerm name, pos; @@ -95,7 +99,9 @@ static Expr fixAttrs(bool recursive, ATermList as) throw ParseError(format("duplicate definition of attribute `%1%' at %2%") % showAttrPath(ATmakeList1(*j)) % showPos(pos)); Tree & t(attrs.children[*j]); - t.leaf = fromScope ? makeVar(*j) : makeSelect(src, *j); + Expr leaf = fromScope ? makeVar(*j) : makeSelect(src, *j); + gcRoots.set(leaf, leaf); + t.leaf = leaf; t.pos = pos; if (recursive && fromScope) t.recursive = false; } -- cgit 1.4.1 From 471419d1fac21412dea9a47eff200d44cd75d825 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Wed, 31 Mar 2010 08:29:05 +0000 Subject: Add source location information to the XML output. * src/libexpr/expr-to-xml.cc (nix::showAttrs): Dereference the attribute RHS. Add "path", "line", and "column" XML attributes to the node when source location information is available. (nix::printTermAsXML): Likewise for functions. --- src/libexpr/expr-to-xml.cc | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) (limited to 'src/libexpr') diff --git a/src/libexpr/expr-to-xml.cc b/src/libexpr/expr-to-xml.cc index e401001ead01..4ca71c88909b 100644 --- a/src/libexpr/expr-to-xml.cc +++ b/src/libexpr/expr-to-xml.cc @@ -34,8 +34,25 @@ static void showAttrs(const ATermMap & attrs, XMLWriter & doc, for (ATermMap::const_iterator i = attrs.begin(); i != attrs.end(); ++i) 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, context, drvsSeen); + ATerm attrRHS = attrs.get(toATerm(*i)); + ATerm attr; + Pos pos; + XMLAttrs xmlAttrs; + + xmlAttrs["name"] = *i; + if(matchAttrRHS(attrRHS, attr, pos)) { + ATerm path; + int line, column; + if (matchPos(pos, path, line, column)) { + xmlAttrs["path"] = aterm2String(path); + xmlAttrs["line"] = (format("%1%") % line).str(); + xmlAttrs["column"] = (format("%1%") % column).str(); + } + } else + abort(); // Should not happen. + + XMLOpenElement _(doc, "attr", xmlAttrs); + printTermAsXML(attr, doc, context, drvsSeen); } } @@ -97,9 +114,12 @@ static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, else if (matchAttrs(e, as)) { ATermMap attrs; - queryAllAttrs(e, attrs); + queryAllAttrs(e, attrs, true); - Expr a = attrs.get(toATerm("type")); + Expr aRHS = attrs.get(toATerm("type")); + Expr a = NULL; + if (aRHS) + matchAttrRHS(aRHS, a, pos); if (a && matchStr(a, s, context) && s == "derivation") { XMLAttrs xmlAttrs; @@ -135,7 +155,15 @@ static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, } else if (matchFunction(e, pat, body, pos)) { - XMLOpenElement _(doc, "function"); + ATerm path; + int line, column; + XMLAttrs xmlAttrs; + if (matchPos(pos, path, line, column)) { + xmlAttrs["path"] = aterm2String(path); + xmlAttrs["line"] = (format("%1%") % line).str(); + xmlAttrs["column"] = (format("%1%") % column).str(); + } + XMLOpenElement _(doc, "function", xmlAttrs); printPatternAsXML(pat, doc); } -- cgit 1.4.1 From 09381cccffe675ccbc8d183f043788f99dc018cd Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Wed, 31 Mar 2010 12:38:31 +0000 Subject: Make source location info in the XML output optional. * src/libexpr/expr-to-xml.cc (nix::showAttrs): Add `location' parameter. Provide location XML attributes when it's true. Update callers. (nix::printTermAsXML): Likewise. * src/libexpr/expr-to-xml.hh (nix::printTermAsXML): Update prototype; have `location' default to `false'. * src/nix-instantiate/nix-instantiate.cc (printResult, processExpr): Add `location' parameter; update callers. (run): Add support for `--no-location'. * src/nix-instantiate/help.txt: Update accordingly. * tests/lang.sh: Invoke `nix-instantiate' with `--no-location' for the XML tests. * tests/lang/eval-okay-toxml.exp, tests/lang/eval-okay-to-xml.nix: New files. --- src/libexpr/expr-to-xml.cc | 22 +++++++++++----------- src/libexpr/expr-to-xml.hh | 2 +- src/nix-instantiate/help.txt | 2 ++ src/nix-instantiate/nix-instantiate.cc | 15 +++++++++------ tests/lang.sh | 3 ++- tests/lang/eval-okay-toxml.exp | 1 + tests/lang/eval-okay-toxml.nix | 3 +++ 7 files changed, 29 insertions(+), 19 deletions(-) create mode 100644 tests/lang/eval-okay-toxml.exp create mode 100644 tests/lang/eval-okay-toxml.nix (limited to 'src/libexpr') diff --git a/src/libexpr/expr-to-xml.cc b/src/libexpr/expr-to-xml.cc index 4ca71c88909b..5857537d7501 100644 --- a/src/libexpr/expr-to-xml.cc +++ b/src/libexpr/expr-to-xml.cc @@ -24,11 +24,11 @@ typedef set ExprSet; static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, - ExprSet & drvsSeen); + ExprSet & drvsSeen, bool location); static void showAttrs(const ATermMap & attrs, XMLWriter & doc, - PathSet & context, ExprSet & drvsSeen) + PathSet & context, ExprSet & drvsSeen, bool location) { StringSet names; for (ATermMap::const_iterator i = attrs.begin(); i != attrs.end(); ++i) @@ -43,7 +43,7 @@ static void showAttrs(const ATermMap & attrs, XMLWriter & doc, if(matchAttrRHS(attrRHS, attr, pos)) { ATerm path; int line, column; - if (matchPos(pos, path, line, column)) { + if (location && matchPos(pos, path, line, column)) { xmlAttrs["path"] = aterm2String(path); xmlAttrs["line"] = (format("%1%") % line).str(); xmlAttrs["column"] = (format("%1%") % column).str(); @@ -52,7 +52,7 @@ static void showAttrs(const ATermMap & attrs, XMLWriter & doc, abort(); // Should not happen. XMLOpenElement _(doc, "attr", xmlAttrs); - printTermAsXML(attr, doc, context, drvsSeen); + printTermAsXML(attr, doc, context, drvsSeen, location); } } @@ -83,7 +83,7 @@ static void printPatternAsXML(Pattern pat, XMLWriter & doc) static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, - ExprSet & drvsSeen) + ExprSet & drvsSeen, bool location) { XMLAttrs attrs; string s; @@ -137,28 +137,28 @@ static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, if (drvsSeen.find(e) == drvsSeen.end()) { drvsSeen.insert(e); - showAttrs(attrs, doc, context, drvsSeen); + showAttrs(attrs, doc, context, drvsSeen, location); } else doc.writeEmptyElement("repeated"); } else { XMLOpenElement _(doc, "attrs"); - showAttrs(attrs, doc, context, drvsSeen); + showAttrs(attrs, doc, context, drvsSeen, location); } } else if (matchList(e, es)) { XMLOpenElement _(doc, "list"); for (ATermIterator i(es); i; ++i) - printTermAsXML(*i, doc, context, drvsSeen); + printTermAsXML(*i, doc, context, drvsSeen, location); } else if (matchFunction(e, pat, body, pos)) { ATerm path; int line, column; XMLAttrs xmlAttrs; - if (matchPos(pos, path, line, column)) { + if (location && matchPos(pos, path, line, column)) { xmlAttrs["path"] = aterm2String(path); xmlAttrs["line"] = (format("%1%") % line).str(); xmlAttrs["column"] = (format("%1%") % column).str(); @@ -172,12 +172,12 @@ static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, } -void printTermAsXML(Expr e, std::ostream & out, PathSet & context) +void printTermAsXML(Expr e, std::ostream & out, PathSet & context, bool location) { XMLWriter doc(true, out); XMLOpenElement root(doc, "expr"); ExprSet drvsSeen; - printTermAsXML(e, doc, context, drvsSeen); + printTermAsXML(e, doc, context, drvsSeen, location); } diff --git a/src/libexpr/expr-to-xml.hh b/src/libexpr/expr-to-xml.hh index 36b8e40424d8..de9d55f320ac 100644 --- a/src/libexpr/expr-to-xml.hh +++ b/src/libexpr/expr-to-xml.hh @@ -9,7 +9,7 @@ namespace nix { -void printTermAsXML(Expr e, std::ostream & out, PathSet & context); +void printTermAsXML(Expr e, std::ostream & out, PathSet & context, bool location = false); } diff --git a/src/nix-instantiate/help.txt b/src/nix-instantiate/help.txt index fa0a4590ee92..21822132aece 100644 --- a/src/nix-instantiate/help.txt +++ b/src/nix-instantiate/help.txt @@ -22,6 +22,8 @@ Options: For --eval-only / --parse-only: --xml: print an XML representation of the abstract syntax tree + --no-location: don't provide source location information in the + output XML tree For --eval-only: diff --git a/src/nix-instantiate/nix-instantiate.cc b/src/nix-instantiate/nix-instantiate.cc index 3822de5c6289..21f352f2580d 100644 --- a/src/nix-instantiate/nix-instantiate.cc +++ b/src/nix-instantiate/nix-instantiate.cc @@ -38,13 +38,13 @@ static bool indirectRoot = false; static void printResult(EvalState & state, Expr e, - bool evalOnly, bool xmlOutput, const ATermMap & autoArgs) + bool evalOnly, bool xmlOutput, bool location, const ATermMap & autoArgs) { PathSet context; if (evalOnly) if (xmlOutput) - printTermAsXML(e, std::cout, context); + printTermAsXML(e, std::cout, context, location); else std::cout << format("%1%\n") % canonicaliseExpr(e); @@ -67,7 +67,7 @@ static void printResult(EvalState & state, Expr e, void processExpr(EvalState & state, const Strings & attrPaths, bool parseOnly, bool strict, const ATermMap & autoArgs, - bool evalOnly, bool xmlOutput, Expr e) + bool evalOnly, bool xmlOutput, bool location, Expr e) { for (Strings::const_iterator i = attrPaths.begin(); i != attrPaths.end(); ++i) { Expr e2 = findAlongAttrPath(state, *i, autoArgs, e); @@ -76,7 +76,7 @@ void processExpr(EvalState & state, const Strings & attrPaths, e2 = strictEvalExpr(state, e2); else e2 = evalExpr(state, e2); - printResult(state, e2, evalOnly, xmlOutput, autoArgs); + printResult(state, e2, evalOnly, xmlOutput, location, autoArgs); } } @@ -89,6 +89,7 @@ void run(Strings args) bool evalOnly = false; bool parseOnly = false; bool xmlOutput = false; + bool xmlOutputSourceLocation = true; bool strict = false; Strings attrPaths; ATermMap autoArgs(128); @@ -124,6 +125,8 @@ void run(Strings args) indirectRoot = true; else if (arg == "--xml") xmlOutput = true; + else if (arg == "--no-location") + xmlOutputSourceLocation = false; else if (arg == "--strict") strict = true; else if (arg[0] == '-') @@ -139,7 +142,7 @@ void run(Strings args) if (readStdin) { Expr e = parseStdin(state); processExpr(state, attrPaths, parseOnly, strict, autoArgs, - evalOnly, xmlOutput, e); + evalOnly, xmlOutput, xmlOutputSourceLocation, e); } for (Strings::iterator i = files.begin(); @@ -148,7 +151,7 @@ void run(Strings args) Path path = absPath(*i); Expr e = parseExprFromFile(state, path); processExpr(state, attrPaths, parseOnly, strict, autoArgs, - evalOnly, xmlOutput, e); + evalOnly, xmlOutput, xmlOutputSourceLocation, e); } printEvalStats(state); diff --git a/tests/lang.sh b/tests/lang.sh index 18eb0278cfcc..54f01076371e 100644 --- a/tests/lang.sh +++ b/tests/lang.sh @@ -54,7 +54,8 @@ for i in lang/eval-okay-*.nix; do fi if test -e lang/$i.exp.xml; then - if ! $nixinstantiate --eval-only --xml --strict lang/$i.nix > lang/$i.out.xml; then + if ! $nixinstantiate --eval-only --xml --no-location --strict \ + lang/$i.nix > lang/$i.out.xml; then echo "FAIL: $i should evaluate" fail=1 elif ! cmp -s lang/$i.out.xml lang/$i.exp.xml; then diff --git a/tests/lang/eval-okay-toxml.exp b/tests/lang/eval-okay-toxml.exp new file mode 100644 index 000000000000..379f3c07617e --- /dev/null +++ b/tests/lang/eval-okay-toxml.exp @@ -0,0 +1 @@ +Str("\n\n \n \n \n \n \n\n",[]) diff --git a/tests/lang/eval-okay-toxml.nix b/tests/lang/eval-okay-toxml.nix new file mode 100644 index 000000000000..068c97a6c1b3 --- /dev/null +++ b/tests/lang/eval-okay-toxml.nix @@ -0,0 +1,3 @@ +# Make sure the expected XML output is produced; in particular, make sure it +# doesn't contain source location information. +builtins.toXML { a = "s"; } -- cgit 1.4.1 From aac5fcfbb54ff64c593d8919f7f52025415ea996 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Fri, 9 Apr 2010 21:30:55 +0000 Subject: Re-add `drvPath' and `outPath' attributes to XML nodes. This fixes a regression introduced in r20882 ("Add source location information to the XML output."). * src/libexpr/expr-to-xml.cc (nix::printTermAsXML): Dereference the attribute RHS from "drvPath" and "outPath". --- src/libexpr/expr-to-xml.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'src/libexpr') diff --git a/src/libexpr/expr-to-xml.cc b/src/libexpr/expr-to-xml.cc index 5857537d7501..1e59eebfc497 100644 --- a/src/libexpr/expr-to-xml.cc +++ b/src/libexpr/expr-to-xml.cc @@ -124,15 +124,17 @@ static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, XMLAttrs xmlAttrs; Path outPath, drvPath; - - a = attrs.get(toATerm("drvPath")); + + aRHS = attrs.get(toATerm("drvPath")); + matchAttrRHS(aRHS, a, pos); if (matchStr(a, drvPath, context)) xmlAttrs["drvPath"] = drvPath; - - a = attrs.get(toATerm("outPath")); + + aRHS = attrs.get(toATerm("outPath")); + matchAttrRHS(aRHS, a, pos); if (matchStr(a, outPath, context)) xmlAttrs["outPath"] = outPath; - + XMLOpenElement _(doc, "derivation", xmlAttrs); if (drvsSeen.find(e) == drvsSeen.end()) { -- cgit 1.4.1