aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/nixexpr.cc
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 /src/libexpr/nixexpr.cc
parentaea97f07a388915e5a7179f56ab4328fef155f05 (diff)
Restore display of source lines for stdin/string inputs
Diffstat (limited to 'src/libexpr/nixexpr.cc')
-rw-r--r--src/libexpr/nixexpr.cc73
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;
}