mirror of
				https://github.com/rust-lang/rust-analyzer.git
				synced 2025-11-03 13:13:18 +00:00 
			
		
		
		
	Fix a bug for single dollar sign macro
This commit is contained in:
		
							parent
							
								
									b55d22e060
								
							
						
					
					
						commit
						3dc3d9d18f
					
				@ -86,10 +86,13 @@ pub(crate) fn macro_def(
 | 
			
		||||
                log::warn!("fail on macro_def to token tree: {:#?}", arg);
 | 
			
		||||
                None
 | 
			
		||||
            })?;
 | 
			
		||||
            let rules = MacroRules::parse(&tt).ok().or_else(|| {
 | 
			
		||||
                log::warn!("fail on macro_def parse: {:#?}", tt);
 | 
			
		||||
                None
 | 
			
		||||
            })?;
 | 
			
		||||
            let rules = match MacroRules::parse(&tt) {
 | 
			
		||||
                Ok(it) => it,
 | 
			
		||||
                Err(err) => {
 | 
			
		||||
                    log::warn!("fail on macro_def parse: error: {:#?} {:#?}", err, tt);
 | 
			
		||||
                    return None;
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
            Some(Arc::new((TokenExpander::MacroRules(rules), tmap)))
 | 
			
		||||
        }
 | 
			
		||||
        MacroDefKind::BuiltIn(expander) => {
 | 
			
		||||
@ -150,7 +153,9 @@ pub(crate) fn parse_macro(
 | 
			
		||||
            // Note:
 | 
			
		||||
            // The final goal we would like to make all parse_macro success,
 | 
			
		||||
            // such that the following log will not call anyway.
 | 
			
		||||
            log::warn!("fail on macro_parse: (reason: {})", err,);
 | 
			
		||||
            let loc: MacroCallLoc = db.lookup_intern_macro(macro_call_id);
 | 
			
		||||
            let node = loc.kind.node(db);
 | 
			
		||||
            log::warn!("fail on macro_parse: (reason: {} macro_call: {:#})", err, node.value);
 | 
			
		||||
        })
 | 
			
		||||
        .ok()?;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -90,7 +90,11 @@ fn next_op<'a>(
 | 
			
		||||
) -> Result<Op<'a>, ExpandError> {
 | 
			
		||||
    let res = match first {
 | 
			
		||||
        tt::TokenTree::Leaf(tt::Leaf::Punct(tt::Punct { char: '$', .. })) => {
 | 
			
		||||
            let second = src.next().ok_or_else(|| err!("bad var 1"))?;
 | 
			
		||||
            // Note that the '$' itself is a valid token inside macro_rules.
 | 
			
		||||
            let second = match src.next() {
 | 
			
		||||
                None => return Ok(Op::TokenTree(first)),
 | 
			
		||||
                Some(it) => it,
 | 
			
		||||
            };
 | 
			
		||||
            match second {
 | 
			
		||||
                tt::TokenTree::Subtree(subtree) => {
 | 
			
		||||
                    let (separator, kind) = parse_repeat(src)?;
 | 
			
		||||
 | 
			
		||||
@ -23,6 +23,7 @@ mod rule_parsing {
 | 
			
		||||
        check("($($i:ident)*) => ($_)");
 | 
			
		||||
        check("($($true:ident)*) => ($true)");
 | 
			
		||||
        check("($($false:ident)*) => ($false)");
 | 
			
		||||
        check("($) => ($)");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user