From c9b0a85b088b472eda9818dfaa0cc1a54124933c Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 13 Dec 2022 16:00:44 +0100 Subject: Restore display of source lines for stdin/string inputs --- src/libexpr/nixexpr.cc | 73 +++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 40 deletions(-) (limited to 'src/libexpr/nixexpr.cc') 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 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 { + return std::nullopt; + }, + [](const Pos::Stdin & s) -> std::optional { + // Get rid of the null terminators added by the parser. + return std::string(s.source->c_str()); + }, + [](const Pos::String & s) -> std::optional { + // Get rid of the null terminators added by the parser. + return std::string(s.source->c_str()); + }, + [](const Path & path) -> std::optional { + 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() const { - std::shared_ptr pos; - - if (auto path = std::get_if(&origin)) - pos = std::make_shared(*path); - else if (std::get_if(&origin)) - pos = std::make_shared(); - else if (std::get_if(&origin)) - pos = std::make_shared(); - - if (pos) { - pos->line = line; - pos->column = column; - } - + auto pos = std::make_shared(origin); + pos->line = line; + pos->column = column; return pos; } -- cgit v1.2.3