From 38dff04ece79322abc3937e0093bf99f0215c78e Mon Sep 17 00:00:00 2001 From: alexion Date: Sat, 26 Sep 2026 20:27:48 -0400 Subject: [PATCH] fix(natu): resolve inherited attributes --- src/natu/parser.rs | 45 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/src/natu/parser.rs b/src/natu/parser.rs index cf60b40..419188c 100644 --- a/src/natu/parser.rs +++ b/src/natu/parser.rs @@ -51,12 +51,7 @@ fn convert_expr(expr: rnix::ast::Expr) -> ast::Expr { let_in.body().expect("let expressions have bodies"), )), }, - rnix::ast::Expr::AttrSet(attr_set) => ast::Expr::AttrSet( - attr_set - .attrpath_values() - .filter_map(convert_binding_ast) - .collect(), - ), + rnix::ast::Expr::AttrSet(attr_set) => ast::Expr::AttrSet(convert_attr_set(attr_set)), rnix::ast::Expr::Lambda(lambda) => ast::Expr::Lambda { parameters: lambda_parameters(&lambda), body: Box::new(convert_expr(lambda.body().expect("lambdas have bodies"))), @@ -77,10 +72,6 @@ fn convert_binding_ast(binding: rnix::ast::AttrpathValue) -> Option Option Vec { + attr_set + .entries() + .flat_map(|entry| match entry { + rnix::ast::Entry::AttrpathValue(binding) => { + convert_binding_ast(binding).into_iter().collect() + } + rnix::ast::Entry::Inherit(inherit) => convert_inherit(inherit), + }) + .collect() +} + +fn convert_inherit(inherit: rnix::ast::Inherit) -> Vec { + let value = inherit + .from() + .and_then(|from| from.expr()) + .map(convert_expr); + + inherit + .attrs() + .filter_map(|attr| match attr { + Attr::Ident(ident) => Some(ident), + _ => None, + }) + .map(|key| ast::Binding { + range: key.syntax().text_range().into(), + value: value + .clone() + .unwrap_or_else(|| ast::Expr::Ident(key.clone().into())), + key: key.into(), + }) + .collect() +} + fn lambda_parameters(lambda: &rnix::ast::Lambda) -> Vec { match lambda.param() { Some(rnix::ast::Param::IdentParam(parameter)) => {