aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libexpr/parser.y24
-rw-r--r--src/libutil/util.cc2
-rw-r--r--src/nix/repl.cc5
3 files changed, 12 insertions, 19 deletions
diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y
index 923997bf6..c1f4e72e0 100644
--- a/src/libexpr/parser.y
+++ b/src/libexpr/parser.y
@@ -39,12 +39,6 @@ namespace nix {
{ };
};
- // Helper to prevent an expensive dynamic_cast call in expr_app.
- struct App
- {
- Expr * e;
- bool isCall;
- };
}
#define YY_DECL int yylex \
@@ -284,12 +278,10 @@ void yyerror(YYLTYPE * loc, yyscan_t scanner, ParseData * data, const char * err
char * uri;
std::vector<nix::AttrName> * attrNames;
std::vector<nix::Expr *> * string_parts;
- nix::App app; // bool == whether this is an ExprCall
}
%type <e> start expr expr_function expr_if expr_op
-%type <e> expr_select expr_simple
-%type <app> expr_app
+%type <e> expr_select expr_simple expr_app
%type <list> expr_list
%type <attrs> binds
%type <formals> formals
@@ -377,20 +369,18 @@ expr_op
| expr_op '*' expr_op { $$ = new ExprCall(CUR_POS, new ExprVar(data->symbols.create("__mul")), {$1, $3}); }
| expr_op '/' expr_op { $$ = new ExprCall(CUR_POS, new ExprVar(data->symbols.create("__div")), {$1, $3}); }
| expr_op CONCAT expr_op { $$ = new ExprOpConcatLists(CUR_POS, $1, $3); }
- | expr_app { $$ = $1.e; }
+ | expr_app
;
expr_app
: expr_app expr_select {
- if ($1.isCall) {
- ((ExprCall *) $1.e)->args.push_back($2);
+ if (auto e2 = dynamic_cast<ExprCall *>($1)) {
+ e2->args.push_back($2);
$$ = $1;
- } else {
- $$.e = new ExprCall(CUR_POS, $1.e, {$2});
- $$.isCall = true;
- }
+ } else
+ $$ = new ExprCall(CUR_POS, $1, {$2});
}
- | expr_select { $$.e = $1; $$.isCall = false; }
+ | expr_select
;
expr_select
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index 8ae3445c6..5468d1ed1 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -562,7 +562,7 @@ Path getConfigDir()
std::vector<Path> getConfigDirs()
{
Path configHome = getConfigDir();
- string configDirs = getEnv("XDG_CONFIG_DIRS").value_or("");
+ string configDirs = getEnv("XDG_CONFIG_DIRS").value_or("/etc/xdg");
std::vector<Path> result = tokenizeString<std::vector<string>>(configDirs, ":");
result.insert(result.begin(), configHome);
return result;
diff --git a/src/nix/repl.cc b/src/nix/repl.cc
index 4f13ee05d..fd86174f2 100644
--- a/src/nix/repl.cc
+++ b/src/nix/repl.cc
@@ -471,7 +471,10 @@ bool NixRepl::processLine(string line)
auto args = editorFor(pos);
auto editor = args.front();
args.pop_front();
- runProgram(editor, true, args);
+
+ // runProgram redirects stdout to a StringSink,
+ // using runProgram2 to allow editors to display their UI
+ runProgram2(RunOptions { .program = editor, .searchPath = true, .args = args });
// Reload right after exiting the editor
state->resetFileCache();