summaryrefslogtreecommitdiff
path: root/crates/typst-macros/src
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2025-02-04 10:38:31 +0100
committerGitHub <noreply@github.com>2025-02-04 09:38:31 +0000
commit50ccd7d60f078f3617bfed5c4e8e1fd7d45ec340 (patch)
tree22c12abf76d2b2c20b49b569167ddf60fbe5b348 /crates/typst-macros/src
parent5b3593e571826ae44a3aeb0e0f6f09face7291ac (diff)
Scope deprecations (#5798)
Diffstat (limited to 'crates/typst-macros/src')
-rw-r--r--crates/typst-macros/src/scope.rs43
1 files changed, 31 insertions, 12 deletions
diff --git a/crates/typst-macros/src/scope.rs b/crates/typst-macros/src/scope.rs
index 8a2f1ce6..392ab1a5 100644
--- a/crates/typst-macros/src/scope.rs
+++ b/crates/typst-macros/src/scope.rs
@@ -31,18 +31,37 @@ pub fn scope(_: TokenStream, item: syn::Item) -> Result<TokenStream> {
let mut definitions = vec![];
let mut constructor = quote! { None };
for child in &mut item.items {
- let def = match child {
- syn::ImplItem::Const(item) => handle_const(&self_ty_expr, item)?,
- syn::ImplItem::Fn(item) => match handle_fn(self_ty, item)? {
- FnKind::Member(tokens) => tokens,
- FnKind::Constructor(tokens) => {
- constructor = tokens;
- continue;
- }
- },
- syn::ImplItem::Verbatim(item) => handle_type_or_elem(item)?,
+ let bare: BareType;
+ let (mut def, attrs) = match child {
+ syn::ImplItem::Const(item) => {
+ (handle_const(&self_ty_expr, item)?, &item.attrs)
+ }
+ syn::ImplItem::Fn(item) => (
+ match handle_fn(self_ty, item)? {
+ FnKind::Member(tokens) => tokens,
+ FnKind::Constructor(tokens) => {
+ constructor = tokens;
+ continue;
+ }
+ },
+ &item.attrs,
+ ),
+ syn::ImplItem::Verbatim(item) => {
+ bare = syn::parse2(item.clone())?;
+ (handle_type_or_elem(&bare)?, &bare.attrs)
+ }
_ => bail!(child, "unexpected item in scope"),
};
+
+ if let Some(message) = attrs.iter().find_map(|attr| match &attr.meta {
+ syn::Meta::NameValue(pair) if pair.path.is_ident("deprecated") => {
+ Some(&pair.value)
+ }
+ _ => None,
+ }) {
+ def = quote! { #def.deprecated(#message) }
+ }
+
definitions.push(def);
}
@@ -61,6 +80,7 @@ pub fn scope(_: TokenStream, item: syn::Item) -> Result<TokenStream> {
#constructor
}
+ #[allow(deprecated)]
fn scope() -> #foundations::Scope {
let mut scope = #foundations::Scope::deduplicating();
#(#definitions;)*
@@ -78,8 +98,7 @@ fn handle_const(self_ty: &TokenStream, item: &syn::ImplItemConst) -> Result<Toke
}
/// Process a type item.
-fn handle_type_or_elem(item: &TokenStream) -> Result<TokenStream> {
- let item: BareType = syn::parse2(item.clone())?;
+fn handle_type_or_elem(item: &BareType) -> Result<TokenStream> {
let ident = &item.ident;
let define = if item.attrs.iter().any(|attr| attr.path().is_ident("elem")) {
quote! { define_elem }