fix: Stop wrapping ConstParam's default values in ConstArg

This was causing ConstParam::default_val to always return None for block
expressions.

CONST_ARG@24..29
  BLOCK_EXPR@24..29
    ...
This commit is contained in:
Steven Joruk 2022-03-11 19:22:49 +00:00
parent 224a255c5a
commit 972f50da2d
8 changed files with 82 additions and 50 deletions

View File

@ -72,28 +72,24 @@ fn lifetime_arg(p: &mut Parser) {
m.complete(p, LIFETIME_ARG); m.complete(p, LIFETIME_ARG);
} }
// test const_arg pub(super) fn const_arg_content(p: &mut Parser) {
// type T = S<92>; // The tests in here are really for `const_arg`, which wraps the content
pub(super) fn const_arg(p: &mut Parser) { // CONST_ARG.
let m = p.start();
match p.current() { match p.current() {
// test const_arg_block // test const_arg_block
// type T = S<{90 + 2}>; // type T = S<{90 + 2}>;
T!['{'] => { T!['{'] => {
expressions::block_expr(p); expressions::block_expr(p);
m.complete(p, CONST_ARG);
} }
// test const_arg_literal // test const_arg_literal
// type T = S<"hello", 0xdeadbeef>; // type T = S<"hello", 0xdeadbeef>;
k if k.is_literal() => { k if k.is_literal() => {
expressions::literal(p); expressions::literal(p);
m.complete(p, CONST_ARG);
} }
// test const_arg_bool_literal // test const_arg_bool_literal
// type T = S<true>; // type T = S<true>;
T![true] | T![false] => { T![true] | T![false] => {
expressions::literal(p); expressions::literal(p);
m.complete(p, CONST_ARG);
} }
// test const_arg_negative_number // test const_arg_negative_number
// type T = S<-92>; // type T = S<-92>;
@ -102,19 +98,25 @@ pub(super) fn const_arg(p: &mut Parser) {
p.bump(T![-]); p.bump(T![-]);
expressions::literal(p); expressions::literal(p);
lm.complete(p, PREFIX_EXPR); lm.complete(p, PREFIX_EXPR);
m.complete(p, CONST_ARG);
} }
// test const_arg_path // test const_arg_path
// struct S<const N: u32 = u32::MAX>; // type T = S<u32::MAX>;
_ => { _ => {
let lm = p.start(); let lm = p.start();
paths::use_path(p); paths::use_path(p);
lm.complete(p, PATH_EXPR); 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_content(p);
m.complete(p, CONST_ARG);
}
fn type_arg(p: &mut Parser) { fn type_arg(p: &mut Parser) {
let m = p.start(); let m = p.start();
types::type_(p); types::type_(p);

View File

@ -79,10 +79,13 @@ fn const_param(p: &mut Parser, m: Marker) {
} }
if p.at(T![=]) { if p.at(T![=]) {
// test const_param_defaults // test const_param_default_literal
// struct A<const N: i32 = -1>; // struct A<const N: i32 = -1>;
p.bump(T![=]); p.bump(T![=]);
generic_args::const_arg(p);
// test const_param_default_expression
// struct A<const N: i32 = { 1 }>;
generic_args::const_arg_content(p);
} }
m.complete(p, CONST_PARAM); m.complete(p, CONST_PARAM);

View File

@ -1,37 +1,30 @@
SOURCE_FILE SOURCE_FILE
STRUCT TYPE_ALIAS
STRUCT_KW "struct" TYPE_KW "type"
WHITESPACE " " WHITESPACE " "
NAME NAME
IDENT "S" IDENT "T"
GENERIC_PARAM_LIST WHITESPACE " "
L_ANGLE "<" EQ "="
CONST_PARAM WHITESPACE " "
CONST_KW "const" PATH_TYPE
WHITESPACE " " PATH
NAME PATH_SEGMENT
IDENT "N" NAME_REF
COLON ":" IDENT "S"
WHITESPACE " " GENERIC_ARG_LIST
PATH_TYPE L_ANGLE "<"
PATH TYPE_ARG
PATH_SEGMENT PATH_TYPE
NAME_REF PATH
IDENT "u32" PATH
WHITESPACE " " PATH_SEGMENT
EQ "=" NAME_REF
WHITESPACE " " IDENT "u32"
CONST_ARG COLON2 "::"
PATH_EXPR PATH_SEGMENT
PATH NAME_REF
PATH IDENT "MAX"
PATH_SEGMENT R_ANGLE ">"
NAME_REF
IDENT "u32"
COLON2 "::"
PATH_SEGMENT
NAME_REF
IDENT "MAX"
R_ANGLE ">"
SEMICOLON ";" SEMICOLON ";"
WHITESPACE "\n" WHITESPACE "\n"

View File

@ -1 +1 @@
struct S<const N: u32 = u32::MAX>; type T = S<u32::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 " " WHITESPACE " "
EQ "=" EQ "="
WHITESPACE " " WHITESPACE " "
CONST_ARG PREFIX_EXPR
PREFIX_EXPR MINUS "-"
MINUS "-" LITERAL
LITERAL INT_NUMBER "1"
INT_NUMBER "1"
R_ANGLE ">" R_ANGLE ">"
SEMICOLON ";" SEMICOLON ";"
WHITESPACE "\n" WHITESPACE "\n"