From 972f50da2dc5b9015382b2908b41df7d1b52beb3 Mon Sep 17 00:00:00 2001 From: Steven Joruk Date: Fri, 11 Mar 2022 19:22:49 +0000 Subject: [PATCH 1/3] 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 ... --- crates/parser/src/grammar/generic_args.rs | 22 +++---- crates/parser/src/grammar/generic_params.rs | 7 ++- .../parser/inline/ok/0188_const_arg_path.rast | 57 ++++++++----------- .../parser/inline/ok/0188_const_arg_path.rs | 2 +- .../0199_const_param_default_expression.rast | 34 +++++++++++ .../ok/0199_const_param_default_expression.rs | 1 + ... => 0200_const_param_default_literal.rast} | 9 ++- ...rs => 0200_const_param_default_literal.rs} | 0 8 files changed, 82 insertions(+), 50 deletions(-) create mode 100644 crates/parser/test_data/parser/inline/ok/0199_const_param_default_expression.rast create mode 100644 crates/parser/test_data/parser/inline/ok/0199_const_param_default_expression.rs rename crates/parser/test_data/parser/inline/ok/{0165_const_param_defaults.rast => 0200_const_param_default_literal.rast} (81%) rename crates/parser/test_data/parser/inline/ok/{0165_const_param_defaults.rs => 0200_const_param_default_literal.rs} (100%) diff --git a/crates/parser/src/grammar/generic_args.rs b/crates/parser/src/grammar/generic_args.rs index 1148c6c35c59..bba312009b93 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_content(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; T![true] | T![false] => { expressions::literal(p); - m.complete(p, CONST_ARG); } // test const_arg_negative_number // type T = S<-92>; @@ -102,19 +98,25 @@ 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; + // type T = S; _ => { 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_content(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 1009c67ffa13..1c5af92b874e 100644 --- a/crates/parser/src/grammar/generic_params.rs +++ b/crates/parser/src/grammar/generic_params.rs @@ -79,10 +79,13 @@ fn const_param(p: &mut Parser, m: Marker) { } if p.at(T![=]) { - // test const_param_defaults + // test const_param_default_literal // struct A; p.bump(T![=]); - generic_args::const_arg(p); + + // test const_param_default_expression + // struct A; + generic_args::const_arg_content(p); } m.complete(p, CONST_PARAM); 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_arg_path.rast index 440dfb06a38b..62ddefa5a8d4 100644 --- a/crates/parser/test_data/parser/inline/ok/0188_const_arg_path.rast +++ b/crates/parser/test_data/parser/inline/ok/0188_const_arg_path.rast @@ -1,37 +1,30 @@ SOURCE_FILE - STRUCT - STRUCT_KW "struct" + TYPE_ALIAS + TYPE_KW "type" WHITESPACE " " NAME - IDENT "S" - GENERIC_PARAM_LIST - L_ANGLE "<" - CONST_PARAM - CONST_KW "const" - WHITESPACE " " - NAME - IDENT "N" - COLON ":" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "u32" - WHITESPACE " " - EQ "=" - WHITESPACE " " - CONST_ARG - PATH_EXPR - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "u32" - COLON2 "::" - PATH_SEGMENT - NAME_REF - IDENT "MAX" - R_ANGLE ">" + IDENT "T" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "S" + GENERIC_ARG_LIST + L_ANGLE "<" + TYPE_ARG + PATH_TYPE + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "u32" + COLON2 "::" + PATH_SEGMENT + NAME_REF + IDENT "MAX" + R_ANGLE ">" SEMICOLON ";" WHITESPACE "\n" 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 index ee075f3e50f3..1383d0d6d566 100644 --- 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 @@ -1 +1 @@ -struct S; +type T = S; 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 000000000000..0607ff54fbb7 --- /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 000000000000..551bde0b0086 --- /dev/null +++ b/crates/parser/test_data/parser/inline/ok/0199_const_param_default_expression.rs @@ -0,0 +1 @@ +struct A; 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 similarity index 81% rename from crates/parser/test_data/parser/inline/ok/0165_const_param_defaults.rast rename to crates/parser/test_data/parser/inline/ok/0200_const_param_default_literal.rast index 6de10353bf06..8e52313651ce 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 similarity index 100% rename from crates/parser/test_data/parser/inline/ok/0165_const_param_defaults.rs rename to crates/parser/test_data/parser/inline/ok/0200_const_param_default_literal.rs From e84453c47f847f92a038eceb5071a308d2515fa7 Mon Sep 17 00:00:00 2001 From: Steven Joruk Date: Fri, 11 Mar 2022 20:38:03 +0000 Subject: [PATCH 2/3] refactor: Rename const_arg_content to const_arg_expr --- crates/parser/src/grammar/generic_args.rs | 4 ++-- crates/parser/src/grammar/generic_params.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/parser/src/grammar/generic_args.rs b/crates/parser/src/grammar/generic_args.rs index bba312009b93..762d0218c1fb 100644 --- a/crates/parser/src/grammar/generic_args.rs +++ b/crates/parser/src/grammar/generic_args.rs @@ -72,7 +72,7 @@ fn lifetime_arg(p: &mut Parser) { m.complete(p, LIFETIME_ARG); } -pub(super) fn const_arg_content(p: &mut Parser) { +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() { @@ -113,7 +113,7 @@ pub(super) fn const_arg_content(p: &mut Parser) { // type T = S<92>; pub(super) fn const_arg(p: &mut Parser) { let m = p.start(); - const_arg_content(p); + const_arg_expr(p); m.complete(p, CONST_ARG); } diff --git a/crates/parser/src/grammar/generic_params.rs b/crates/parser/src/grammar/generic_params.rs index 1c5af92b874e..9797de1ff0b5 100644 --- a/crates/parser/src/grammar/generic_params.rs +++ b/crates/parser/src/grammar/generic_params.rs @@ -85,7 +85,7 @@ fn const_param(p: &mut Parser, m: Marker) { // test const_param_default_expression // struct A; - generic_args::const_arg_content(p); + generic_args::const_arg_expr(p); } m.complete(p, CONST_PARAM); From 8a284306765512367c64a3c070648f560ed5bacf Mon Sep 17 00:00:00 2001 From: Steven Joruk Date: Fri, 11 Mar 2022 21:44:18 +0000 Subject: [PATCH 3/3] refactor: Rename and move const_arg_path It wasn't testing the `const_arg` code path, it was actually hitting const_param's default value code path, so move it to the right place and rename it. --- crates/parser/src/grammar/generic_args.rs | 3 +- crates/parser/src/grammar/generic_params.rs | 3 ++ .../parser/inline/ok/0188_const_arg_path.rast | 30 ---------------- .../parser/inline/ok/0188_const_arg_path.rs | 1 - .../ok/0188_const_param_default_path.rast | 36 +++++++++++++++++++ .../ok/0188_const_param_default_path.rs | 1 + 6 files changed, 41 insertions(+), 33 deletions(-) delete mode 100644 crates/parser/test_data/parser/inline/ok/0188_const_arg_path.rast delete mode 100644 crates/parser/test_data/parser/inline/ok/0188_const_arg_path.rs create mode 100644 crates/parser/test_data/parser/inline/ok/0188_const_param_default_path.rast create mode 100644 crates/parser/test_data/parser/inline/ok/0188_const_param_default_path.rs diff --git a/crates/parser/src/grammar/generic_args.rs b/crates/parser/src/grammar/generic_args.rs index 762d0218c1fb..948873ae2daf 100644 --- a/crates/parser/src/grammar/generic_args.rs +++ b/crates/parser/src/grammar/generic_args.rs @@ -99,9 +99,8 @@ pub(super) fn const_arg_expr(p: &mut Parser) { expressions::literal(p); lm.complete(p, PREFIX_EXPR); } - // test const_arg_path - // type T = S; _ => { + // This shouldn't be hit by `const_arg` let lm = p.start(); paths::use_path(p); lm.complete(p, PATH_EXPR); diff --git a/crates/parser/src/grammar/generic_params.rs b/crates/parser/src/grammar/generic_params.rs index 9797de1ff0b5..fbd514078d4f 100644 --- a/crates/parser/src/grammar/generic_params.rs +++ b/crates/parser/src/grammar/generic_params.rs @@ -85,6 +85,9 @@ fn const_param(p: &mut Parser, m: Marker) { // test const_param_default_expression // struct A; + + // test const_param_default_path + // struct A; generic_args::const_arg_expr(p); } 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_arg_path.rast deleted file mode 100644 index 62ddefa5a8d4..000000000000 --- a/crates/parser/test_data/parser/inline/ok/0188_const_arg_path.rast +++ /dev/null @@ -1,30 +0,0 @@ -SOURCE_FILE - TYPE_ALIAS - TYPE_KW "type" - WHITESPACE " " - NAME - IDENT "T" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "S" - GENERIC_ARG_LIST - L_ANGLE "<" - TYPE_ARG - PATH_TYPE - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "u32" - COLON2 "::" - PATH_SEGMENT - NAME_REF - IDENT "MAX" - R_ANGLE ">" - SEMICOLON ";" - WHITESPACE "\n" 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 1383d0d6d566..000000000000 --- a/crates/parser/test_data/parser/inline/ok/0188_const_arg_path.rs +++ /dev/null @@ -1 +0,0 @@ -type T = S; diff --git a/crates/parser/test_data/parser/inline/ok/0188_const_param_default_path.rast b/crates/parser/test_data/parser/inline/ok/0188_const_param_default_path.rast new file mode 100644 index 000000000000..11002bf98d01 --- /dev/null +++ b/crates/parser/test_data/parser/inline/ok/0188_const_param_default_path.rast @@ -0,0 +1,36 @@ +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 " " + PATH_EXPR + PATH + PATH + PATH_SEGMENT + NAME_REF + 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 000000000000..f3da43ca06cb --- /dev/null +++ b/crates/parser/test_data/parser/inline/ok/0188_const_param_default_path.rs @@ -0,0 +1 @@ +struct A;