aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2022-12-13 16:00:44 +0100
committerEelco Dolstra <edolstra@gmail.com>2022-12-13 16:00:44 +0100
commitc9b0a85b088b472eda9818dfaa0cc1a54124933c (patch)
tree2202fcecec99f2b44ba1754e62f8f1e59c373661
parentaea97f07a388915e5a7179f56ab4328fef155f05 (diff)
Restore display of source lines for stdin/string inputs
-rw-r--r--src/libexpr/nixexpr.cc73
-rw-r--r--src/libexpr/nixexpr.hh9
-rw-r--r--src/libexpr/parser.y10
3 files changed, 44 insertions, 48 deletions
diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc
index bdfb6457a..eb6f062b4 100644
--- a/src/libexpr/nixexpr.cc
+++ b/src/libexpr/nixexpr.cc
@@ -8,62 +8,55 @@
namespace nix {
-struct SourcePathAdapter : AbstractPos
+struct PosAdapter : AbstractPos
{
- Path path;
+ Pos::Origin origin;
- SourcePathAdapter(Path path)
- : path(std::move(path))
+ PosAdapter(Pos::Origin origin)
+ : origin(std::move(origin))
{
}
std::optional<std::string> getSource() const override
{
- try {
- return readFile(path);
- } catch (Error &) {
- return std::nullopt;
- }
- }
-
- void print(std::ostream & out) const override
- {
- out << path;
- }
-};
-
-struct StringPosAdapter : AbstractPos
-{
- void print(std::ostream & out) const override
- {
- out << "«string»";
+ return std::visit(overloaded {
+ [](const Pos::none_tag &) -> std::optional<std::string> {
+ return std::nullopt;
+ },
+ [](const Pos::Stdin & s) -> std::optional<std::string> {
+ // Get rid of the null terminators added by the parser.
+ return std::string(s.source->c_str());
+ },
+ [](const Pos::String & s) -> std::optional<std::string> {
+ // Get rid of the null terminators added by the parser.
+ return std::string(s.source->c_str());
+ },
+ [](const Path & path) -> std::optional<std::string> {
+ try {
+ return readFile(path);
+ } catch (Error &) {
+ return std::nullopt;
+ }
+ }
+ }, origin);
}
-};
-struct StdinPosAdapter : AbstractPos
-{
void print(std::ostream & out) const override
{
- out << "«stdin»";
+ std::visit(overloaded {
+ [&](const Pos::none_tag &) { out << "«none»"; },
+ [&](const Pos::Stdin &) { out << "«stdin»"; },
+ [&](const Pos::String & s) { out << "«string»"; },
+ [&](const Path & path) { out << path; }
+ }, origin);
}
};
Pos::operator std::shared_ptr<AbstractPos>() const
{
- std::shared_ptr<AbstractPos> pos;
-
- if (auto path = std::get_if<Path>(&origin))
- pos = std::make_shared<SourcePathAdapter>(*path);
- else if (std::get_if<stdin_tag>(&origin))
- pos = std::make_shared<StdinPosAdapter>();
- else if (std::get_if<string_tag>(&origin))
- pos = std::make_shared<StringPosAdapter>();
-
- if (pos) {
- pos->line = line;
- pos->column = column;
- }
-
+ auto pos = std::make_shared<PosAdapter>(origin);
+ pos->line = line;
+ pos->column = column;
return pos;
}
diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh
index 0338a8c37..ac7ce021e 100644
--- a/src/libexpr/nixexpr.hh
+++ b/src/libexpr/nixexpr.hh
@@ -28,10 +28,11 @@ struct Pos
uint32_t line;
uint32_t column;
- struct stdin_tag {};
- struct string_tag {};
+ struct none_tag { };
+ struct Stdin { ref<std::string> source; };
+ struct String { ref<std::string> source; };
- typedef std::variant<stdin_tag, string_tag, Path> Origin;
+ typedef std::variant<none_tag, Stdin, String, Path> Origin;
Origin origin;
@@ -72,7 +73,7 @@ public:
mutable uint32_t idx = std::numeric_limits<uint32_t>::max();
// Used for searching in PosTable::[].
- explicit Origin(uint32_t idx): idx(idx), origin{Pos::stdin_tag()} {}
+ explicit Origin(uint32_t idx): idx(idx), origin{Pos::none_tag()} {}
public:
const Pos::Origin origin;
diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y
index ea4e0bfb0..e07909f8e 100644
--- a/src/libexpr/parser.y
+++ b/src/libexpr/parser.y
@@ -713,10 +713,11 @@ Expr * EvalState::parseExprFromFile(const Path & path, std::shared_ptr<StaticEnv
}
-Expr * EvalState::parseExprFromString(std::string s, const Path & basePath, std::shared_ptr<StaticEnv> & staticEnv)
+Expr * EvalState::parseExprFromString(std::string s_, const Path & basePath, std::shared_ptr<StaticEnv> & staticEnv)
{
- s.append("\0\0", 2);
- return parse(s.data(), s.size(), Pos::string_tag(), basePath, staticEnv);
+ auto s = make_ref<std::string>(std::move(s_));
+ s->append("\0\0", 2);
+ return parse(s->data(), s->size(), Pos::String{.source = s}, basePath, staticEnv);
}
@@ -732,7 +733,8 @@ Expr * EvalState::parseStdin()
auto buffer = drainFD(0);
// drainFD should have left some extra space for terminators
buffer.append("\0\0", 2);
- return parse(buffer.data(), buffer.size(), Pos::stdin_tag(), absPath("."), staticBaseEnv);
+ auto s = make_ref<std::string>(std::move(buffer));
+ return parse(s->data(), s->size(), Pos::Stdin{.source = s}, absPath("."), staticBaseEnv);
}