aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_mbe/src/lib.rs101
1 files changed, 98 insertions, 3 deletions
diff --git a/crates/ra_mbe/src/lib.rs b/crates/ra_mbe/src/lib.rs
index e78bc734b..eedc0c5dd 100644
--- a/crates/ra_mbe/src/lib.rs
+++ b/crates/ra_mbe/src/lib.rs
@@ -199,7 +199,7 @@ impl_froms!(TokenTree: Leaf, Subtree);
199 rules.expand(&invocation_tt).unwrap() 199 rules.expand(&invocation_tt).unwrap()
200 } 200 }
201 201
202 pub(crate) fn expand_to_syntax( 202 pub(crate) fn expand_to_items(
203 rules: &MacroRules, 203 rules: &MacroRules,
204 invocation: &str, 204 invocation: &str,
205 ) -> ra_syntax::TreeArc<ast::MacroItems> { 205 ) -> ra_syntax::TreeArc<ast::MacroItems> {
@@ -207,7 +207,28 @@ impl_froms!(TokenTree: Leaf, Subtree);
207 token_tree_to_macro_items(&expanded).unwrap() 207 token_tree_to_macro_items(&expanded).unwrap()
208 } 208 }
209 209
210 pub(crate) fn assert_expansion(rules: &MacroRules, invocation: &str, expansion: &str) { 210 #[allow(unused)]
211 pub(crate) fn expand_to_stmts(
212 rules: &MacroRules,
213 invocation: &str,
214 ) -> ra_syntax::TreeArc<ast::MacroStmts> {
215 let expanded = expand(rules, invocation);
216 token_tree_to_macro_stmts(&expanded).unwrap()
217 }
218
219 pub(crate) fn expand_to_expr(
220 rules: &MacroRules,
221 invocation: &str,
222 ) -> ra_syntax::TreeArc<ast::Expr> {
223 let expanded = expand(rules, invocation);
224 token_tree_to_expr(&expanded).unwrap()
225 }
226
227 pub(crate) fn assert_expansion(
228 rules: &MacroRules,
229 invocation: &str,
230 expansion: &str,
231 ) -> tt::Subtree {
211 let expanded = expand(rules, invocation); 232 let expanded = expand(rules, invocation);
212 assert_eq!(expanded.to_string(), expansion); 233 assert_eq!(expanded.to_string(), expansion);
213 234
@@ -224,6 +245,8 @@ impl_froms!(TokenTree: Leaf, Subtree);
224 245
225 let file = file.replace("C_C__C", "$crate"); 246 let file = file.replace("C_C__C", "$crate");
226 assert_eq!(tree, file,); 247 assert_eq!(tree, file,);
248
249 expanded
227 } 250 }
228 251
229 #[test] 252 #[test]
@@ -638,7 +661,7 @@ MACRO_ITEMS@[0; 40)
638 ); 661 );
639 662
640 assert_eq!( 663 assert_eq!(
641 expand_to_syntax(&rules, "foo! { 1 + 1 }").syntax().debug_dump().trim(), 664 expand_to_items(&rules, "foo! { 1 + 1 }").syntax().debug_dump().trim(),
642 r#"MACRO_ITEMS@[0; 15) 665 r#"MACRO_ITEMS@[0; 15)
643 FN_DEF@[0; 15) 666 FN_DEF@[0; 15)
644 FN_KW@[0; 2) "fn" 667 FN_KW@[0; 2) "fn"
@@ -914,6 +937,78 @@ MACRO_ITEMS@[0; 40)
914"#, 937"#,
915 ); 938 );
916 assert_expansion(&rules, r#"vec!();"#, r#"{let mut v = Vec :: new () ; v}"#); 939 assert_expansion(&rules, r#"vec!();"#, r#"{let mut v = Vec :: new () ; v}"#);
940 assert_expansion(
941 &rules,
942 r#"vec![1u32,2]"#,
943 r#"{let mut v = Vec :: new () ; v . push (1u32) ; v . push (2) ; v}"#,
944 );
945
946 assert_eq!(
947 expand_to_expr(&rules, r#"vec![1u32,2]"#).syntax().debug_dump().trim(),
948 r#"BLOCK_EXPR@[0; 45)
949 BLOCK@[0; 45)
950 L_CURLY@[0; 1) "{"
951 LET_STMT@[1; 20)
952 LET_KW@[1; 4) "let"
953 BIND_PAT@[4; 8)
954 MUT_KW@[4; 7) "mut"
955 NAME@[7; 8)
956 IDENT@[7; 8) "v"
957 EQ@[8; 9) "="
958 CALL_EXPR@[9; 19)
959 PATH_EXPR@[9; 17)
960 PATH@[9; 17)
961 PATH@[9; 12)
962 PATH_SEGMENT@[9; 12)
963 NAME_REF@[9; 12)
964 IDENT@[9; 12) "Vec"
965 COLONCOLON@[12; 14) "::"
966 PATH_SEGMENT@[14; 17)
967 NAME_REF@[14; 17)
968 IDENT@[14; 17) "new"
969 ARG_LIST@[17; 19)
970 L_PAREN@[17; 18) "("
971 R_PAREN@[18; 19) ")"
972 SEMI@[19; 20) ";"
973 EXPR_STMT@[20; 33)
974 METHOD_CALL_EXPR@[20; 32)
975 PATH_EXPR@[20; 21)
976 PATH@[20; 21)
977 PATH_SEGMENT@[20; 21)
978 NAME_REF@[20; 21)
979 IDENT@[20; 21) "v"
980 DOT@[21; 22) "."
981 NAME_REF@[22; 26)
982 IDENT@[22; 26) "push"
983 ARG_LIST@[26; 32)
984 L_PAREN@[26; 27) "("
985 LITERAL@[27; 31)
986 INT_NUMBER@[27; 31) "1u32"
987 R_PAREN@[31; 32) ")"
988 SEMI@[32; 33) ";"
989 EXPR_STMT@[33; 43)
990 METHOD_CALL_EXPR@[33; 42)
991 PATH_EXPR@[33; 34)
992 PATH@[33; 34)
993 PATH_SEGMENT@[33; 34)
994 NAME_REF@[33; 34)
995 IDENT@[33; 34) "v"
996 DOT@[34; 35) "."
997 NAME_REF@[35; 39)
998 IDENT@[35; 39) "push"
999 ARG_LIST@[39; 42)
1000 L_PAREN@[39; 40) "("
1001 LITERAL@[40; 41)
1002 INT_NUMBER@[40; 41) "2"
1003 R_PAREN@[41; 42) ")"
1004 SEMI@[42; 43) ";"
1005 PATH_EXPR@[43; 44)
1006 PATH@[43; 44)
1007 PATH_SEGMENT@[43; 44)
1008 NAME_REF@[43; 44)
1009 IDENT@[43; 44) "v"
1010 R_CURLY@[44; 45) "}""#
1011 );
917 } 1012 }
918 1013
919 #[test] 1014 #[test]