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 /src/libexpr/nixexpr.cc | |
parent | aea97f07a388915e5a7179f56ab4328fef155f05 (diff) |
Restore display of source lines for stdin/string inputs
Diffstat (limited to 'src/libexpr/nixexpr.cc')
-rw-r--r-- | src/libexpr/nixexpr.cc | 73 |
1 files changed, 33 insertions, 40 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; } |