diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2022-12-13 16:00:44 +0100 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2022-12-13 16:00:44 +0100 |
commit | c9b0a85b088b472eda9818dfaa0cc1a54124933c (patch) | |
tree | 2202fcecec99f2b44ba1754e62f8f1e59c373661 | |
parent | aea97f07a388915e5a7179f56ab4328fef155f05 (diff) |
Restore display of source lines for stdin/string inputs
-rw-r--r-- | src/libexpr/nixexpr.cc | 73 | ||||
-rw-r--r-- | src/libexpr/nixexpr.hh | 9 | ||||
-rw-r--r-- | src/libexpr/parser.y | 10 |
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); } |