Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 72bfaea

Browse files
committed
[add] modifier_callee マクロ作成
1 parent b32f18e commit 72bfaea

File tree

4 files changed

+62
-3
lines changed

4 files changed

+62
-3
lines changed

‎crates/macros/src/impl.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
pub mod modifier;
22
pub mod modifier_caller;
3+
pub mod modifier_callee;
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use proc_macro2::TokenStream;
2+
use quote::quote;
3+
use syn::ItemFn;
4+
5+
/// 対象: 関数
6+
/// 動作: 文脈への制約を追加
7+
pub fn proc_macro_impl(args: TokenStream, ast: ItemFn) -> TokenStream {
8+
let target_trait = args;
9+
10+
let fn_visibility = ast.vis;
11+
let fn_ident = ast.sig.ident;
12+
let fn_args = ast.sig.inputs;
13+
let fn_ret_type = ast.sig.output;
14+
let fn_body = ast.block;
15+
16+
quote! {
17+
// マクロ適用関数
18+
#fn_visibility fn #fn_ident <Ctx> (ctx: Ctx, #fn_args) #fn_ret_type
19+
where
20+
// 制約
21+
Ctx: #target_trait,
22+
{
23+
// 関数本体
24+
#fn_body
25+
}
26+
}
27+
}

‎crates/macros/src/lib.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,13 @@ pub fn modifier_caller(
2222
let ast = parse_macro_input!(item as ItemFn);
2323
r#impl::modifier_caller::proc_macro_impl(args, ast).into()
2424
}
25+
26+
#[proc_macro_attribute]
27+
pub fn modifier_callee(
28+
attr: proc_macro::TokenStream,
29+
item: proc_macro::TokenStream,
30+
) -> proc_macro::TokenStream {
31+
let args: TokenStream = attr.into();
32+
let ast = parse_macro_input!(item as ItemFn);
33+
r#impl::modifier_callee::proc_macro_impl(args, ast).into()
34+
}

‎crates/macros/tests/modifier.rs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,30 @@
1-
use mymodifier_macros::modifier;
1+
use mymodifier_macros::*;
22

33
#[modifier]
4-
pub trait MyTrait {}
4+
trait A {}
5+
6+
#[modifier]
7+
trait B {}
8+
9+
#[modifier]
10+
trait C {}
11+
12+
#[modifier_callee(A)]
13+
fn fn_a() {}
14+
15+
#[modifier_callee(B + C)]
16+
fn fn_b_c() {}
517

618
#[test]
719
fn check_compile_modifier() {
8-
hello!();
20+
struct Ctx;
21+
22+
a! {
23+
fn_a();
24+
b! {
25+
c! {
26+
fn_b_c();
27+
}
28+
}
29+
}
930
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /