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>
This commit is contained in:
bors[bot] 2022-03-11 23:31:24 +00:00 committed by GitHub
commit bbe61565bb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 69 additions and 29 deletions

View file

@ -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);

View file

@ -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);

View file

@ -1 +0,0 @@
struct S<const N: u32 = u32::MAX>;

View file

@ -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"

View file

@ -0,0 +1 @@
struct A<const N: i32 = i32::MAX>;

View file

@ -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"

View file

@ -0,0 +1 @@
struct A<const N: i32 = { 1 }>;

View file

@ -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"