add #[hdl] let destructuring and, while at it, tuple patterns

This commit is contained in:
Jacob Lifshay 2025-02-10 22:49:41 -08:00
parent 209d5b5fe1
commit 86a1bb46be
Signed by: programmerjake
SSH key fingerprint: SHA256:HnFTLGpSm4Q4Fj502oCFisjZSoakwEuTsJJMSke63RQ
6 changed files with 454 additions and 13 deletions

View file

@ -1109,7 +1109,7 @@ fn parse_quote_let_pat<T, R: ToTokens, C: Borrow<Token![:]>>(
}
}
fn wrap_ty_with_expr(ty: impl ToTokens) -> Type {
pub(crate) fn wrap_ty_with_expr(ty: impl ToTokens) -> Type {
parse_quote_spanned! {ty.span()=>
::fayalite::expr::Expr<#ty>
}
@ -1586,7 +1586,7 @@ impl Visitor<'_> {
}
}
fn empty_let() -> Local {
pub(crate) fn empty_let() -> Local {
Local {
attrs: vec![],
let_token: Default::default(),
@ -1672,7 +1672,7 @@ impl Fold for Visitor<'_> {
}
}
fn fold_local(&mut self, let_stmt: Local) -> Local {
fn fold_local(&mut self, mut let_stmt: Local) -> Local {
match self
.errors
.ok(HdlAttr::<Nothing, kw::hdl>::parse_and_leave_attr(
@ -1682,6 +1682,25 @@ impl Fold for Visitor<'_> {
Some(None) => return fold_local(self, let_stmt),
Some(Some(HdlAttr { .. })) => {}
};
let mut pat = &let_stmt.pat;
if let Pat::Type(pat_type) = pat {
pat = &pat_type.pat;
}
let Pat::Ident(syn::PatIdent {
attrs: _,
by_ref: None,
mutability: _,
ident: _,
subpat: None,
}) = pat
else {
let hdl_attr = HdlAttr::<Nothing, kw::hdl>::parse_and_take_attr(&mut let_stmt.attrs)
.ok()
.flatten()
.expect("already checked above");
let let_stmt = fold_local(self, let_stmt);
return self.process_hdl_let_pat(hdl_attr, let_stmt);
};
let hdl_let = syn::parse2::<HdlLet<HdlLetKind<Type>>>(let_stmt.into_token_stream());
let Some(hdl_let) = self.errors.ok(hdl_let) else {
return empty_let();