aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/nixexpr.hh
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-03-08 06:55:47 +0100
committereldritch horrors <pennae@lix.systems>2024-03-09 04:47:05 -0700
commitd4c738fe4c587c3f09b0fda899f419f2de97ee2f (patch)
tree4e26ad39777ccb697c048a12d1c6ea02b58cfc12 /src/libexpr/nixexpr.hh
parent7673312ccc179825033e4458604ddd2e9ae8d162 (diff)
Move `PodIdx` to `pos-idx.hh` and `PosTable` to `pos-table.hh`
(cherry picked from commit c62c21e29af20f1c14a59ab37d7a25dd0b70f69e) Change-Id: Id4ea2fc33b0874b2f1f2a32cabcbeb0afa26808f
Diffstat (limited to 'src/libexpr/nixexpr.hh')
-rw-r--r--src/libexpr/nixexpr.hh86
1 files changed, 2 insertions, 84 deletions
diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh
index 4b41fe1fc..84f66ba4c 100644
--- a/src/libexpr/nixexpr.hh
+++ b/src/libexpr/nixexpr.hh
@@ -9,6 +9,8 @@
#include "error.hh"
#include "chunked-vector.hh"
#include "position.hh"
+#include "pos-idx.hh"
+#include "pos-table.hh"
namespace nix {
@@ -30,90 +32,6 @@ public:
using EvalError::EvalError;
};
-class PosIdx {
- friend class PosTable;
-
-private:
- uint32_t id;
-
- explicit PosIdx(uint32_t id): id(id) {}
-
-public:
- PosIdx() : id(0) {}
-
- explicit operator bool() const { return id > 0; }
-
- bool operator <(const PosIdx other) const { return id < other.id; }
-
- bool operator ==(const PosIdx other) const { return id == other.id; }
-
- bool operator !=(const PosIdx other) const { return id != other.id; }
-};
-
-class PosTable
-{
-public:
- class Origin {
- friend PosTable;
- private:
- // must always be invalid by default, add() replaces this with the actual value.
- // subsequent add() calls use this index as a token to quickly check whether the
- // current origins.back() can be reused or not.
- mutable uint32_t idx = std::numeric_limits<uint32_t>::max();
-
- // Used for searching in PosTable::[].
- explicit Origin(uint32_t idx): idx(idx), origin{std::monostate()} {}
-
- public:
- const Pos::Origin origin;
-
- Origin(Pos::Origin origin): origin(origin) {}
- };
-
- struct Offset {
- uint32_t line, column;
- };
-
-private:
- std::vector<Origin> origins;
- ChunkedVector<Offset, 8192> offsets;
-
-public:
- PosTable(): offsets(1024)
- {
- origins.reserve(1024);
- }
-
- PosIdx add(const Origin & origin, uint32_t line, uint32_t column)
- {
- const auto idx = offsets.add({line, column}).second;
- if (origins.empty() || origins.back().idx != origin.idx) {
- origin.idx = idx;
- origins.push_back(origin);
- }
- return PosIdx(idx + 1);
- }
-
- Pos operator[](PosIdx p) const
- {
- if (p.id == 0 || p.id > offsets.size())
- return {};
- const auto idx = p.id - 1;
- /* we want the last key <= idx, so we'll take prev(first key > idx).
- this is guaranteed to never rewind origin.begin because the first
- key is always 0. */
- const auto pastOrigin = std::upper_bound(
- origins.begin(), origins.end(), Origin(idx),
- [] (const auto & a, const auto & b) { return a.idx < b.idx; });
- const auto origin = *std::prev(pastOrigin);
- const auto offset = offsets[idx];
- return {offset.line, offset.column, origin.origin};
- }
-};
-
-inline PosIdx noPos = {};
-
-
struct Env;
struct Value;
class EvalState;