* Refactoring: move parseExprFromFile() and parseExprFromString() into
the EvalState class.
This commit is contained in:
		
							parent
							
								
									c8606664ab
								
							
						
					
					
						commit
						54945a2950
					
				
					 10 changed files with 37 additions and 52 deletions
				
			
		| 
						 | 
				
			
			@ -6,7 +6,7 @@ libexpr_la_SOURCES = \
 | 
			
		|||
 names.cc
 | 
			
		||||
 | 
			
		||||
pkginclude_HEADERS = \
 | 
			
		||||
 nixexpr.hh eval.hh parser.hh lexer-tab.hh parser-tab.hh \
 | 
			
		||||
 nixexpr.hh eval.hh lexer-tab.hh parser-tab.hh \
 | 
			
		||||
 get-drvs.hh attr-path.hh value-to-xml.hh common-opts.hh \
 | 
			
		||||
 names.hh symbol-table.hh
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,6 @@
 | 
			
		|||
#include "common-opts.hh"
 | 
			
		||||
#include "../libmain/shared.hh"
 | 
			
		||||
#include "util.hh"
 | 
			
		||||
#include "parser.hh"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace nix {
 | 
			
		||||
| 
						 | 
				
			
			@ -25,7 +24,7 @@ bool parseOptionArg(const string & arg, Strings::iterator & i,
 | 
			
		|||
    autoArgs.push_back(Attr(state.symbols.create(name), v));
 | 
			
		||||
 | 
			
		||||
    if (arg == "--arg")
 | 
			
		||||
        state.mkThunk_(*v, parseExprFromString(state, value, absPath(".")));
 | 
			
		||||
        state.mkThunk_(*v, state.parseExprFromString(value, absPath(".")));
 | 
			
		||||
    else
 | 
			
		||||
        mkString(*v, value);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,4 @@
 | 
			
		|||
#include "eval.hh"
 | 
			
		||||
#include "parser.hh"
 | 
			
		||||
#include "hash.hh"
 | 
			
		||||
#include "util.hh"
 | 
			
		||||
#include "store-api.hh"
 | 
			
		||||
| 
						 | 
				
			
			@ -427,14 +426,10 @@ void EvalState::evalFile(const Path & path, Value & v)
 | 
			
		|||
{
 | 
			
		||||
    startNest(nest, lvlTalkative, format("evaluating file `%1%'") % path);
 | 
			
		||||
 | 
			
		||||
    Expr * e = parseTrees[path];
 | 
			
		||||
 | 
			
		||||
    if (!e) {
 | 
			
		||||
        e = parseExprFromFile(*this, path);
 | 
			
		||||
        parseTrees[path] = e;
 | 
			
		||||
    }
 | 
			
		||||
    Expr * e = parseExprFromFile(path);
 | 
			
		||||
    
 | 
			
		||||
    try {
 | 
			
		||||
        /* !!! Maybe we should cache the evaluation result. */
 | 
			
		||||
        eval(e, v);
 | 
			
		||||
    } catch (Error & e) {
 | 
			
		||||
        addErrorPrefix(e, "while evaluating the file `%1%':\n", path);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -218,6 +218,13 @@ public:
 | 
			
		|||
    EvalState();
 | 
			
		||||
    ~EvalState();
 | 
			
		||||
 | 
			
		||||
    /* Parse a Nix expression from the specified file.  If `path'
 | 
			
		||||
       refers to a directory, then "/default.nix" is appended. */
 | 
			
		||||
    Expr * parseExprFromFile(Path path);
 | 
			
		||||
 | 
			
		||||
    /* Parse a Nix expression from the specified string. */
 | 
			
		||||
    Expr * parseExprFromString(const string & s, const Path & basePath);
 | 
			
		||||
    
 | 
			
		||||
    /* Evaluate an expression read from the given file to normal
 | 
			
		||||
       form. */
 | 
			
		||||
    void evalFile(const Path & path, Value & v);
 | 
			
		||||
| 
						 | 
				
			
			@ -296,6 +303,9 @@ private:
 | 
			
		|||
    friend class ExprAttrs;
 | 
			
		||||
    friend class ExprLet;
 | 
			
		||||
 | 
			
		||||
    Expr * parse(const char * text,
 | 
			
		||||
        const Path & path, const Path & basePath);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    
 | 
			
		||||
    /* Do a deep equality test between two values.  That is, list
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,21 +0,0 @@
 | 
			
		|||
#ifndef __PARSER_H
 | 
			
		||||
#define __PARSER_H
 | 
			
		||||
 | 
			
		||||
#include "eval.hh"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace nix {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Parse a Nix expression from the specified file.  If `path' refers
 | 
			
		||||
   to a directory, then "/default.nix" is appended. */
 | 
			
		||||
Expr * parseExprFromFile(EvalState & state, Path path);
 | 
			
		||||
 | 
			
		||||
/* Parse a Nix expression from the specified string. */
 | 
			
		||||
Expr * parseExprFromString(EvalState & state, const string & s, const Path & basePath);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* !__PARSER_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -450,11 +450,11 @@ formal
 | 
			
		|||
namespace nix {
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
static Expr * parse(EvalState & state, const char * text,
 | 
			
		||||
Expr * EvalState::parse(const char * text,
 | 
			
		||||
    const Path & path, const Path & basePath)
 | 
			
		||||
{
 | 
			
		||||
    yyscan_t scanner;
 | 
			
		||||
    ParseData data(state.symbols);
 | 
			
		||||
    ParseData data(symbols);
 | 
			
		||||
    data.basePath = basePath;
 | 
			
		||||
    data.path = path;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -466,7 +466,7 @@ static Expr * parse(EvalState & state, const char * text,
 | 
			
		|||
    if (res) throw ParseError(data.error);
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
        data.result->bindVars(state.staticBaseEnv);
 | 
			
		||||
        data.result->bindVars(staticBaseEnv);
 | 
			
		||||
    } catch (Error & e) {
 | 
			
		||||
        throw ParseError(format("%1%, in `%2%'") % e.msg() % path);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -475,7 +475,7 @@ static Expr * parse(EvalState & state, const char * text,
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Expr * parseExprFromFile(EvalState & state, Path path)
 | 
			
		||||
Expr * EvalState::parseExprFromFile(Path path)
 | 
			
		||||
{
 | 
			
		||||
    assert(path[0] == '/');
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -493,15 +493,21 @@ Expr * parseExprFromFile(EvalState & state, Path path)
 | 
			
		|||
    if (S_ISDIR(st.st_mode))
 | 
			
		||||
        path = canonPath(path + "/default.nix");
 | 
			
		||||
 | 
			
		||||
    /* Read and parse the input file. */
 | 
			
		||||
    return parse(state, readFile(path).c_str(), path, dirOf(path));
 | 
			
		||||
    /* Read and parse the input file, unless it's already in the parse
 | 
			
		||||
       tree cache. */
 | 
			
		||||
    Expr * e = parseTrees[path];
 | 
			
		||||
    if (!e) {
 | 
			
		||||
        e = parse(readFile(path).c_str(), path, dirOf(path));
 | 
			
		||||
        parseTrees[path] = e;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return e;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Expr * parseExprFromString(EvalState & state,
 | 
			
		||||
    const string & s, const Path & basePath)
 | 
			
		||||
Expr * EvalState::parseExprFromString(const string & s, const Path & basePath)
 | 
			
		||||
{
 | 
			
		||||
    return parse(state, s.c_str(), "(string)", basePath);
 | 
			
		||||
    return parse(s.c_str(), "(string)", basePath);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,6 @@
 | 
			
		|||
#include "util.hh"
 | 
			
		||||
#include "archive.hh"
 | 
			
		||||
#include "value-to-xml.hh"
 | 
			
		||||
#include "parser.hh"
 | 
			
		||||
#include "names.hh"
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -1059,7 +1058,7 @@ void EvalState::createBaseEnv()
 | 
			
		|||
    /* Add a wrapper around the derivation primop that computes the
 | 
			
		||||
       `drvPath' and `outPath' attributes lazily. */
 | 
			
		||||
    string s = "attrs: let res = derivationStrict attrs; in attrs // { drvPath = res.drvPath; outPath = res.outPath; type = \"derivation\"; }";
 | 
			
		||||
    mkThunk_(v, parseExprFromString(*this, s, "/"));
 | 
			
		||||
    mkThunk_(v, parseExprFromString(s, "/"));
 | 
			
		||||
    addConstant("derivation", v);
 | 
			
		||||
 | 
			
		||||
    // Paths
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue