feat(natu): lint direct listToAttrs maps
This commit was merged in pull request #109.
This commit is contained in:
@@ -42,6 +42,13 @@ fn convert_syntax(syntax: rnix::SyntaxNode) -> (Vec<ast::Node>, Vec<ast::Token>)
|
||||
fn convert_expr(expr: rnix::ast::Expr) -> ast::Expr {
|
||||
match expr {
|
||||
rnix::ast::Expr::Ident(ident) => ast::Expr::Ident(ident.into()),
|
||||
rnix::ast::Expr::Select(select) => convert_select_expr(select),
|
||||
rnix::ast::Expr::Apply(apply) => ast::Expr::Apply(ast::Apply {
|
||||
lambda: Box::new(convert_expr(apply.lambda().expect("applications have a lambda"))),
|
||||
argument: Box::new(convert_expr(
|
||||
apply.argument().expect("applications have an argument"),
|
||||
)),
|
||||
}),
|
||||
rnix::ast::Expr::LetIn(let_in) => ast::Expr::Let {
|
||||
range: let_in.syntax().text_range().into(),
|
||||
bindings: let_in
|
||||
@@ -67,6 +74,19 @@ fn convert_expr(expr: rnix::ast::Expr) -> ast::Expr {
|
||||
}
|
||||
}
|
||||
|
||||
fn convert_select_expr(select: rnix::ast::Select) -> ast::Expr {
|
||||
select.clone().try_into().map(ast::Expr::Select).unwrap_or_else(|_| {
|
||||
ast::Expr::Other(
|
||||
select
|
||||
.syntax()
|
||||
.children()
|
||||
.filter_map(rnix::ast::Expr::cast)
|
||||
.map(convert_expr)
|
||||
.collect(),
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
fn convert_binding_ast(binding: rnix::ast::AttrpathValue) -> Option<ast::Binding> {
|
||||
let mut attrs = binding.attrpath()?.attrs();
|
||||
let Attr::Ident(key) = attrs.next()? else {
|
||||
@@ -139,11 +159,21 @@ fn convert_node(node: rnix::SyntaxNode) -> Option<ast::Node> {
|
||||
fn convert_binding(node: rnix::SyntaxNode) -> Option<ast::Node> {
|
||||
let binding = rnix::ast::AttrpathValue::cast(node)?;
|
||||
let range = binding.syntax().text_range().into();
|
||||
let data = binding.try_into().ok()?;
|
||||
let mut attrs = binding.attrpath()?.attrs();
|
||||
let Attr::Ident(key) = attrs.next()? else {
|
||||
return None;
|
||||
};
|
||||
if attrs.next().is_some() {
|
||||
return None;
|
||||
}
|
||||
|
||||
Some(ast::Node {
|
||||
range,
|
||||
data: ast::NodeData::Binding(data),
|
||||
data: ast::NodeData::Binding(ast::Binding {
|
||||
range,
|
||||
key: key.into(),
|
||||
value: convert_expr(binding.value()?),
|
||||
}),
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user