2003-11-18 13:06:07 +01:00
|
|
|
#ifndef __NIXEXPR_H
|
|
|
|
#define __NIXEXPR_H
|
2003-10-30 17:11:24 +01:00
|
|
|
|
2003-10-31 18:09:31 +01:00
|
|
|
#include <map>
|
|
|
|
|
2006-05-04 14:21:08 +02:00
|
|
|
#include "aterm-map.hh"
|
2006-09-04 23:06:23 +02:00
|
|
|
#include "types.hh"
|
|
|
|
|
|
|
|
|
|
|
|
namespace nix {
|
2003-10-30 17:11:24 +01:00
|
|
|
|
|
|
|
|
2006-07-19 17:36:15 +02:00
|
|
|
MakeError(EvalError, Error)
|
|
|
|
MakeError(AssertionError, EvalError)
|
2007-04-16 17:03:19 +02:00
|
|
|
MakeError(ThrownError, AssertionError)
|
2006-08-23 17:46:00 +02:00
|
|
|
MakeError(Abort, EvalError)
|
2006-07-19 17:36:15 +02:00
|
|
|
MakeError(TypeError, EvalError)
|
|
|
|
|
|
|
|
|
2003-11-18 13:06:07 +01:00
|
|
|
/* Nix expressions are represented as ATerms. The maximal sharing
|
2003-10-30 17:11:24 +01:00
|
|
|
property of the ATerm library allows us to implement caching of
|
|
|
|
normals forms efficiently. */
|
|
|
|
typedef ATerm Expr;
|
2006-07-24 17:16:03 +02:00
|
|
|
typedef ATerm DefaultValue;
|
2004-10-27 00:54:26 +02:00
|
|
|
typedef ATerm Pos;
|
2008-08-14 12:04:22 +02:00
|
|
|
typedef ATerm Pattern;
|
2008-08-14 16:00:44 +02:00
|
|
|
typedef ATerm ATermBool;
|
2004-10-27 00:54:26 +02:00
|
|
|
|
2003-10-30 17:11:24 +01:00
|
|
|
|
2004-08-04 12:59:20 +02:00
|
|
|
/* A STL vector of ATerms. Should be used with great care since it's
|
|
|
|
stored on the heap, and the elements are therefore not roots to the
|
|
|
|
ATerm garbage collector. */
|
|
|
|
typedef vector<ATerm> ATermVector;
|
|
|
|
|
|
|
|
|
2006-05-02 23:39:02 +02:00
|
|
|
/* A substitution is a linked list of ATermMaps that map names to
|
|
|
|
identifiers. We use a list of ATermMaps rather than a single to
|
|
|
|
make it easy to grow or shrink a substitution when entering a
|
|
|
|
scope. */
|
|
|
|
struct Substitution
|
|
|
|
{
|
|
|
|
ATermMap * map;
|
|
|
|
const Substitution * prev;
|
|
|
|
|
|
|
|
Substitution(const Substitution * prev, ATermMap * map)
|
|
|
|
{
|
|
|
|
this->prev = prev;
|
|
|
|
this->map = map;
|
|
|
|
}
|
|
|
|
|
|
|
|
Expr lookup(Expr name) const
|
|
|
|
{
|
|
|
|
Expr x;
|
|
|
|
for (const Substitution * s(this); s; s = s->prev)
|
2006-08-04 19:07:13 +02:00
|
|
|
if ((x = s->map->get(name))) return x;
|
2006-05-02 23:39:02 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2004-04-06 00:27:41 +02:00
|
|
|
/* Show a position. */
|
|
|
|
string showPos(ATerm pos);
|
|
|
|
|
2003-10-30 17:11:24 +01:00
|
|
|
/* Generic bottomup traversal over ATerms. The traversal first
|
|
|
|
recursively descends into subterms, and then applies the given term
|
|
|
|
function to the resulting term. */
|
|
|
|
struct TermFun
|
|
|
|
{
|
2006-09-20 18:36:29 +02:00
|
|
|
virtual ~TermFun() { }
|
2003-10-30 17:11:24 +01:00
|
|
|
virtual ATerm operator () (ATerm e) = 0;
|
|
|
|
};
|
|
|
|
ATerm bottomupRewrite(TermFun & f, ATerm e);
|
|
|
|
|
2006-10-16 17:55:34 +02:00
|
|
|
|
2003-10-31 18:09:31 +01:00
|
|
|
/* Query all attributes in an attribute set expression. The
|
|
|
|
expression must be in normal form. */
|
2004-04-06 00:27:41 +02:00
|
|
|
void queryAllAttrs(Expr e, ATermMap & attrs, bool withPos = false);
|
2003-10-31 18:09:31 +01:00
|
|
|
|
|
|
|
/* Query a specific attribute from an attribute set expression. The
|
|
|
|
expression must be in normal form. */
|
|
|
|
Expr queryAttr(Expr e, const string & name);
|
2004-04-06 00:27:41 +02:00
|
|
|
Expr queryAttr(Expr e, const string & name, ATerm & pos);
|
2003-10-31 18:09:31 +01:00
|
|
|
|
|
|
|
/* Create an attribute set expression from an Attrs value. */
|
2003-11-03 21:30:40 +01:00
|
|
|
Expr makeAttrs(const ATermMap & attrs);
|
2003-10-31 18:09:31 +01:00
|
|
|
|
2006-10-16 17:55:34 +02:00
|
|
|
|
2003-10-31 18:09:31 +01:00
|
|
|
/* Perform a set of substitutions on an expression. */
|
2006-05-02 23:39:02 +02:00
|
|
|
Expr substitute(const Substitution & subs, Expr e);
|
2003-10-31 18:09:31 +01:00
|
|
|
|
2006-10-16 17:55:34 +02:00
|
|
|
|
2004-02-03 15:45:34 +01:00
|
|
|
/* Check whether all variables are defined in the given expression.
|
|
|
|
Throw an exception if this isn't the case. */
|
|
|
|
void checkVarDefs(const ATermMap & def, Expr e);
|
|
|
|
|
2006-10-16 17:55:34 +02:00
|
|
|
|
2007-01-13 17:17:07 +01:00
|
|
|
/* Canonicalise a Nix expression by sorting attributes and removing
|
|
|
|
location information. */
|
2007-02-02 02:52:42 +01:00
|
|
|
Expr canonicaliseExpr(Expr e);
|
2007-01-13 17:17:07 +01:00
|
|
|
|
|
|
|
|
2003-11-05 17:27:40 +01:00
|
|
|
/* Create an expression representing a boolean. */
|
|
|
|
Expr makeBool(bool b);
|
|
|
|
|
2006-10-16 17:55:34 +02:00
|
|
|
|
|
|
|
/* Manipulation of Str() nodes. Note: matchStr() does not clear
|
|
|
|
context! */
|
|
|
|
bool matchStr(Expr e, string & s, PathSet & context);
|
|
|
|
|
|
|
|
Expr makeStr(const string & s, const PathSet & context = PathSet());
|
|
|
|
|
|
|
|
|
|
|
|
/* Showing types, values. */
|
2006-07-19 17:36:15 +02:00
|
|
|
string showType(Expr e);
|
|
|
|
|
2006-07-28 16:01:29 +02:00
|
|
|
string showValue(Expr e);
|
|
|
|
|
2006-09-04 23:06:23 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2003-10-30 17:11:24 +01:00
|
|
|
|
2003-11-18 13:06:07 +01:00
|
|
|
#endif /* !__NIXEXPR_H */
|