]> git.lizzy.rs Git - rust.git/commitdiff
Implement 'vec![expr; expr]'
authortopecongiro <seuchida@gmail.com>
Fri, 19 May 2017 10:25:53 +0000 (19:25 +0900)
committertopecongiro <seuchida@gmail.com>
Tue, 23 May 2017 02:32:09 +0000 (11:32 +0900)
src/macros.rs
tests/source/macros.rs
tests/target/macros.rs
tests/target/match.rs

index b5644fb014c5c876dfb0db7be5270c69594d96ee..352c39f317c1fe0dfd374f1dbd83eb517f7253bb 100644 (file)
@@ -29,7 +29,7 @@
 use Shape;
 use codemap::SpanUtils;
 use rewrite::{Rewrite, RewriteContext};
-use expr::{rewrite_call, rewrite_array};
+use expr::{rewrite_call, rewrite_array, rewrite_pair};
 use comment::{FindUncommented, contains_comment};
 
 const FORCED_BRACKET_MACROS: &'static [&'static str] = &["vec!"];
@@ -105,6 +105,7 @@ pub fn rewrite_macro(mac: &ast::Mac,
 
     let mut parser = tts_to_parser(context.parse_session, mac.node.tts.clone());
     let mut expr_vec = Vec::new();
+    let mut vec_with_semi = false;
 
     if MacroStyle::Braces != style {
         loop {
@@ -128,6 +129,29 @@ pub fn rewrite_macro(mac: &ast::Mac,
             match parser.token {
                 Token::Eof => break,
                 Token::Comma => (),
+                Token::Semi => {
+                    // Try to parse `vec![expr; expr]`
+                    if FORCED_BRACKET_MACROS.contains(&&macro_name[..]) {
+                        parser.bump();
+                        if parser.token != Token::Eof {
+                            match parser.parse_expr() {
+                                Ok(expr) => {
+                                    if context.parse_session.span_diagnostic.has_errors() {
+                                        return None;
+                                    }
+                                    expr_vec.push(expr);
+                                    parser.bump();
+                                    if parser.token == Token::Eof && expr_vec.len() == 2 {
+                                        vec_with_semi = true;
+                                        break;
+                                    }
+                                }
+                                Err(mut e) => e.cancel(),
+                            }
+                        }
+                    }
+                    return None;
+                }
                 _ => return None,
             }
 
@@ -156,18 +180,35 @@ pub fn rewrite_macro(mac: &ast::Mac,
             })
         }
         MacroStyle::Brackets => {
-            // Format macro invocation as array literal.
-            let extra_offset = macro_name.len();
-            let shape = try_opt!(shape.shrink_left(extra_offset));
-            let rewrite =
-                try_opt!(rewrite_array(expr_vec.iter().map(|x| &**x),
-                                       mk_sp(context.codemap.span_after(mac.span,
-                                                                        original_style.opener()),
-                                             mac.span.hi - BytePos(1)),
-                                       context,
-                                       shape));
-
-            Some(format!("{}{}", macro_name, rewrite))
+            let mac_shape = try_opt!(shape.shrink_left(macro_name.len()));
+            // Handle special case: `vec![expr; expr]`
+            if vec_with_semi {
+                let (lbr, rbr) = if context.config.spaces_within_square_brackets {
+                    ("[ ", " ]")
+                } else {
+                    ("[", "]")
+                };
+                rewrite_pair(&*expr_vec[0],
+                             &*expr_vec[1],
+                             lbr,
+                             "; ",
+                             rbr,
+                             context,
+                             mac_shape)
+                    .map(|s| format!("{}{}", macro_name, s))
+            } else {
+                // Format macro invocation as array literal.
+                let rewrite =
+                    try_opt!(rewrite_array(expr_vec.iter().map(|x| &**x),
+                                           mk_sp(context.codemap.span_after(mac.span,
+                                                                            original_style
+                                                                                .opener()),
+                                                 mac.span.hi - BytePos(1)),
+                                           context,
+                                           mac_shape));
+
+                Some(format!("{}{}", macro_name, rewrite))
+            }
         }
         MacroStyle::Braces => {
             // Skip macro invocations with braces, for now.
index 3eee8c543ba709fa0294601e620d13e7c2508d13..afaf67359ed375b910c5965f00d1a6c96f46cc94 100644 (file)
@@ -34,6 +34,13 @@ fn main() {
     a,   
     ];
     
+    vec![a; b];
+    vec!(a; b);
+    vec!{a; b};
+
+    vec![a, b; c];
+    vec![a; b, c];
+
     unknown_bracket_macro__comma_should_not_be_stripped![
     a,
     ];
index 1fd8130f824b30e333134871b74900e1bbee9022..2f65b4e4f6e4f77ef34617a9287a14e360968443 100644 (file)
@@ -38,6 +38,13 @@ fn main() {
     // Trailing spaces after a comma
     vec![a];
 
+    vec![a; b];
+    vec![a; b];
+    vec![a; b];
+
+    vec![a, b; c];
+    vec![a; b, c];
+
     unknown_bracket_macro__comma_should_not_be_stripped![
     a,
     ];
index 15b7889e4767626373a87f49ff33307261ec439e..09df7ebd55fdf7e997e5008bca1cc464ed4db5b5 100644 (file)
@@ -158,19 +158,19 @@ fn issue355() {
     match mac {
         a => println!("a", b),
         b => vec![1, 2],
-        c => vec!(3; 4),
+        c => vec![3; 4],
         d => println!("a", b),
         e => vec![1, 2],
-        f => vec!(3; 4),
+        f => vec![3; 4],
         h => println!("a", b), // h comment
         i => vec![1, 2], // i comment
-        j => vec!(3; 4), // j comment
+        j => vec![3; 4], // j comment
         // k comment
         k => println!("a", b),
         // l comment
         l => vec![1, 2],
         // m comment
-        m => vec!(3; 4),
+        m => vec![3; 4],
         // Rewrite splits macro
         nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn => {
             println!("a", b)
@@ -182,7 +182,7 @@ fn issue355() {
         // Macro support fails to recognise this macro as splitable
         // We push the whole expr to a new line, TODO split this macro as well
         pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp => {
-            vec!(3; 4)
+            vec![3; 4]
         }
         // q, r and s: Rewrite splits match arm
         qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq => {
@@ -192,19 +192,19 @@ fn issue355() {
             vec![1, 2]
         }
         ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss => {
-            vec!(3; 4)
+            vec![3; 4]
         }
         // Funky bracketing styles
         t => println!{"a", b},
         u => vec![1, 2],
-        v => vec!{3; 4},
+        v => vec![3; 4],
         w => println!["a", b],
         x => vec![1, 2],
         y => vec![3; 4],
         // Brackets with comments
         tc => println!{"a", b}, // comment
         uc => vec![1, 2], // comment
-        vc => vec!{3; 4}, // comment
+        vc => vec![3; 4], // comment
         wc => println!["a", b], // comment
         xc => vec![1, 2], // comment
         yc => vec![3; 4], // comment