about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-03-11 23:31:24 +0000
committerGitHub <noreply@github.com>2022-03-11 23:31:24 +0000
commitbbe61565bb06cfbc5a0b7587467cc7c828eb0169 (patch)
tree27acf38f35af9500e2ea958418d344c6e3b219e6
parent224a255c5a7c75efb5567fc38b3772c5dbb094c4 (diff)
parent8a284306765512367c64a3c070648f560ed5bacf (diff)
downloadrust-bbe61565bb06cfbc5a0b7587467cc7c828eb0169.tar.gz
rust-bbe61565bb06cfbc5a0b7587467cc7c828eb0169.zip
Merge #11683
11683: fix: Stop wrapping ConstParam's default values in ConstArg r=Veykril a=steven-joruk

I came across this problem while implementing the assist for inlining type aliases. This was causing `ConstParam::default_val` to always return `None` for block expressions. The `const_arg_path` test was actually testing const params so I've updated that.

The only code that uses `default_val` right now is  the `extract_function` assist. I couldn't figure out how to hit the affected code path, if someone can give me hint I'll add a test.

This test in my WIP branch fails without this:
```rust
    #[test]
    fn param_expression() {
        check_assist(
            inline_type_alias,
            r#"
type A<const N: usize = { 1 }> = [u32; N];
fn main() {
    let a: $0A;
}
"#,
            r#"
type A<const N: usize = { 1 }> = [u32; N];
fn main() {
    let a: [u32; { 1 }];
}
"#,
        );
    }
```

Co-authored-by: Steven Joruk <steven@joruk.com>
-rw-r--r--crates/parser/src/grammar/generic_args.rs23
-rw-r--r--crates/parser/src/grammar/generic_params.rs10
-rw-r--r--crates/parser/test_data/parser/inline/ok/0188_const_arg_path.rs1
-rw-r--r--crates/parser/test_data/parser/inline/ok/0188_const_param_default_path.rast (renamed from crates/parser/test_data/parser/inline/ok/0188_const_arg_path.rast)19
-rw-r--r--crates/parser/test_data/parser/inline/ok/0188_const_param_default_path.rs1
-rw-r--r--crates/parser/test_data/parser/inline/ok/0199_const_param_default_expression.rast34
-rw-r--r--crates/parser/test_data/parser/inline/ok/0199_const_param_default_expression.rs1
-rw-r--r--crates/parser/test_data/parser/inline/ok/0200_const_param_default_literal.rast (renamed from crates/parser/test_data/parser/inline/ok/0165_const_param_defaults.rast)9
-rw-r--r--crates/parser/test_data/parser/inline/ok/0200_const_param_default_literal.rs (renamed from crates/parser/test_data/parser/inline/ok/0165_const_param_defaults.rs)0
9 files changed, 69 insertions, 29 deletions
diff --git a/crates/parser/src/grammar/generic_args.rs b/crates/parser/src/grammar/generic_args.rs
index 1148c6c35c5..948873ae2da 100644
--- a/crates/parser/src/grammar/generic_args.rs
+++ b/crates/parser/src/grammar/generic_args.rs
@@ -72,28 +72,24 @@ fn lifetime_arg(p: &mut Parser) {
     m.complete(p, LIFETIME_ARG);
 }
 
