libexpr: Remove Expr::show, add JSON expression serialization

The code for serialization Expr nodes back into (pseudo-)Nix has been
removed for being subtly error-prone and tedious to maintain. Instead,
`nix-instantiate --parse` now prints a JSON representation of the AST.

Usage patterns of the --parse flag I've found in the wild:

1. Check if a file is well-formed, i.e. discard output and test exit code
2. Get parser errors from a file, i.e. discard stdout and use stderr
3. Nixfmt uses --parse to test equivalence pre/post format, and that property is (should be?) preserved

None of these should break with the current change

Closes #487

Change-Id: Icdbaad17790f2ad8765fa08e02e6597ee4c7a909
This commit is contained in:
piegames
2025-01-21 11:35:51 +01:00
parent 98d9fd0584
commit cf57b5c14c
25 changed files with 1873 additions and 179 deletions
@@ -0,0 +1,15 @@
---
synopsis: '`nix-instantiate --parse` outputs json'
issues: [fj#487, 11124, 4726, 3077]
cls: [2190]
category: Breaking Changes
credits: [piegames, horrors]
---
`nix-instantiate --parse` does not print out the AST in a Nix-like format anymore.
Instead, it now prints a JSON representation of the internal expression tree.
Tooling should not rely on the stdout of `nix-instantiate --parse`.
We've done our best to ensure that the new behavior is as compatible with the old one as possible.
If you depend on the old behavior in ways that are not covered anymore or are otherwise negatively affected by this change,
then please reach out so that we can find a sustainable solution together.
@@ -35,7 +35,14 @@ standard input.
- `--parse`\
Just parse the input files, and print their abstract syntax trees on
standard output as a Nix expression.
standard output. The output format of the AST depends on the current
internal representation and may change in the future.
Tooling can use the stderr and exit code of `--parse` to check any
Nix code for correctness, but should not rely on stdout without careful
versioning. Note that `--parse` also checks for unbound variables.
In cases where this is undesired, `with {};` can be prepended
to the program to transform all such parse errors into eval errors.
- `--eval`\
Just parse and evaluate the input files, and print the resulting
+1 -1
View File
@@ -31,7 +31,7 @@ void processExpr(EvalState & state, const Strings & attrPaths,
bool evalOnly, OutputKind output, bool location, Expr & e)
{
if (parseOnly) {
e.show(state.ctx.symbols, std::cout);
std::cout << e.toJSON(state.ctx.symbols).dump(2);
std::cout << "\n";
return;
}
+156 -153
View File
@@ -8,6 +8,8 @@
#include <cstdlib>
#include <sstream>
using json = nlohmann::json;
namespace nix {
ExprBlackHole eBlackHole;
@@ -29,63 +31,80 @@ AttrName::AttrName(PosIdx pos, std::unique_ptr<Expr> e) : pos(pos), expr(std::mo
{
}
void Expr::show(const SymbolTable & symbols, std::ostream & str) const
json Expr::toJSON(const SymbolTable & symbols) const
{
abort();
}
void ExprInt::show(const SymbolTable & symbols, std::ostream & str) const
json ExprInt::toJSON(const SymbolTable & symbols) const
{
str << n;
return {
{"_type", "ExprInt"},
{"value", n.value}
};
}
void ExprFloat::show(const SymbolTable & symbols, std::ostream & str) const
json ExprFloat::toJSON(const SymbolTable & symbols) const
{
str << nf;
return {
{"_type", "ExprFloat"},
{"value", nf}
};
}
void ExprString::show(const SymbolTable & symbols, std::ostream & str) const
json ExprString::toJSON(const SymbolTable & symbols) const
{
escapeString(str, s);
return {
{"_type", "ExprString"},
{"value", s}
};
}
void ExprPath::show(const SymbolTable & symbols, std::ostream & str) const
json ExprPath::toJSON(const SymbolTable & symbols) const
{
str << s;
return {
{"_type", "ExprPath"},
{"value", s}
};
}
void ExprVar::show(const SymbolTable & symbols, std::ostream & str) const
json ExprVar::toJSON(const SymbolTable & symbols) const
{
str << symbols[name];
return {
{"_type", "ExprVar"},
{"value", symbols[name]}
};
}
void ExprInheritFrom::show(SymbolTable const & symbols, std::ostream & str) const
json ExprInheritFrom::toJSON(SymbolTable const & symbols) const
{
str << "(/* expanded inherit (expr) */ ";
fromExpr->show(symbols, str);
str << ")";
return {
{"_type", "ExprInheritFrom"}
};
}
void ExprSelect::show(const SymbolTable & symbols, std::ostream & str) const
json ExprSelect::toJSON(const SymbolTable & symbols) const
{
str << "(";
e->show(symbols, str);
str << ")." << showAttrPath(symbols, attrPath);
if (def) {
str << " or (";
def->show(symbols, str);
str << ")";
}
json out = {
{"_type", "ExprSelect"},
{"e", e->toJSON(symbols)},
{"attrs", printAttrPathToJson(symbols, attrPath)}
};
if (def)
out["default"] = def->toJSON(symbols);
return out;
}
void ExprOpHasAttr::show(const SymbolTable & symbols, std::ostream & str) const
json ExprOpHasAttr::toJSON(const SymbolTable & symbols) const
{
str << "((";
e->show(symbols, str);
str << ") ? " << showAttrPath(symbols, attrPath) << ")";
return {
{"_type", "ExprOpHasAttr"},
{"e", e->toJSON(symbols)},
{"attrs", printAttrPathToJson(symbols, attrPath)}
};
}
void ExprAttrs::showBindings(const SymbolTable & symbols, std::ostream & str) const
void ExprAttrs::addBindingsToJSON(json & out, const SymbolTable & symbols) const
{
typedef const decltype(attrs)::value_type * Attr;
std::vector<Attr> sorted;
@@ -94,14 +113,14 @@ void ExprAttrs::showBindings(const SymbolTable & symbols, std::ostream & str) co
std::string_view sa = symbols[a->first], sb = symbols[b->first];
return sa < sb;
});
std::vector<Symbol> inherits;
std::map<Displacement, std::vector<Symbol>> inheritsFrom;
for (auto & i : sorted) {
switch (i->second.kind) {
case AttrDef::Kind::Plain:
out["attrs"][symbols[i->first]] = i->second.e->toJSON(symbols);
break;
case AttrDef::Kind::Inherited:
inherits.push_back(i->first);
out["inherit"][symbols[i->first]] = i->second.e->toJSON(symbols);
break;
case AttrDef::Kind::InheritedFrom: {
auto & select = dynamic_cast<ExprSelect &>(*i->second.e);
@@ -111,167 +130,142 @@ void ExprAttrs::showBindings(const SymbolTable & symbols, std::ostream & str) co
}
}
}
if (!inherits.empty()) {
str << "inherit";
for (auto sym : inherits) str << " " << symbols[sym];
str << "; ";
}
for (const auto & [from, syms] : inheritsFrom) {
str << "inherit (";
(*inheritFromExprs)[from]->show(symbols, str);
str << ")";
for (auto sym : syms) str << " " << symbols[sym];
str << "; ";
}
for (auto & i : sorted) {
if (i->second.kind == AttrDef::Kind::Plain) {
str << symbols[i->first] << " = ";
i->second.e->show(symbols, str);
str << "; ";
}
json attrs = json::array();
for (auto sym : syms)
attrs.push_back(symbols[sym]);
out["inheritFrom"].push_back({
{"from", (*inheritFromExprs)[from]->toJSON(symbols)},
{"attrs", attrs}
});
}
for (auto & i : dynamicAttrs) {
str << "\"${";
i.nameExpr->show(symbols, str);
str << "}\" = ";
i.valueExpr->show(symbols, str);
str << "; ";
out["dynamicAttrs"].push_back({
{"name", i.nameExpr->toJSON(symbols) },
{"value", i.valueExpr->toJSON(symbols)}
});
}
}
void ExprSet::show(const SymbolTable & symbols, std::ostream & str) const
json ExprSet::toJSON(const SymbolTable & symbols) const
{
if (recursive) str << "rec ";
str << "{ ";
showBindings(symbols, str);
str << "}";
json out = {
{"_type", "ExprSet"},
{"recursive", recursive},
};
addBindingsToJSON(out, symbols);
return out;
}
void ExprList::show(const SymbolTable & symbols, std::ostream & str) const
json ExprList::toJSON(const SymbolTable & symbols) const
{
str << "[ ";
for (auto & i : elems) {
str << "(";
i->show(symbols, str);
str << ") ";
}
str << "]";
json list = json::array();
for (auto & i : elems)
list.push_back(i->toJSON(symbols));
return {
{ "_type", "ExprList" },
{ "elems", list },
};
}
void ExprLambda::show(const SymbolTable & symbols, std::ostream & str) const
json ExprLambda::toJSON(const SymbolTable & symbols) const
{
str << "(";
json out = {
{ "_type", "ExprLambda" },
{ "body", body->toJSON(symbols) }
};
if (hasFormals()) {
str << "{ ";
bool first = true;
// the natural Symbol ordering is by creation time, which can lead to the
// same expression being printed in two different ways depending on its
// context. always use lexicographic ordering to avoid this.
for (const Formal & i : formals->lexicographicOrder(symbols)) {
if (first) first = false; else str << ", ";
str << symbols[i.name];
if (i.def) {
str << " ? ";
i.def->show(symbols, str);
}
if (i.def)
out["formals"][symbols[i.name]] = i.def->toJSON(symbols);
else
out["formals"][symbols[i.name]] = nullptr;
}
if (formals->ellipsis) {
if (!first) str << ", ";
str << "...";
}
str << " }";
if (arg) str << " @ ";
out["formalsEllipsis"] = formals->ellipsis;
}
if (arg) str << symbols[arg];
str << ": ";
body->show(symbols, str);
str << ")";
if (arg)
out["arg"] = symbols[arg];
return out;
}
void ExprCall::show(const SymbolTable & symbols, std::ostream & str) const
json ExprCall::toJSON(const SymbolTable & symbols) const
{
str << '(';
fun->show(symbols, str);
for (auto & e : args) {
str << ' ';
e->show(symbols, str);
}
str << ')';
json outArgs = json::array();
for (auto & e : args)
outArgs.push_back(e->toJSON(symbols));
return {
{"_type", "ExprCall"},
{"fun", fun->toJSON(symbols)},
{"args", outArgs}
};
}
void ExprLet::show(const SymbolTable & symbols, std::ostream & str) const
json ExprLet::toJSON(const SymbolTable & symbols) const
{
str << "(let ";
showBindings(symbols, str);
str << "in ";
body->show(symbols, str);
str << ")";
json out = {
{ "_type", "ExprLet" },
{ "body", body->toJSON(symbols) }
};
addBindingsToJSON(out, symbols);
return out;
}
void ExprWith::show(const SymbolTable & symbols, std::ostream & str) const
json ExprWith::toJSON(const SymbolTable & symbols) const
{
str << "(with ";
attrs->show(symbols, str);
str << "; ";
body->show(symbols, str);
str << ")";
return {
{"_type", "ExprWith"},
{"attrs", attrs->toJSON(symbols)},
{"body", body->toJSON(symbols)}
};
}
void ExprIf::show(const SymbolTable & symbols, std::ostream & str) const
json ExprIf::toJSON(const SymbolTable & symbols) const
{
str << "(if ";
cond->show(symbols, str);
str << " then ";
then->show(symbols, str);
str << " else ";
else_->show(symbols, str);
str << ")";
return {
{"_type", "ExprIf"},
{"cond", cond->toJSON(symbols)},
{"then", then->toJSON(symbols)},
{"else", else_->toJSON(symbols)}
};
}
void ExprAssert::show(const SymbolTable & symbols, std::ostream & str) const
json ExprAssert::toJSON(const SymbolTable & symbols) const
{
str << "assert ";
cond->show(symbols, str);
str << "; ";
body->show(symbols, str);
return {
{"_type", "ExprAssert"},
{"cond", cond->toJSON(symbols)},
{"body", body->toJSON(symbols)}
};
}
void ExprOpNot::show(const SymbolTable & symbols, std::ostream & str) const
json ExprOpNot::toJSON(const SymbolTable & symbols) const
{
str << "(! ";
e->show(symbols, str);
str << ")";
return {
{"_type", "ExprOpNot"},
{"e", e->toJSON(symbols)}
};
}
void ExprConcatStrings::show(const SymbolTable & symbols, std::ostream & str) const
json ExprConcatStrings::toJSON(const SymbolTable & symbols) const
{
bool first = true;
str << "(";
for (auto & [_pos, part] : es) {
if (first)
first = false;
else
str << " + ";
if (forceString && !dynamic_cast<ExprString *>(part.get())) {
/* Print as a string with an interpolation, to preserve the
* semantics of the value having to be a string.
* Interpolations are weird and someone should eventually
* move them out into their own AST node please.
*/
str << "\"${";
part->show(symbols, str);
str << "}\"";
} else {
part->show(symbols, str);
}
}
str << ")";
json parts = json::array();
for (auto & [_pos, part] : es)
parts.push_back(part->toJSON(symbols));
return {
{"_type", "ExprConcatStrings"},
{"forceString", forceString},
{"es", parts}
};
}
void ExprPos::show(const SymbolTable & symbols, std::ostream & str) const
json ExprPos::toJSON(const SymbolTable & symbols) const
{
str << "__curPos";
return {{ "_type", "ExprPos" }};
}
@@ -283,15 +277,24 @@ std::string showAttrPath(const SymbolTable & symbols, const AttrPath & attrPath)
if (!first) out << '.'; else first = false;
if (i.symbol)
out << symbols[i.symbol];
else {
out << "\"${";
i.expr->show(symbols, out);
out << "}\"";
}
else
out << "\"${...}\"";
}
return out.str();
}
json printAttrPathToJson(const SymbolTable & symbols, const AttrPath & attrPath)
{
json out = json::array();
for (auto & i : attrPath) {
if (i.symbol)
out.push_back(symbols[i.symbol]);
else
out.push_back(i.expr->toJSON(symbols));
}
return out;
}
/* Computing levels/displacements for variables. */
+13 -8
View File
@@ -13,8 +13,9 @@
#include "lix/libexpr/pos-table.hh"
#include "lix/libutil/strings.hh"
namespace nix {
#include <nlohmann/json.hpp>
namespace nix {
struct Env;
struct Value;
@@ -38,6 +39,7 @@ struct AttrName
typedef std::vector<AttrName> AttrPath;
std::string showAttrPath(const SymbolTable & symbols, const AttrPath & attrPath);
nlohmann::json printAttrPathToJson(const SymbolTable & symbols, const AttrPath & attrPath);
/* Abstract syntax of Nix expressions. */
@@ -59,7 +61,7 @@ public:
Expr & operator=(const Expr &) = delete;
virtual ~Expr() { };
virtual void show(const SymbolTable & symbols, std::ostream & str) const;
virtual nlohmann::json toJSON(const SymbolTable & symbols) const;
virtual void bindVars(Evaluator & es, const std::shared_ptr<const StaticEnv> & env);
virtual void eval(EvalState & state, Env & env, Value & v);
virtual Value * maybeThunk(EvalState & state, Env & env);
@@ -68,7 +70,7 @@ public:
};
#define COMMON_METHODS \
void show(const SymbolTable & symbols, std::ostream & str) const override; \
nlohmann::json toJSON(const SymbolTable & symbols) const override; \
void eval(EvalState & state, Env & env, Value & v) override; \
void bindVars(Evaluator & es, const std::shared_ptr<const StaticEnv> & env) override;
@@ -163,7 +165,7 @@ struct ExprInheritFrom : ExprVar
this->fromWith = nullptr;
}
void show(SymbolTable const & symbols, std::ostream & str) const override;
nlohmann::json toJSON(SymbolTable const & symbols) const override;
void bindVars(Evaluator & es, const std::shared_ptr<const StaticEnv> & env) override;
};
@@ -254,7 +256,7 @@ struct ExprAttrs
std::shared_ptr<const StaticEnv> bindInheritSources(
Evaluator & es, const std::shared_ptr<const StaticEnv> & env);
Env * buildInheritFromEnv(EvalState & state, Env & up);
void showBindings(const SymbolTable & symbols, std::ostream & str) const;
void addBindingsToJSON(nlohmann::json & out, const SymbolTable & symbols) const;
};
struct ExprSet : Expr, ExprAttrs {
@@ -431,9 +433,13 @@ struct ExprOpNot : Expr
std::unique_ptr<Expr> e1, e2; \
name(std::unique_ptr<Expr> e1, std::unique_ptr<Expr> e2) : e1(std::move(e1)), e2(std::move(e2)) { }; \
name(const PosIdx & pos, std::unique_ptr<Expr> e1, std::unique_ptr<Expr> e2) : pos(pos), e1(std::move(e1)), e2(std::move(e2)) { }; \
void show(const SymbolTable & symbols, std::ostream & str) const override \
nlohmann::json toJSON(const SymbolTable & symbols) const override \
{ \
str << "("; e1->show(symbols, str); str << " " s " "; e2->show(symbols, str); str << ")"; \
return { \
{"_type", #name}, \
{"e1", e1->toJSON(symbols)}, \
{"e2", e2->toJSON(symbols)} \
};\
} \
void bindVars(Evaluator & es, const std::shared_ptr<const StaticEnv> & env) override \
{ \
@@ -473,7 +479,6 @@ struct ExprPos : Expr
/* only used to mark thunks as black holes. */
struct ExprBlackHole : Expr
{
void show(const SymbolTable & symbols, std::ostream & str) const override {}
void eval(EvalState & state, Env & env, Value & v) override;
void bindVars(Evaluator & es, const std::shared_ptr<const StaticEnv> & env) override {}
};
+2
View File
@@ -53,6 +53,7 @@
util-linuxMinimal ? utillinuxMinimal,
utillinuxMinimal ? null,
xz,
yq,
busybox-sandbox-shell,
@@ -270,6 +271,7 @@ stdenv.mkDerivation (finalAttrs: {
git
mercurial
jq
yq
lsof
]
++ lib.optional hostPlatform.isLinux util-linuxMinimal
+1
View File
@@ -69,6 +69,7 @@ for i in lang/parse-okay-*.nix; do
2> "lang/$i.err"
then
sed "s!$(pwd)!/pwd!g" "lang/$i.out" "lang/$i.err"
yq --in-place --yaml-output '.' "lang/$i.out"
diffAndAccept "$i" out exp
diffAndAccept "$i" err err.exp
else
+19 -1
View File
@@ -1 +1,19 @@
({ x, y, z }: ((x + y) + z))
_type: ExprLambda
body:
_type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprVar
value: x
- _type: ExprVar
value: y
forceString: false
- _type: ExprVar
value: z
forceString: false
formals:
x: null
y: null
z: null
formalsEllipsis: false
@@ -1 +1,35 @@
(__sub (7 + (__div (__mul (__sub 0 5) 12) 3)) 1)
_type: ExprCall
args:
- _type: ExprConcatStrings
es:
- _type: ExprInt
value: 7
- _type: ExprCall
args:
- _type: ExprCall
args:
- _type: ExprCall
args:
- _type: ExprInt
value: 0
- _type: ExprInt
value: 5
fun:
_type: ExprVar
value: __sub
- _type: ExprInt
value: 12
fun:
_type: ExprVar
value: __mul
- _type: ExprInt
value: 3
fun:
_type: ExprVar
value: __div
forceString: false
- _type: ExprInt
value: 1
fun:
_type: ExprVar
value: __sub
+15 -1
View File
@@ -1 +1,15 @@
rec { foo = "multi\nline\n string\n test\r"; x = y; y = 123; z = 456; }
_type: ExprSet
attrs:
foo:
_type: ExprString
value: "multi\nline\n string\n test\r"
x:
_type: ExprVar
value: y
y:
_type: ExprInt
value: 123
z:
_type: ExprInt
value: 456
recursive: true
@@ -1 +1,17 @@
{ services = { ssh = { enable = true; port = 23; }; }; }
_type: ExprSet
attrs:
services:
_type: ExprSet
attrs:
ssh:
_type: ExprSet
attrs:
enable:
_type: ExprVar
value: 'true'
port:
_type: ExprInt
value: 23
recursive: false
recursive: false
recursive: false
@@ -1 +1,17 @@
{ services = { ssh = { enable = true; port = 23; }; }; }
_type: ExprSet
attrs:
services:
_type: ExprSet
attrs:
ssh:
_type: ExprSet
attrs:
enable:
_type: ExprVar
value: 'true'
port:
_type: ExprInt
value: 23
recursive: false
recursive: false
recursive: false
+375 -1
View File
@@ -1 +1,375 @@
(let s1 = "This is an indented multi-line string\nliteral. An amount of whitespace at\nthe start of each line matching the minimum\nindentation of all lines in the string\nliteral together will be removed. Thus,\nin this case four spaces will be\nstripped from each line, even though\n THIS LINE is indented six spaces.\n\nAlso, empty lines don't count in the\ndetermination of the indentation level (the\nprevious empty line has indentation 0, but\nit doesn't matter).\n"; s10 = ""; s11 = ""; s12 = ""; s13 = ("start on network-interfaces\n\nstart script\n\n rm -f /var/run/opengl-driver\n " + "${(if true then "ln -sf 123 /var/run/opengl-driver" else (if true then "ln -sf 456 /var/run/opengl-driver" else ""))}" + "\n\n rm -f /var/log/slim.log\n \nend script\n\nenv SLIM_CFGFILE=" + "abc" + "\nenv SLIM_THEMESDIR=" + "def" + "\nenv FONTCONFIG_FILE=/etc/fonts/fonts.conf \t\t\t\t# !!! cleanup\nenv XKB_BINDIR=" + "foo" + "/bin \t\t\t\t# Needed for the Xkb extension.\nenv LD_LIBRARY_PATH=" + "libX11" + "/lib:" + "libXext" + "/lib:/usr/lib/ # related to xorg-sys-opengl - needed to load libglx for (AI)GLX support (for compiz)\n\n" + "${(if true then ("env XORG_DRI_DRIVER_PATH=" + "nvidiaDrivers" + "/X11R6/lib/modules/drivers/") else (if true then ("env XORG_DRI_DRIVER_PATH=" + "mesa" + "/lib/modules/dri") else ""))}" + " \n\nexec " + "slim" + "/bin/slim\n"); s14 = "Escaping of ' followed by ': ''\nEscaping of $ followed by {: \${\nAnd finally to interpret \\n etc. as in a string: \n, \r, \t.\n"; s15 = (let x = "bla"; in ("foo\n'" + "${x}" + "'\nbar\n")); s16 = "cut -d $'\\t' -f 1\n"; s17 = (("ending dollar $" + "$") + "\n"); s18 = " Lines without any indentation effectively disable the indentation\n stripping for the entire string:\n\n cat >$out/foo/data <<EOF\n lasjdöaxnasd\nasdom 12398\nä\"§Æẞ¢«»”alsd\nEOF\n"; s19 = "Empty lines with a bit of whitespace don't affect the indentation calculation:\n\nAnd empty lines with more whitespace will have whitespace in the string:\n \nUnless it's the last line:\n"; s2 = "If the string starts with whitespace\n followed by a newline, it's stripped, but\n that's not the case here. Two spaces are\n stripped because of the \" \" at the start. \n"; s20 = " Indentation stripping\n must not be impressed by\nthe last line not being empty"; s21 = "\t Nor by people\n weirdly mixing tabs\n\tand spaces\n\t"; s3 = "This line is indented\na bit further.\n"; s4 = ("Anti-quotations, like " + "${(if true then "so" else "not so")}" + ", are\nalso allowed.\n"); s5 = (" The \\ is not special here.\n' can be followed by any character except another ', e.g. 'x'.\nLikewise for $, e.g. $$ or $varName.\nBut ' followed by ' is special, as is $ followed by {.\nIf you want them, use anti-quotations: " + "''" + ", " + "\${" + ".\n"); s6 = " Tabs are not interpreted as whitespace (since we can't guess\n what tab settings are intended), so don't use them.\n\tThis line starts with a space and a tab, so only one\n space will be stripped from each line.\n"; s7 = "Also note that if the last line (just before the closing ' ')\nconsists only of whitespace, it's ignored. But here there is\nsome non-whitespace stuff, so the line isn't removed. "; s8 = ("" + "\nThis shows a hacky way to preserve an empty line after the start.\nBut there's no reason to do so: you could just repeat the empty\nline.\n"); s9 = ("" + " Similarly you can force an indentation level,\n in this case to 2 spaces. This works because the anti-quote\n is significant (not whitespace).\n"); in ((((((((((((((((((((s1 + s2) + s3) + s4) + s5) + s6) + s7) + s8) + s9) + s10) + s11) + s12) + s13) + s14) + s15) + s16) + s17) + s18) + s19) + s20) + s21))
_type: ExprLet
attrs:
s1:
_type: ExprString
value: "This is an indented multi-line string\nliteral. An amount of whitespace\
\ at\nthe start of each line matching the minimum\nindentation of all lines\
\ in the string\nliteral together will be removed. Thus,\nin this case four\
\ spaces will be\nstripped from each line, even though\n THIS LINE is indented\
\ six spaces.\n\nAlso, empty lines don't count in the\ndetermination of the\
\ indentation level (the\nprevious empty line has indentation 0, but\nit doesn't\
\ matter).\n"
s10:
_type: ExprString
value: ''
s11:
_type: ExprString
value: ''
s12:
_type: ExprString
value: ''
s13:
_type: ExprConcatStrings
es:
- _type: ExprString
value: "start on network-interfaces\n\nstart script\n\n rm -f /var/run/opengl-driver\n\
\ "
- _type: ExprIf
cond:
_type: ExprVar
value: 'true'
else:
_type: ExprIf
cond:
_type: ExprVar
value: 'true'
else:
_type: ExprString
value: ''
then:
_type: ExprString
value: ln -sf 456 /var/run/opengl-driver
then:
_type: ExprString
value: ln -sf 123 /var/run/opengl-driver
- _type: ExprString
value: "\n\n rm -f /var/log/slim.log\n \nend script\n\nenv SLIM_CFGFILE="
- _type: ExprString
value: abc
- _type: ExprString
value: '
env SLIM_THEMESDIR='
- _type: ExprString
value: def
- _type: ExprString
value: "\nenv FONTCONFIG_FILE=/etc/fonts/fonts.conf \t\t\t\t# !!! cleanup\n\
env XKB_BINDIR="
- _type: ExprString
value: foo
- _type: ExprString
value: "/bin \t\t\t\t# Needed for the Xkb extension.\nenv LD_LIBRARY_PATH="
- _type: ExprString
value: libX11
- _type: ExprString
value: '/lib:'
- _type: ExprString
value: libXext
- _type: ExprString
value: '/lib:/usr/lib/ # related to xorg-sys-opengl - needed to load
libglx for (AI)GLX support (for compiz)
'
- _type: ExprIf
cond:
_type: ExprVar
value: 'true'
else:
_type: ExprIf
cond:
_type: ExprVar
value: 'true'
else:
_type: ExprString
value: ''
then:
_type: ExprConcatStrings
es:
- _type: ExprString
value: env XORG_DRI_DRIVER_PATH=
- _type: ExprString
value: mesa
- _type: ExprString
value: /lib/modules/dri
forceString: true
then:
_type: ExprConcatStrings
es:
- _type: ExprString
value: env XORG_DRI_DRIVER_PATH=
- _type: ExprString
value: nvidiaDrivers
- _type: ExprString
value: /X11R6/lib/modules/drivers/
forceString: true
- _type: ExprString
value: " \n\nexec "
- _type: ExprString
value: slim
- _type: ExprString
value: '/bin/slim
'
forceString: true
s14:
_type: ExprString
value: "Escaping of ' followed by ': ''\nEscaping of $ followed by {: ${\nAnd\
\ finally to interpret \\n etc. as in a string: \n, \r, \t.\n"
s15:
_type: ExprLet
attrs:
x:
_type: ExprString
value: bla
body:
_type: ExprConcatStrings
es:
- _type: ExprString
value: 'foo
'''
- _type: ExprVar
value: x
- _type: ExprString
value: '''
bar
'
forceString: true
s16:
_type: ExprString
value: 'cut -d $''\t'' -f 1
'
s17:
_type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprString
value: ending dollar $
- _type: ExprString
value: $
forceString: false
- _type: ExprString
value: '
'
forceString: false
s18:
_type: ExprString
value: " Lines without any indentation effectively disable the indentation\n\
\ stripping for the entire string:\n\n cat >$out/foo/data <<EOF\n\
\ lasjdöaxnasd\nasdom 12398\nä\"§Æẞ¢«»”alsd\nEOF\n"
s19:
_type: ExprString
value: "Empty lines with a bit of whitespace don't affect the indentation calculation:\n\
\nAnd empty lines with more whitespace will have whitespace in the string:\n\
\ \nUnless it's the last line:\n"
s2:
_type: ExprString
value: "If the string starts with whitespace\n followed by a newline, it's stripped,\
\ but\n that's not the case here. Two spaces are\n stripped because of the\
\ \" \" at the start. \n"
s20:
_type: ExprString
value: " Indentation stripping\n must not be impressed by\nthe last line not\
\ being empty"
s21:
_type: ExprString
value: "\t Nor by people\n weirdly mixing tabs\n\tand spaces\n\t"
s3:
_type: ExprString
value: 'This line is indented
a bit further.
'
s4:
_type: ExprConcatStrings
es:
- _type: ExprString
value: 'Anti-quotations, like '
- _type: ExprIf
cond:
_type: ExprVar
value: 'true'
else:
_type: ExprString
value: not so
then:
_type: ExprString
value: so
- _type: ExprString
value: ', are
also allowed.
'
forceString: true
s5:
_type: ExprConcatStrings
es:
- _type: ExprString
value: ' The \ is not special here.
'' can be followed by any character except another '', e.g. ''x''.
Likewise for $, e.g. $$ or $varName.
But '' followed by '' is special, as is $ followed by {.
If you want them, use anti-quotations: '
- _type: ExprString
value: ''''''
- _type: ExprString
value: ', '
- _type: ExprString
value: ${
- _type: ExprString
value: '.
'
forceString: true
s6:
_type: ExprString
value: " Tabs are not interpreted as whitespace (since we can't guess\n what\
\ tab settings are intended), so don't use them.\n\tThis line starts with a\
\ space and a tab, so only one\n space will be stripped from each line.\n"
s7:
_type: ExprString
value: 'Also note that if the last line (just before the closing '' '')
consists only of whitespace, it''s ignored. But here there is
some non-whitespace stuff, so the line isn''t removed. '
s8:
_type: ExprConcatStrings
es:
- _type: ExprString
value: ''
- _type: ExprString
value: '
This shows a hacky way to preserve an empty line after the start.
But there''s no reason to do so: you could just repeat the empty
line.
'
forceString: true
s9:
_type: ExprConcatStrings
es:
- _type: ExprString
value: ''
- _type: ExprString
value: " Similarly you can force an indentation level,\n in this case to\
\ 2 spaces. This works because the anti-quote\n is significant (not whitespace).\n"
forceString: true
body:
_type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprVar
value: s1
- _type: ExprVar
value: s2
forceString: false
- _type: ExprVar
value: s3
forceString: false
- _type: ExprVar
value: s4
forceString: false
- _type: ExprVar
value: s5
forceString: false
- _type: ExprVar
value: s6
forceString: false
- _type: ExprVar
value: s7
forceString: false
- _type: ExprVar
value: s8
forceString: false
- _type: ExprVar
value: s9
forceString: false
- _type: ExprVar
value: s10
forceString: false
- _type: ExprVar
value: s11
forceString: false
- _type: ExprVar
value: s12
forceString: false
- _type: ExprVar
value: s13
forceString: false
- _type: ExprVar
value: s14
forceString: false
- _type: ExprVar
value: s15
forceString: false
- _type: ExprVar
value: s16
forceString: false
- _type: ExprVar
value: s17
forceString: false
- _type: ExprVar
value: s18
forceString: false
- _type: ExprVar
value: s19
forceString: false
- _type: ExprVar
value: s20
forceString: false
- _type: ExprVar
value: s21
forceString: false
+29 -1
View File
@@ -1 +1,29 @@
(let b = 2; c = { }; in { inherit b; inherit (c) d e; a = 1; f = 3; })
_type: ExprLet
attrs:
b:
_type: ExprInt
value: 2
c:
_type: ExprSet
recursive: false
body:
_type: ExprSet
attrs:
a:
_type: ExprInt
value: 1
f:
_type: ExprInt
value: 3
inherit:
b:
_type: ExprVar
value: b
inheritFrom:
- attrs:
- d
- e
from:
_type: ExprVar
value: c
recursive: false
+556
View File
@@ -0,0 +1,556 @@
_type: ExprWith
attrs:
_type: ExprSet
recursive: false
body:
_type: ExprList
elems:
- _type: ExprInt
value: 0
- _type: ExprFloat
value: 0.0
- _type: ExprString
value: ''
- _type: ExprString
value: foo
- _type: ExprString
value: 'foo
bar'
- _type: ExprPath
value: /root
- _type: ExprVar
value: var1
- _type: ExprSelect
attrs:
- bar
default:
_type: ExprVar
value: baz
e:
_type: ExprVar
value: foo
- _type: ExprOpHasAttr
attrs:
- bar
- baz
e:
_type: ExprVar
value: foo
- _type: ExprSet
recursive: false
- _type: ExprSet
recursive: true
- _type: ExprSet
attrs:
attr1:
_type: ExprVar
value: value1
attr2:
_type: ExprVar
value: 'null'
attr3:
_type: ExprSet
attrs:
nested:
_type: ExprSet
attrs:
merged:
_type: ExprInt
value: 1
more:
_type: ExprInt
value: 0
recursive: false
recursive: false
fake dynamic attr:
_type: ExprInt
value: 42
string attr:
_type: ExprString
value: string value
dynamicAttrs:
- name:
_type: ExprVar
value: dynamicAttr
value:
_type: ExprSet
dynamicAttrs:
- name:
_type: ExprConcatStrings
es:
- _type: ExprString
value: anotherOne
- _type: ExprString
value: ''
forceString: false
value:
_type: ExprVar
value: 'null'
recursive: false
inherit:
foo:
_type: ExprVar
value: foo
inheritFrom:
- attrs:
- baz
from:
_type: ExprVar
value: bar
- attrs:
- thing
from:
_type: ExprCall
args:
- _type: ExprList
elems:
- _type: ExprVar
value: expression
fun:
_type: ExprVar
value: complicated
recursive: false
- _type: ExprSet
attrs:
attr1:
_type: ExprVar
value: value1
attr2:
_type: ExprVar
value: 'null'
attr3:
_type: ExprSet
attrs:
nested:
_type: ExprSet
attrs:
merged:
_type: ExprInt
value: 1
more:
_type: ExprInt
value: 0
recursive: false
recursive: false
fake dynamic attr:
_type: ExprInt
value: 42
string attr:
_type: ExprString
value: string value
dynamicAttrs:
- name:
_type: ExprVar
value: dynamicAttr
value:
_type: ExprSet
dynamicAttrs:
- name:
_type: ExprConcatStrings
es:
- _type: ExprString
value: anotherOne
- _type: ExprString
value: ''
forceString: false
value:
_type: ExprVar
value: 'null'
recursive: false
inherit:
foo:
_type: ExprVar
value: foo
inheritFrom:
- attrs:
- baz
from:
_type: ExprVar
value: bar
- attrs:
- thing
from:
_type: ExprCall
args:
- _type: ExprList
elems:
- _type: ExprVar
value: expression
fun:
_type: ExprVar
value: complicated
recursive: true
- _type: ExprLet
body:
_type: ExprLet
attrs:
attr1:
_type: ExprVar
value: value1
attr2:
_type: ExprVar
value: 'null'
attr3:
_type: ExprSet
attrs:
nested:
_type: ExprSet
attrs:
merged:
_type: ExprInt
value: 1
more:
_type: ExprInt
value: 0
recursive: false
recursive: false
fake dynamic attr:
_type: ExprInt
value: 42
string attr:
_type: ExprString
value: string value
body:
_type: ExprAssert
body:
_type: ExprAssert
body:
_type: ExprAssert
body:
_type: ExprList
elems: []
cond:
_type: ExprLet
body:
_type: ExprOpEq
e1:
_type: ExprCall
args:
- _type: ExprSelect
attrs:
- overrideStuff
e:
_type: ExprSet
recursive: false
fun:
_type: ExprVar
value: myFunction
e2:
_type: ExprFloat
value: 4.2
cond:
_type: ExprVar
value: 'true'
cond:
_type: ExprVar
value: 'false'
inherit:
foo:
_type: ExprVar
value: foo
inheritFrom:
- attrs:
- baz
from:
_type: ExprVar
value: bar
- attrs:
- thing
from:
_type: ExprCall
args:
- _type: ExprList
elems:
- _type: ExprVar
value: expression
fun:
_type: ExprVar
value: complicated
- _type: ExprLambda
arg: x
body:
_type: ExprVar
value: x
- _type: ExprLambda
arg: x
body:
_type: ExprLambda
arg: y
body:
_type: ExprLambda
arg: z
body:
_type: ExprCall
args:
- _type: ExprVar
value: y
- _type: ExprVar
value: x
fun:
_type: ExprVar
value: z
- _type: ExprLambda
body:
_type: ExprVar
value: 'null'
formalsEllipsis: false
- _type: ExprLambda
body:
_type: ExprVar
value: 'null'
formalsEllipsis: true
- _type: ExprLambda
arg: arg
body:
_type: ExprVar
value: 'null'
formalsEllipsis: false
- _type: ExprLambda
arg: all
body:
_type: ExprVar
value: all
formals:
bar: null
baz: null
foo:
_type: ExprVar
value: 'null'
formalsEllipsis: false
- _type: ExprLambda
arg: all
body:
_type: ExprVar
value: all
formals:
foo:
_type: ExprVar
value: 'null'
formalsEllipsis: true
- _type: ExprIf
cond:
_type: ExprVar
value: 'null'
else:
_type: ExprInt
value: 1
then:
_type: ExprInt
value: 0
- _type: ExprOpNot
e:
_type: ExprVar
value: 'true'
- _type: ExprCall
args:
- _type: ExprConcatStrings
es:
- _type: ExprInt
value: 7
- _type: ExprCall
args:
- _type: ExprCall
args:
- _type: ExprCall
args:
- _type: ExprInt
value: 0
- _type: ExprInt
value: 5
fun:
_type: ExprVar
value: __sub
- _type: ExprInt
value: 12
fun:
_type: ExprVar
value: __mul
- _type: ExprInt
value: 3
fun:
_type: ExprVar
value: __div
forceString: false
- _type: ExprInt
value: 1
fun:
_type: ExprVar
value: __sub
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprInt
value: 0
- _type: ExprCall
args:
- _type: ExprInt
value: 0
- _type: ExprInt
value: 10
fun:
_type: ExprVar
value: __sub
forceString: false
- _type: ExprCall
args:
- _type: ExprInt
value: 0
- _type: ExprCall
args:
- _type: ExprInt
value: 0
- _type: ExprInt
value: 11
fun:
_type: ExprVar
value: __sub
fun:
_type: ExprVar
value: __sub
forceString: false
- _type: ExprCall
args:
- _type: ExprInt
value: 0
- _type: ExprVar
value: x
fun:
_type: ExprVar
value: __sub
forceString: false
- _type: ExprIf
cond:
_type: ExprOpImpl
e1:
_type: ExprOpEq
e1:
_type: ExprCall
args:
- _type: ExprInt
value: 1
- _type: ExprInt
value: 2
fun:
_type: ExprVar
value: __lessThan
e2:
_type: ExprCall
args:
- _type: ExprInt
value: 1
- _type: ExprInt
value: 2
fun:
_type: ExprVar
value: __lessThan
e2:
_type: ExprOpOr
e1:
_type: ExprOpAnd
e1:
_type: ExprOpNEq
e1:
_type: ExprOpNot
e:
_type: ExprCall
args:
- _type: ExprInt
value: 2
- _type: ExprInt
value: 1
fun:
_type: ExprVar
value: __lessThan
e2:
_type: ExprOpNot
e:
_type: ExprCall
args:
- _type: ExprInt
value: 2
- _type: ExprInt
value: 1
fun:
_type: ExprVar
value: __lessThan
e2:
_type: ExprVar
value: 'true'
e2:
_type: ExprVar
value: 'false'
else:
_type: ExprVar
value: err
then:
_type: ExprInt
value: 1
- _type: ExprOpUpdate
e1:
_type: ExprVar
value: foo
e2:
_type: ExprOpUpdate
e1:
_type: ExprSet
recursive: false
e2:
_type: ExprSelect
attrs:
- baz
e:
_type: ExprVar
value: bar
- _type: ExprOpConcatLists
e1:
_type: ExprVar
value: foo
e2:
_type: ExprOpConcatLists
e1:
_type: ExprList
elems: []
e2:
_type: ExprCall
args:
- _type: ExprVar
value: cond
- _type: ExprVar
value: value
fun:
_type: ExprVar
value: optional
- _type: ExprConcatStrings
es:
- _type: ExprConcatStrings
es:
- _type: ExprInt
value: 1
- _type: ExprInt
value: 2
forceString: false
- _type: ExprInt
value: 3
forceString: false
- _type: ExprConcatStrings
es:
- _type: ExprString
value: ''
forceString: true
- _type: ExprConcatStrings
es:
- _type: ExprString
value: 'Foo '
- _type: ExprConcatStrings
es:
- _type: ExprInt
value: 3
- _type: ExprString
value: '2'
forceString: false
forceString: true
- _type: ExprPos
+99
View File
@@ -0,0 +1,99 @@
# File which contains all possible syntax constructs in order to fully test the JSON output from `nix-instantiate --parse`
# ExprWith
with {};
# ExprList
[
# ExprInt
0
# ExprFloat
0.0
# ExprString
""
"foo"
"foo\nbar"
# ExprPath
/root
# ExprVar
var1
# ExprSelect
foo.bar or baz
# ExprOpHasAttr
(foo ? bar.baz)
# ExprSet (ExprAttrs, ExprInheritFrom, ...)
{ }
rec { }
{
attr1 = value1;
attr2 = null;
inherit foo;
inherit (bar) baz;
inherit (complicated [ expression ]) thing;
inherit;
"string attr" = "string value";
${"fake dynamic attr"} = 42;
${dynamicAttr}.${"anotherOne" + ""} = null;
attr3.nested = { more = 0; };
attr3.nested.merged = 1;
}
rec {
attr1 = value1;
attr2 = null;
inherit foo;
inherit (bar) baz;
inherit (complicated [ expression ]) thing;
inherit;
"string attr" = "string value";
${"fake dynamic attr"} = 42;
${dynamicAttr}.${"anotherOne" + ""} = null;
attr3.nested = { more = 0; };
attr3.nested.merged = 1;
}
(
# ExprLet
let in
let
attr1 = value1;
attr2 = null;
inherit foo;
inherit (bar) baz;
inherit (complicated [ expression ]) thing;
inherit;
"string attr" = "string value";
${"fake dynamic attr"} = 42;
attr3.nested = { more = 0; };
attr3.nested.merged = 1;
in
# ExprAssert
assert false;
assert true;
assert let in (myFunction {}.overrideStuff) == 4.2;
[ ]
)
# ExprLambda
(x: x)
(x: y: z: z y x)
({}: null)
({...}: null)
({}@arg: null)
({foo ? null, bar, baz}@all: all)
(all@{foo ? null, ...}: all)
# ExprIf
(if null then 0 else 1)
# ExprOpNot
(!true)
# ExprOpEq, ExprOpNEq, ExprOpAnd, ExprOpOr, ExprOpImpl, and general arithmetic
(7 + (-5) * 12 / 3 - 1)
(0 + -10 + -(-11) + -x)
(if 2 > 1 == 1 < 2 -> 2 >= 1 != 1 <= 2 && true || false then 1 else err)
# ExprOpUpdate
(foo // {} // bar.baz)
# ExprOpConcatLists
(foo ++ [] ++ optional cond value)
# ExprConcatStrings
(1 + 2 + 3)
"${""}"
"Foo ${3 + "2"}"
# ExprPos
__curPos
]
@@ -1 +1,16 @@
{ x = { q = 3; y = 3; z = 3; }; }
_type: ExprSet
attrs:
x:
_type: ExprSet
attrs:
q:
_type: ExprInt
value: 3
y:
_type: ExprInt
value: 3
z:
_type: ExprInt
value: 3
recursive: false
recursive: false
@@ -1 +1,16 @@
{ x = { q = 3; y = 3; z = 3; }; }
_type: ExprSet
attrs:
x:
_type: ExprSet
attrs:
q:
_type: ExprInt
value: 3
y:
_type: ExprInt
value: 3
z:
_type: ExprInt
value: 3
recursive: false
recursive: false
@@ -1 +1,24 @@
{ services = { httpd = { enable = true; }; ssh = { enable = true; port = 123; }; }; }
_type: ExprSet
attrs:
services:
_type: ExprSet
attrs:
httpd:
_type: ExprSet
attrs:
enable:
_type: ExprVar
value: 'true'
recursive: false
ssh:
_type: ExprSet
attrs:
enable:
_type: ExprVar
value: 'true'
port:
_type: ExprInt
value: 123
recursive: false
recursive: false
recursive: false
@@ -1 +1,38 @@
[ ({ a = rec { __overrides = { }; }; }) (rec { __overrides = { }; }) ({ __overrides = { }; }) (rec { "${("__overrides" + "")}" = { }; }) ]
_type: ExprList
elems:
- _type: ExprSet
attrs:
a:
_type: ExprSet
attrs:
__overrides:
_type: ExprSet
recursive: false
recursive: true
recursive: false
- _type: ExprSet
attrs:
__overrides:
_type: ExprSet
recursive: false
recursive: true
- _type: ExprSet
attrs:
__overrides:
_type: ExprSet
recursive: false
recursive: false
- _type: ExprSet
dynamicAttrs:
- name:
_type: ExprConcatStrings
es:
- _type: ExprString
value: __overrides
- _type: ExprString
value: ''
forceString: false
value:
_type: ExprSet
recursive: false
recursive: true
@@ -1 +1,36 @@
({ fetchurl, stdenv }: ((stdenv).mkDerivation { name = "libXi-6.0.1"; src = (fetchurl { md5 = "7e935a42428d63a387b3c048be0f2756"; url = "http://freedesktop.org/~xlibs/release/libXi-6.0.1.tar.bz2"; }); }))
_type: ExprLambda
body:
_type: ExprCall
args:
- _type: ExprSet
attrs:
name:
_type: ExprString
value: libXi-6.0.1
src:
_type: ExprCall
args:
- _type: ExprSet
attrs:
md5:
_type: ExprString
value: 7e935a42428d63a387b3c048be0f2756
url:
_type: ExprString
value: http://freedesktop.org/~xlibs/release/libXi-6.0.1.tar.bz2
recursive: false
fun:
_type: ExprVar
value: fetchurl
recursive: false
fun:
_type: ExprSelect
attrs:
- mkDerivation
e:
_type: ExprVar
value: stdenv
formals:
fetchurl: null
stdenv: null
formalsEllipsis: false
@@ -1 +1,23 @@
(let const = (a: "const"); in ("${(const { x = "q"; })}"))
_type: ExprLet
attrs:
const:
_type: ExprLambda
arg: a
body:
_type: ExprString
value: const
body:
_type: ExprConcatStrings
es:
- _type: ExprCall
args:
- _type: ExprSet
attrs:
x:
_type: ExprString
value: q
recursive: false
fun:
_type: ExprVar
value: const
forceString: true
+346 -1
View File
@@ -1 +1,346 @@
({ db4 ? null, expat, fetchurl, httpServer ? false, httpd ? null, j2sdk ? null, javaSwigBindings ? false, javahlBindings ? false, localServer ? false, openssl ? null, pythonBindings ? false, sslSupport ? false, stdenv, swig ? null }: assert (expat != null); assert (localServer -> (db4 != null)); assert (httpServer -> ((httpd != null) && ((httpd).expat == expat))); assert (sslSupport -> ((openssl != null) && (httpServer -> ((httpd).openssl == openssl)))); assert (pythonBindings -> ((swig != null) && (swig).pythonSupport)); assert (javaSwigBindings -> ((swig != null) && (swig).javaSupport)); assert (javahlBindings -> (j2sdk != null)); ((stdenv).mkDerivation { inherit expat httpServer javaSwigBindings javahlBindings localServer pythonBindings sslSupport; builder = /foo/bar; db4 = (if localServer then db4 else null); httpd = (if httpServer then httpd else null); j2sdk = (if javaSwigBindings then (swig).j2sdk else (if javahlBindings then j2sdk else null)); name = "subversion-1.1.1"; openssl = (if sslSupport then openssl else null); patches = (if javahlBindings then [ (/javahl.patch) ] else [ ]); python = (if pythonBindings then (swig).python else null); src = (fetchurl { md5 = "a180c3fe91680389c210c99def54d9e0"; url = "http://subversion.tigris.org/tarballs/subversion-1.1.1.tar.bz2"; }); swig = (if (pythonBindings || javaSwigBindings) then swig else null); }))
_type: ExprLambda
body:
_type: ExprAssert
body:
_type: ExprAssert
body:
_type: ExprAssert
body:
_type: ExprAssert
body:
_type: ExprAssert
body:
_type: ExprAssert
body:
_type: ExprAssert
body:
_type: ExprCall
args:
- _type: ExprSet
attrs:
builder:
_type: ExprPath
value: /foo/bar
db4:
_type: ExprIf
cond:
_type: ExprVar
value: localServer
else:
_type: ExprVar
value: 'null'
then:
_type: ExprVar
value: db4
httpd:
_type: ExprIf
cond:
_type: ExprVar
value: httpServer
else:
_type: ExprVar
value: 'null'
then:
_type: ExprVar
value: httpd
j2sdk:
_type: ExprIf
cond:
_type: ExprVar
value: javaSwigBindings
else:
_type: ExprIf
cond:
_type: ExprVar
value: javahlBindings
else:
_type: ExprVar
value: 'null'
then:
_type: ExprVar
value: j2sdk
then:
_type: ExprSelect
attrs:
- j2sdk
e:
_type: ExprVar
value: swig
name:
_type: ExprString
value: subversion-1.1.1
openssl:
_type: ExprIf
cond:
_type: ExprVar
value: sslSupport
else:
_type: ExprVar
value: 'null'
then:
_type: ExprVar
value: openssl
patches:
_type: ExprIf
cond:
_type: ExprVar
value: javahlBindings
else:
_type: ExprList
elems: []
then:
_type: ExprList
elems:
- _type: ExprPath
value: /javahl.patch
python:
_type: ExprIf
cond:
_type: ExprVar
value: pythonBindings
else:
_type: ExprVar
value: 'null'
then:
_type: ExprSelect
attrs:
- python
e:
_type: ExprVar
value: swig
src:
_type: ExprCall
args:
- _type: ExprSet
attrs:
md5:
_type: ExprString
value: a180c3fe91680389c210c99def54d9e0
url:
_type: ExprString
value: http://subversion.tigris.org/tarballs/subversion-1.1.1.tar.bz2
recursive: false
fun:
_type: ExprVar
value: fetchurl
swig:
_type: ExprIf
cond:
_type: ExprOpOr
e1:
_type: ExprVar
value: pythonBindings
e2:
_type: ExprVar
value: javaSwigBindings
else:
_type: ExprVar
value: 'null'
then:
_type: ExprVar
value: swig
inherit:
expat:
_type: ExprVar
value: expat
httpServer:
_type: ExprVar
value: httpServer
javaSwigBindings:
_type: ExprVar
value: javaSwigBindings
javahlBindings:
_type: ExprVar
value: javahlBindings
localServer:
_type: ExprVar
value: localServer
pythonBindings:
_type: ExprVar
value: pythonBindings
sslSupport:
_type: ExprVar
value: sslSupport
recursive: false
fun:
_type: ExprSelect
attrs:
- mkDerivation
e:
_type: ExprVar
value: stdenv
cond:
_type: ExprOpImpl
e1:
_type: ExprVar
value: javahlBindings
e2:
_type: ExprOpNEq
e1:
_type: ExprVar
value: j2sdk
e2:
_type: ExprVar
value: 'null'
cond:
_type: ExprOpImpl
e1:
_type: ExprVar
value: javaSwigBindings
e2:
_type: ExprOpAnd
e1:
_type: ExprOpNEq
e1:
_type: ExprVar
value: swig
e2:
_type: ExprVar
value: 'null'
e2:
_type: ExprSelect
attrs:
- javaSupport
e:
_type: ExprVar
value: swig
cond:
_type: ExprOpImpl
e1:
_type: ExprVar
value: pythonBindings
e2:
_type: ExprOpAnd
e1:
_type: ExprOpNEq
e1:
_type: ExprVar
value: swig
e2:
_type: ExprVar
value: 'null'
e2:
_type: ExprSelect
attrs:
- pythonSupport
e:
_type: ExprVar
value: swig
cond:
_type: ExprOpImpl
e1:
_type: ExprVar
value: sslSupport
e2:
_type: ExprOpAnd
e1:
_type: ExprOpNEq
e1:
_type: ExprVar
value: openssl
e2:
_type: ExprVar
value: 'null'
e2:
_type: ExprOpImpl
e1:
_type: ExprVar
value: httpServer
e2:
_type: ExprOpEq
e1:
_type: ExprSelect
attrs:
- openssl
e:
_type: ExprVar
value: httpd
e2:
_type: ExprVar
value: openssl
cond:
_type: ExprOpImpl
e1:
_type: ExprVar
value: httpServer
e2:
_type: ExprOpAnd
e1:
_type: ExprOpNEq
e1:
_type: ExprVar
value: httpd
e2:
_type: ExprVar
value: 'null'
e2:
_type: ExprOpEq
e1:
_type: ExprSelect
attrs:
- expat
e:
_type: ExprVar
value: httpd
e2:
_type: ExprVar
value: expat
cond:
_type: ExprOpImpl
e1:
_type: ExprVar
value: localServer
e2:
_type: ExprOpNEq
e1:
_type: ExprVar
value: db4
e2:
_type: ExprVar
value: 'null'
cond:
_type: ExprOpNEq
e1:
_type: ExprVar
value: expat
e2:
_type: ExprVar
value: 'null'
formals:
db4:
_type: ExprVar
value: 'null'
expat: null
fetchurl: null
httpServer:
_type: ExprVar
value: 'false'
httpd:
_type: ExprVar
value: 'null'
j2sdk:
_type: ExprVar
value: 'null'
javaSwigBindings:
_type: ExprVar
value: 'false'
javahlBindings:
_type: ExprVar
value: 'false'
localServer:
_type: ExprVar
value: 'false'
openssl:
_type: ExprVar
value: 'null'
pythonBindings:
_type: ExprVar
value: 'false'
sslSupport:
_type: ExprVar
value: 'false'
stdenv: null
swig:
_type: ExprVar
value: 'null'
formalsEllipsis: false
+16 -1
View File
@@ -1 +1,16 @@
[ ("x:x") ("https://svn.cs.uu.nl:12443/repos/trace/trunk") ("http://www2.mplayerhq.hu/MPlayer/releases/fonts/font-arial-iso-8859-1.tar.bz2") ("http://losser.st-lab.cs.uu.nl/~armijn/.nix/gcc-3.3.4-static-nix.tar.gz") ("http://fpdownload.macromedia.com/get/shockwave/flash/english/linux/7.0r25/install_flash_player_7_linux.tar.gz") ("https://ftp5.gwdg.de/pub/linux/archlinux/extra/os/x86_64/unzip-6.0-14-x86_64.pkg.tar.zst") ("ftp://ftp.gtk.org/pub/gtk/v1.2/gtk+-1.2.10.tar.gz") ]
_type: ExprList
elems:
- _type: ExprString
value: x:x
- _type: ExprString
value: https://svn.cs.uu.nl:12443/repos/trace/trunk
- _type: ExprString
value: http://www2.mplayerhq.hu/MPlayer/releases/fonts/font-arial-iso-8859-1.tar.bz2
- _type: ExprString
value: http://losser.st-lab.cs.uu.nl/~armijn/.nix/gcc-3.3.4-static-nix.tar.gz
- _type: ExprString
value: http://fpdownload.macromedia.com/get/shockwave/flash/english/linux/7.0r25/install_flash_player_7_linux.tar.gz
- _type: ExprString
value: https://ftp5.gwdg.de/pub/linux/archlinux/extra/os/x86_64/unzip-6.0-14-x86_64.pkg.tar.zst
- _type: ExprString
value: ftp://ftp.gtk.org/pub/gtk/v1.2/gtk+-1.2.10.tar.gz
-1
View File
@@ -201,7 +201,6 @@ libexpr_tests_sources = files(
'libexpr/primops.cc',
'libexpr/search-path.cc',
'libexpr/trivial.cc',
'libexpr/expr-print.cc',
'libexpr/value/context.cc',
'libexpr/value/print.cc',
)