-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
lib.rs
92 lines (80 loc) · 1.88 KB
/
lib.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
extern crate proc_macro;
use std::iter::once;
use quote::ToTokens;
use syn::{Block, ExprBlock};
use crate::{
ast::ToCode,
ctxt::{prepare_vars, Ctx},
input::QuoteInput,
ret_type::parse_input_type,
};
mod ast;
mod builder;
mod ctxt;
mod input;
mod query;
mod ret_type;
/// Don't invoke this macro directly, use the `quote!` macro from
/// `swc_ecma_quote` instead.
#[proc_macro]
pub fn internal_quote(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let QuoteInput {
src,
as_token: _,
output_type,
vars,
} = syn::parse::<QuoteInput>(input).expect("failed to parse input to quote!()");
let ret_type =
parse_input_type(&src.value(), &output_type).expect("failed to parse input type");
let vars = vars.map(|v| v.1);
let (stmts, vars) = if let Some(vars) = vars {
prepare_vars(&ret_type, vars)
} else {
Default::default()
};
let cx = Ctx { vars };
let expr_for_ast_creation = ret_type.to_code(&cx);
syn::Expr::Block(ExprBlock {
attrs: Default::default(),
label: Default::default(),
block: Block {
brace_token: Default::default(),
stmts: stmts
.into_iter()
.chain(once(syn::Stmt::Expr(expr_for_ast_creation)))
.collect(),
},
})
.to_token_stream()
.into()
}
///
///
/// # Matchers
///
///
/// ```ignore
///
/// let q = query!("class Foo extends YourClass {}");
///
/// let module: Module = create_your_module();
/// ```
///
/// ```ignore
///
/// let q = query!("console.log(...$1)");
///
/// let module: Module = create_your_module();
/// ```
///
///
/// ```ignore
///
/// let q = query!("if ($1) { $2; } else $3");
///
/// let module: Module = create_your_module();
/// ```
#[proc_macro]
pub fn query(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
input
}