aboutsummaryrefslogtreecommitdiff
path: root/src/libutil/position.hh
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-03-06 05:24:35 +0100
committereldritch horrors <pennae@lix.systems>2024-03-05 23:46:18 -0700
commit89e99d94e4ae492db09c0ebc0c35e4890ef7db25 (patch)
treeeab2defee911a6c0e39d4b073062690bd9a3a058 /src/libutil/position.hh
parente9b5929b22116cb714adfe88ba39a817e89b019c (diff)
Merge pull request #9634 from 9999years/combine-abstract-pos-and-pos
Combine `AbstractPos`, `PosAdapter`, and `Pos` (cherry picked from commit 113499d16fc87d53b73fb62fe6242154909756ed) === this is a bit cursed because originally it was based on InputAccessor code that we don't have and moved/patched features we likewise don't have (fetchToStore caching, all the individual accessors, ContentAddressMethod). the commit is adjusted accordingly to match (remove caching, ignore accessors, use FileIngestionMethod). note that `state.rootPath . CanonPath == abs` and computeStorePathForPath works relative to cwd, so the slight rewrite in the moved fetchToStore is legal. Change-Id: I05fd340c273f0bcc8ffabfebdc4a88b98083bce5
Diffstat (limited to 'src/libutil/position.hh')
-rw-r--r--src/libutil/position.hh74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/libutil/position.hh b/src/libutil/position.hh
new file mode 100644
index 000000000..a184997ed
--- /dev/null
+++ b/src/libutil/position.hh
@@ -0,0 +1,74 @@
+#pragma once
+/**
+ * @file
+ *
+ * @brief Pos and AbstractPos
+ */
+
+#include <cstdint>
+#include <string>
+
+#include "source-path.hh"
+
+namespace nix {
+
+/**
+ * A position and an origin for that position (like a source file).
+ */
+struct Pos
+{
+ uint32_t line = 0;
+ uint32_t column = 0;
+
+ struct Stdin {
+ ref<std::string> source;
+ bool operator==(const Stdin & rhs) const
+ { return *source == *rhs.source; }
+ bool operator!=(const Stdin & rhs) const
+ { return *source != *rhs.source; }
+ bool operator<(const Stdin & rhs) const
+ { return *source < *rhs.source; }
+ };
+ struct String {
+ ref<std::string> source;
+ bool operator==(const String & rhs) const
+ { return *source == *rhs.source; }
+ bool operator!=(const String & rhs) const
+ { return *source != *rhs.source; }
+ bool operator<(const String & rhs) const
+ { return *source < *rhs.source; }
+ };
+
+ typedef std::variant<std::monostate, Stdin, String, SourcePath> Origin;
+
+ Origin origin = std::monostate();
+
+ Pos() { }
+ Pos(uint32_t line, uint32_t column, Origin origin)
+ : line(line), column(column), origin(origin) { }
+ Pos(Pos & other) = default;
+ Pos(const Pos & other) = default;
+ Pos(Pos && other) = default;
+ Pos(const Pos * other);
+
+ explicit operator bool() const { return line > 0; }
+
+ operator std::shared_ptr<Pos>() const;
+
+ /**
+ * Return the contents of the source file.
+ */
+ std::optional<std::string> getSource() const;
+
+ void print(std::ostream & out, bool showOrigin) const;
+
+ std::optional<LinesOfCode> getCodeLines() const;
+
+ bool operator==(const Pos & rhs) const = default;
+ bool operator!=(const Pos & rhs) const = default;
+ bool operator<(const Pos & rhs) const;
+};
+
+std::ostream & operator<<(std::ostream & str, const Pos & pos);
+
+}