//! FIXME: write short doc here
-use ra_parser::{
- FragmentKind::{self, *},
- ParseError, TreeSink,
-};
+use ra_parser::{FragmentKind, ParseError, TreeSink};
use ra_syntax::{
ast, AstNode, AstToken, NodeOrToken, Parse, SmolStr, SyntaxKind, SyntaxKind::*, SyntaxNode,
SyntaxTreeBuilder, TextRange, TextUnit, T,
// * ImplItems(SmallVec<[ast::ImplItem; 1]>)
// * ForeignItems(SmallVec<[ast::ForeignItem; 1]>
-fn fragment_to_syntax_node(
+pub fn token_tree_to_syntax_node(
tt: &tt::Subtree,
fragment_kind: FragmentKind,
) -> Result<(Parse<SyntaxNode>, RevTokenMap), ExpandError> {
Ok((parse, range_map))
}
-macro_rules! impl_token_tree_conversions {
- ($($(#[$attr:meta])* $name:ident => ($kind:ident, $t:ty) ),*) => {
- $(
- $(#[$attr])*
- pub fn $name(tt: &tt::Subtree) -> Result<(Parse<$t>, RevTokenMap), ExpandError> {
- let (parse, map) = fragment_to_syntax_node(tt, $kind)?;
- parse.cast().ok_or_else(|| crate::ExpandError::ConversionError).map(|p| (p, map))
- }
- )*
- }
-}
-
-impl_token_tree_conversions! {
- /// Parses the token tree (result of macro expansion) to an expression
- token_tree_to_expr => (Expr, ast::Expr),
- /// Parses the token tree (result of macro expansion) to a Pattern
- token_tree_to_pat => (Pattern, ast::Pat),
- /// Parses the token tree (result of macro expansion) to a Type
- token_tree_to_ty => (Type, ast::TypeRef),
- /// Parses the token tree (result of macro expansion) as a sequence of stmts
- token_tree_to_macro_stmts => (Statements, ast::MacroStmts),
- /// Parses the token tree (result of macro expansion) as a sequence of items
- token_tree_to_items => (Items, ast::MacroItems)
-}
-
impl TokenMap {
pub fn relative_range_of(&self, tt: tt::TokenId) -> Option<TextRange> {
let idx = tt.0 as usize;
"#,
);
let expansion = expand(&rules, "stmts!();");
- assert!(token_tree_to_expr(&expansion).is_err());
+ assert!(token_tree_to_syntax_node(&expansion, FragmentKind::Expr).is_err());
}
}
+use ra_parser::FragmentKind;
use ra_syntax::{ast, AstNode, NodeOrToken, WalkEvent};
use test_utils::assert_eq_text;
"#,
);
let expanded = expand(&rules, "foo! { 1 + 1}");
- let tree = token_tree_to_items(&expanded).unwrap().0.tree();
+ let tree = token_tree_to_syntax_node(&expanded, FragmentKind::Items).unwrap().0.syntax_node();
- let dump = format!("{:#?}", tree.syntax());
+ let dump = format!("{:#?}", tree);
assert_eq_text!(
dump.trim(),
r#"MACRO_ITEMS@[0; 15)
",
);
let expansion = expand(&rules, "structs!(Foo, Bar);");
- let tree = token_tree_to_items(&expansion).unwrap().0.tree();
+ let tree = token_tree_to_syntax_node(&expansion, FragmentKind::Items).unwrap().0.syntax_node();
assert_eq!(
- format!("{:#?}", tree.syntax()).trim(),
+ format!("{:#?}", tree).trim(),
r#"
MACRO_ITEMS@[0; 40)
STRUCT_DEF@[0; 20)
);
let expanded = expand(&rules, "foo!{}");
- let stmts = token_tree_to_macro_stmts(&expanded).unwrap().0.tree();
+ let stmts =
+ token_tree_to_syntax_node(&expanded, FragmentKind::Statements).unwrap().0.syntax_node();
assert_eq!(
- format!("{:#?}", stmts.syntax()).trim(),
+ format!("{:#?}", stmts).trim(),
r#"MACRO_STMTS@[0; 15)
LET_STMT@[0; 7)
LET_KW@[0; 3) "let"
}
"#,
);
- assert_expansion(MacroKind::Items, &rules, r#"
+ assert_expansion(
+ MacroKind::Items,
+ &rules,
+ r#"
foo! {
extern crate a;
mod b;
extern {}
type T = u8;
}
-"#, r#"extern crate a ; mod b ; mod c {} use d ; const E : i32 = 0 ; static F : i32 = 0 ; impl G {} struct H ; enum I {Foo} trait J {} fn h () {} extern {} type T = u8 ;"#);
+"#,
+ r#"extern crate a ; mod b ; mod c {} use d ; const E : i32 = 0 ; static F : i32 = 0 ; impl G {} struct H ; enum I {Foo} trait J {} fn h () {} extern {} type T = u8 ;"#,
+ );
}
#[test]
);
let expansion = expand(&rules, r#"vec![1u32,2];"#);
- let tree = token_tree_to_expr(&expansion).unwrap().0.tree();
+ let tree = token_tree_to_syntax_node(&expansion, FragmentKind::Expr).unwrap().0.syntax_node();
assert_eq!(
- format!("{:#?}", tree.syntax()).trim(),
+ format!("{:#?}", tree).trim(),
r#"BLOCK_EXPR@[0; 45)
BLOCK@[0; 45)
L_CURLY@[0; 1) "{"
"#,
);
- assert_expansion(MacroKind::Items, &rules, r#"generate_pattern_iterators ! ( double ended ; with # [ stable ( feature = "rust1" , since = "1.0.0" ) ] , Split , RSplit , & 'a str );"#,
- "fn foo () {}");
+ assert_expansion(
+ MacroKind::Items,
+ &rules,
+ r#"generate_pattern_iterators ! ( double ended ; with # [ stable ( feature = "rust1" , since = "1.0.0" ) ] , Split , RSplit , & 'a str );"#,
+ "fn foo () {}",
+ );
}
#[test]
"#,
);
- assert_expansion(MacroKind::Items, &rules, r#"impl_nonzero_fmt! { # [stable(feature= "nonzero",since="1.28.0")] (Debug,Display,Binary,Octal,LowerHex,UpperHex) for NonZeroU8}"#,
- "fn foo () {}");
+ assert_expansion(
+ MacroKind::Items,
+ &rules,
+ r#"impl_nonzero_fmt! { # [stable(feature= "nonzero",since="1.28.0")] (Debug,Display,Binary,Octal,LowerHex,UpperHex) for NonZeroU8}"#,
+ "fn foo () {}",
+ );
}
#[test]
"#,
);
- assert_expansion(MacroKind::Items, &rules, r#"__cfg_if_items ! { ( rustdoc , ) ; ( ( ) ( # [ cfg ( any ( target_os = "redox" , unix ) ) ] # [ stable ( feature = "rust1" , since = "1.0.0" ) ] pub use sys :: ext as unix ; # [ cfg ( windows ) ] # [ stable ( feature = "rust1" , since = "1.0.0" ) ] pub use sys :: ext as windows ; # [ cfg ( any ( target_os = "linux" , target_os = "l4re" ) ) ] pub mod linux ; ) ) , }"#,
- "__cfg_if_items ! {(rustdoc ,) ;}");
+ assert_expansion(
+ MacroKind::Items,
+ &rules,
+ r#"__cfg_if_items ! { ( rustdoc , ) ; ( ( ) ( # [ cfg ( any ( target_os = "redox" , unix ) ) ] # [ stable ( feature = "rust1" , since = "1.0.0" ) ] pub use sys :: ext as unix ; # [ cfg ( windows ) ] # [ stable ( feature = "rust1" , since = "1.0.0" ) ] pub use sys :: ext as windows ; # [ cfg ( any ( target_os = "linux" , target_os = "l4re" ) ) ] pub mod linux ; ) ) , }"#,
+ "__cfg_if_items ! {(rustdoc ,) ;}",
+ );
}
#[test]
"#,
"__cfg_if_items ! {() ; ((target_env = \"msvc\") ()) , ((all (target_arch = \"wasm32\" , not (target_os = \"emscripten\"))) ()) , (() (mod libunwind ; pub use libunwind :: * ;)) ,}");
- assert_expansion(MacroKind::Items, &rules, r#"
+ assert_expansion(
+ MacroKind::Items,
+ &rules,
+ r#"
cfg_if ! { @ __apply cfg ( all ( not ( any ( not ( any ( target_os = "solaris" , target_os = "illumos" ) ) ) ) ) ) , }
"#,
- ""
+ "",
);
}
}"#,
);
- let expanded = expand(&rules, r#"
+ let expanded = expand(
+ &rules,
+ r#"
RIDL!{interface ID3D11Asynchronous(ID3D11AsynchronousVtbl): ID3D11DeviceChild(ID3D11DeviceChildVtbl) {
fn GetDataSize(&mut self) -> UINT
-}}"#);
+}}"#,
+ );
assert_eq!(expanded.to_string(), "impl ID3D11Asynchronous {pub unsafe fn GetDataSize (& mut self) -> UINT {((* self . lpVtbl) .GetDataSize) (self)}}");
}
#[test]
fn test_empty_repeat_vars_in_empty_repeat_vars() {
- let rules = create_rules(r#"
+ let rules = create_rules(
+ r#"
macro_rules! delegate_impl {
([$self_type:ident, $self_wrap:ty, $self_map:ident]
pub trait $name:ident $(: $sup:ident)* $(+ $more_sup:ident)* {
}
}
}
-"#);
+"#,
+ );
- assert_expansion(MacroKind::Items, &rules, r#"delegate_impl ! {[G , & 'a mut G , deref] pub trait Data : GraphBase {@ section type type NodeWeight ;}}"#, "impl <> Data for & \'a mut G where G : Data {}");
+ assert_expansion(
+ MacroKind::Items,
+ &rules,
+ r#"delegate_impl ! {[G , & 'a mut G , deref] pub trait Data : GraphBase {@ section type type NodeWeight ;}}"#,
+ "impl <> Data for & \'a mut G where G : Data {}",
+ );
}
pub(crate) fn create_rules(macro_definition: &str) -> MacroRules {
};
let (expanded_tree, expected_tree) = match kind {
MacroKind::Items => {
- let expanded_tree = token_tree_to_items(&expanded).unwrap().0.tree();
- let expected_tree = token_tree_to_items(&expected).unwrap().0.tree();
+ let expanded_tree =
+ token_tree_to_syntax_node(&expanded, FragmentKind::Items).unwrap().0.syntax_node();
+ let expected_tree =
+ token_tree_to_syntax_node(&expected, FragmentKind::Items).unwrap().0.syntax_node();
(
- debug_dump_ignore_spaces(expanded_tree.syntax()).trim().to_string(),
- debug_dump_ignore_spaces(expected_tree.syntax()).trim().to_string(),
+ debug_dump_ignore_spaces(&expanded_tree).trim().to_string(),
+ debug_dump_ignore_spaces(&expected_tree).trim().to_string(),
)
}
MacroKind::Stmts => {
- let expanded_tree = token_tree_to_macro_stmts(&expanded).unwrap().0.tree();
- let expected_tree = token_tree_to_macro_stmts(&expected).unwrap().0.tree();
+ let expanded_tree = token_tree_to_syntax_node(&expanded, FragmentKind::Statements)
+ .unwrap()
+ .0
+ .syntax_node();
+ let expected_tree = token_tree_to_syntax_node(&expected, FragmentKind::Statements)
+ .unwrap()
+ .0
+ .syntax_node();
(
- debug_dump_ignore_spaces(expanded_tree.syntax()).trim().to_string(),
- debug_dump_ignore_spaces(expected_tree.syntax()).trim().to_string(),
+ debug_dump_ignore_spaces(&expanded_tree).trim().to_string(),
+ debug_dump_ignore_spaces(&expected_tree).trim().to_string(),
)
}
};