diff options
| author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-03-11 23:31:24 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-03-11 23:31:24 +0000 |
| commit | bbe61565bb06cfbc5a0b7587467cc7c828eb0169 (patch) | |
| tree | 27acf38f35af9500e2ea958418d344c6e3b219e6 | |
| parent | 224a255c5a7c75efb5567fc38b3772c5dbb094c4 (diff) | |
| parent | 8a284306765512367c64a3c070648f560ed5bacf (diff) | |
| download | rust-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.rs | 23 | ||||
| -rw-r--r-- | crates/parser/src/grammar/generic_params.rs | 10 | ||||
| -rw-r--r-- | crates/parser/test_data/parser/inline/ok/0188_const_arg_path.rs | 1 | ||||
| -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.rs | 1 | ||||
| -rw-r--r-- | crates/parser/test_data/parser/inline/ok/0199_const_param_default_expression.rast | 34 | ||||
| -rw-r--r-- | crates/parser/test_data/parser/inline/ok/0199_const_param_default_expression.rs | 1 | ||||
| -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 |