-// test const_arg
-// type T = S<92>;
-pub(super) fn const_arg(p: &mut Parser) {
-    let m = p.start();
+pub(super) fn const_arg_expr(p: &mut Parser) {
+    // The tests in here are really for `const_arg`, which wraps the content
+    // CONST_ARG.
     match p.current() {
         // test const_arg_block
         // type T = S<{90 + 2}>;
         T!['{'] => {
             expressions::block_expr(p);
-            m.complete(p, CONST_ARG);
         }
         // test const_arg_literal
         // type T = S<"hello", 0xdeadbeef>;
         k if k.is_literal() => {
             expressions::literal(p);
-            m.complete(p, CONST_ARG);
         }
         // test const_arg_bool_literal
         // type T = S<true>;
         T![true] | T![false] => {
             expressions::literal(p);
-            m.complete(p, CONST_ARG);
         }
         // test const_arg_negative_number
         // type T = S<-92>;
@@ -102,19 +98,24 @@ pub(super) fn const_arg(p: &mut Parser) {
             p.bump(T![-]);
             expressions::literal(p);
             lm.complete(p, PREFIX_EXPR);
-            m.complete(p, CONST_ARG);
         }
-        // test const_arg_path
-        // struct S<const N: u32 = u32::MAX>;
         _ => {
+            // This shouldn't be hit by `const_arg`
             let lm = p.start();
             paths::use_path(p);
             lm.complete(p, PATH_EXPR);
-            m.complete(p, CONST_ARG);
         }
     }
 }
 
+// test const_arg
+// type T = S<92>;
+pub(super) fn const_arg(p: &mut Parser) {
+    let m = p.start();
+    const_arg_expr(p);
+    m.complete(p, CONST_ARG);
+}
+
 fn type_arg(p: &mut Parser) {
     let m = p.start();
     types::type_(p);
diff --git a/crates/parser/src/grammar/generic_params.rs b/crates/parser/src/grammar/generic_params.rs
index 1009c67ffa1..fbd514078d4 100644
--- a/crates/parser/src/grammar/generic_params.rs
+++ b/crates/parser/src/grammar/generic_params.rs
@@ -79,10 +79,16 @@ fn const_param(p: &mut Parser, m: Marker) {
     }
 
     if p.at(T![=]) {
-        // test const_param_defaults
+        // test const_param_default_literal
         // struct A<const N: i32 = -1>;
         p.bump(T![=]);
-        generic_args::const_arg(p);
+
+        // test const_param_default_expression
+        // struct A<const N: i32 = { 1 }>;
+
+        // test const_param_default_path
+        // struct A<const N: i32 = i32::MAX>;
+        generic_args::const_arg_expr(p);
     }
 
     m.complete(p, CONST_PARAM);
diff --git a/crates/parser/test_data/parser/inline/ok/0188_const_arg_path.rs b/crates/parser/test_data/parser/inline/ok/0188_const_arg_path.rs
deleted file mode 100644
index ee075f3e50f..00000000000
--- a/crates/parser/test_data/parser/inline/ok/0188_const_arg_path.rs
+++ /dev/null
@@ -1 +0,0 @@
-struct S<const N: u32 = u32::MAX>;
diff --git a/crates/parser/test_data/parser/inline/ok/0188_const_arg_path.rast b/crates/parser/test_data/parser/inline/ok/0188_const_param_default_path.rast
index 440dfb06a38..11002bf98d0 100644
--- a/crates/parser/test_data/parser/inline/ok/0188_const_arg_path.rast
+++ b/crates/parser/test_data/parser/inline/ok/0188_const_param_default_path.rast
@@ -3,7 +3,7 @@ SOURCE_FILE
     STRUCT_KW "struct"
     WHITESPACE " "
     NAME
-      IDENT "S"
+      IDENT "A"
     GENERIC_PARAM_LIST
       L_ANGLE "<"
       CONST_PARAM
@@ -17,21 +17,20 @@ SOURCE_FILE
           PATH
             PATH_SEGMENT
               NAME_REF
-                IDENT "u32"
+                IDENT "i32"
         WHITESPACE " "
         EQ "="
         WHITESPACE " "
-        CONST_ARG
-          PATH_EXPR
+        PATH_EXPR
+          PATH
             PATH
-              PATH
-                PATH_SEGMENT
-                  NAME_REF
-                    IDENT "u32"
-              COLON2 "::"
               PATH_SEGMENT
                 NAME_REF
-                  IDENT "MAX"
+                  IDENT "i32"
+            COLON2 "::"
+            PATH_SEGMENT
+              NAME_REF
+                IDENT "MAX"
       R_ANGLE ">"
     SEMICOLON ";"
   WHITESPACE "\n"
diff --git a/crates/parser/test_data/parser/inline/ok/0188_const_param_default_path.rs b/crates/parser/test_data/parser/inline/ok/0188_const_param_default_path.rs
new file mode 100644
index 00000000000..f3da43ca06c
--- /dev/null
+++ b/crates/parser/test_data/parser/inline/ok/0188_const_param_default_path.rs
@@ -0,0 +1 @@
+struct A<const N: i32 = i32::MAX>;
diff --git a/crates/parser/test_data/parser/inline/ok/0199_const_param_default_expression.rast b/crates/parser/test_data/parser/inline/ok/0199_const_param_default_expression.rast
new file mode 100644
index 00000000000..0607ff54fbb
--- /dev/null
+++ b/crates/parser/test_data/parser/inline/ok/0199_const_param_default_expression.rast
@@ -0,0 +1,34 @@
+SOURCE_FILE
+  STRUCT
+    STRUCT_KW "struct"
+    WHITESPACE " "
+    NAME
+      IDENT "A"
+    GENERIC_PARAM_LIST
+      L_ANGLE "<"
+      CONST_PARAM
+        CONST_KW "const"
+        WHITESPACE " "
+        NAME
+          IDENT "N"
+        COLON ":"
+        WHITESPACE " "
+        PATH_TYPE
+          PATH
+            PATH_SEGMENT
+              NAME_REF
+                IDENT "i32"
+        WHITESPACE " "
+        EQ "="
+        WHITESPACE " "
+        BLOCK_EXPR
+          STMT_LIST
+            L_CURLY "{"
+            WHITESPACE " "
+            LITERAL
+              INT_NUMBER "1"
+            WHITESPACE " "
+            R_CURLY "}"
+      R_ANGLE ">"
+    SEMICOLON ";"
+  WHITESPACE "\n"
diff --git a/crates/parser/test_data/parser/inline/ok/0199_const_param_default_expression.rs b/crates/parser/test_data/parser/inline/ok/0199_const_param_default_expression.rs
new file mode 100644
index 00000000000..551bde0b008
--- /dev/null
+++ b/crates/parser/test_data/parser/inline/ok/0199_const_param_default_expression.rs
@@ -0,0 +1 @@
+struct A<const N: i32 = { 1 }>;
diff --git a/crates/parser/test_data/parser/inline/ok/0165_const_param_defaults.rast b/crates/parser/test_data/parser/inline/ok/0200_const_param_default_literal.rast
index 6de10353bf0..8e52313651c 100644
--- a/crates/parser/test_data/parser/inline/ok/0165_const_param_defaults.rast
+++ b/crates/parser/test_data/parser/inline/ok/0200_const_param_default_literal.rast
@@ -21,11 +21,10 @@ SOURCE_FILE
         WHITESPACE " "
         EQ "="
         WHITESPACE " "
-        CONST_ARG
-          PREFIX_EXPR
-            MINUS "-"
-            LITERAL
-              INT_NUMBER "1"
+        PREFIX_EXPR
+          MINUS "-"
+          LITERAL
+            INT_NUMBER "1"
       R_ANGLE ">"
     SEMICOLON ";"
   WHITESPACE "\n"
diff --git a/crates/parser/test_data/parser/inline/ok/0165_const_param_defaults.rs b/crates/parser/test_data/parser/inline/ok/0200_const_param_default_literal.rs
index 879ecffa75d..879ecffa75d 100644
--- a/crates/parser/test_data/parser/inline/ok/0165_const_param_defaults.rs
+++ b/crates/parser/test_data/parser/inline/ok/0200_const_param_default_literal.rs