diff options
author | Qyriad <qyriad@qyriad.me> | 2024-07-02 17:29:19 -0600 |
---|---|---|
committer | Qyriad <qyriad@qyriad.me> | 2024-07-04 15:55:38 -0600 |
commit | 4f0c27abe159c69db15f968607bc26de5ba1034f (patch) | |
tree | 0d24ec1149fbf9e7d3453ffeab936d1c912ed608 | |
parent | e040b762a48f022b1ea4080020083f7367cf3ee5 (diff) |
give ExprInheritFrom a handle to what its standing in for
Change-Id: I12088e0b618407e5432523bbc97be63c8d6fce62
-rw-r--r-- | src/libexpr/nixexpr.hh | 7 | ||||
-rw-r--r-- | src/libexpr/parser/parser.cc | 15 | ||||
-rw-r--r-- | src/libexpr/parser/state.hh | 2 |
3 files changed, 16 insertions, 8 deletions
diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh index 418f888b3..703a32e8f 100644 --- a/src/libexpr/nixexpr.hh +++ b/src/libexpr/nixexpr.hh @@ -144,7 +144,10 @@ struct ExprVar : Expr */ struct ExprInheritFrom : ExprVar { - ExprInheritFrom(PosIdx pos, Displacement displ): ExprVar(pos, {}) + ref<Expr> fromExpr; + + ExprInheritFrom(PosIdx pos, Displacement displ, ref<Expr> fromExpr) + : ExprVar(pos, {}), fromExpr(fromExpr) { this->level = 0; this->displ = displ; @@ -222,7 +225,7 @@ struct ExprAttrs : Expr }; typedef std::map<Symbol, AttrDef> AttrDefs; AttrDefs attrs; - std::unique_ptr<std::vector<std::unique_ptr<Expr>>> inheritFromExprs; + std::unique_ptr<std::vector<ref<Expr>>> inheritFromExprs; struct DynamicAttrDef { std::unique_ptr<Expr> nameExpr, valueExpr; PosIdx pos; 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. |