From 4f0c27abe159c69db15f968607bc26de5ba1034f Mon Sep 17 00:00:00 2001 From: Qyriad Date: Tue, 2 Jul 2024 17:29:19 -0600 Subject: [PATCH] give ExprInheritFrom a handle to what its standing in for Change-Id: I12088e0b618407e5432523bbc97be63c8d6fce62 --- src/libexpr/nixexpr.hh | 7 +++++-- src/libexpr/parser/parser.cc | 15 ++++++++++----- 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 fromExpr; + + ExprInheritFrom(PosIdx pos, Displacement displ, ref fromExpr) + : ExprVar(pos, {}), fromExpr(fromExpr) { this->level = 0; this->displ = displ; @@ -222,7 +225,7 @@ struct ExprAttrs : Expr }; typedef std::map AttrDefs; AttrDefs attrs; - std::unique_ptr>> inheritFromExprs; + std::unique_ptr>> inheritFromExprs; struct DynamicAttrDef { std::unique_ptr 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 : change_head { }); } } - if (auto fromE = std::move(s.from)) { + if (s.from != nullptr) { if (!b.attrs.inheritFromExprs) - b.attrs.inheritFromExprs = std::make_unique>>(); - b.attrs.inheritFromExprs->push_back(std::move(fromE)); + b.attrs.inheritFromExprs = std::make_unique>>(); + auto fromExpr = ref(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(s.fromPos, b.attrs.inheritFromExprs->size() - 1); + auto inheritFrom = std::make_unique( + s.fromPos, + b.attrs.inheritFromExprs->size() - 1, + fromExpr + ); attrs.emplace( i.symbol, ExprAttrs::AttrDef( - std::make_unique(iPos, std::move(from), i.symbol), + std::make_unique(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(j->second.e.get()); if (jAttrs && ae) { if (ae->inheritFromExprs && !jAttrs->inheritFromExprs) - jAttrs->inheritFromExprs = std::make_unique>>(); + jAttrs->inheritFromExprs = std::make_unique>>(); for (auto & ad : ae->attrs) { auto j2 = jAttrs->attrs.find(ad.first); if (j2 != jAttrs->attrs.end()) // Attr already defined in iAttrs, error.