aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/parser
diff options
context:
space:
mode:
authorQyriad <qyriad@qyriad.me>2024-07-02 17:29:19 -0600
committerQyriad <qyriad@qyriad.me>2024-07-04 15:55:38 -0600
commit4f0c27abe159c69db15f968607bc26de5ba1034f (patch)
tree0d24ec1149fbf9e7d3453ffeab936d1c912ed608 /src/libexpr/parser
parente040b762a48f022b1ea4080020083f7367cf3ee5 (diff)
give ExprInheritFrom a handle to what its standing in for
Change-Id: I12088e0b618407e5432523bbc97be63c8d6fce62
Diffstat (limited to 'src/libexpr/parser')
-rw-r--r--src/libexpr/parser/parser.cc15
-rw-r--r--src/libexpr/parser/state.hh2
2 files changed, 11 insertions, 6 deletions
diff --git a/src/libexpr/parser/parser.cc b/src/libexpr/parser/parser.cc
index 850f1276e..e60cf967f 100644
--- a/src/libexpr/parser/parser.cc
+++ b/src/libexpr/parser/parser.cc
@@ -317,18 +317,23 @@ template<> struct BuildAST<grammar::inherit> : change_head<InheritState> {
});
}
}
- if (auto fromE = std::move(s.from)) {
+ if (s.from != nullptr) {
if (!b.attrs.inheritFromExprs)
- b.attrs.inheritFromExprs = std::make_unique<std::vector<std::unique_ptr<Expr>>>();
- b.attrs.inheritFromExprs->push_back(std::move(fromE));
+ b.attrs.inheritFromExprs = std::make_unique<std::vector<ref<Expr>>>();
+ auto fromExpr = ref<Expr>(std::move(s.from));
+ b.attrs.inheritFromExprs->push_back(fromExpr);
for (auto & [i, iPos] : s.attrs) {
if (attrs.find(i.symbol) != attrs.end())
ps.dupAttr(i.symbol, iPos, attrs[i.symbol].pos);
- auto from = std::make_unique<ExprInheritFrom>(s.fromPos, b.attrs.inheritFromExprs->size() - 1);
+ auto inheritFrom = std::make_unique<ExprInheritFrom>(
+ s.fromPos,
+ b.attrs.inheritFromExprs->size() - 1,
+ fromExpr
+ );
attrs.emplace(
i.symbol,
ExprAttrs::AttrDef(
- std::make_unique<ExprSelect>(iPos, std::move(from), i.symbol),
+ std::make_unique<ExprSelect>(iPos, std::move(inheritFrom), i.symbol),
iPos,
ExprAttrs::AttrDef::Kind::InheritedFrom));
}
diff --git a/src/libexpr/parser/state.hh b/src/libexpr/parser/state.hh
index f5a0428d7..29889152e 100644
--- a/src/libexpr/parser/state.hh
+++ b/src/libexpr/parser/state.hh
@@ -103,7 +103,7 @@ inline void State::addAttr(ExprAttrs * attrs, AttrPath && attrPath, std::unique_
auto * jAttrs = dynamic_cast<ExprAttrs *>(j->second.e.get());
if (jAttrs && ae) {
if (ae->inheritFromExprs && !jAttrs->inheritFromExprs)
- jAttrs->inheritFromExprs = std::make_unique<std::vector<std::unique_ptr<Expr>>>();
+ jAttrs->inheritFromExprs = std::make_unique<std::vector<ref<Expr>>>();
for (auto & ad : ae->attrs) {
auto j2 = jAttrs->attrs.find(ad.first);
if (j2 != jAttrs->attrs.end()) // Attr already defined in iAttrs, error.