Skip to content

Commit d5c7e64

Browse files
authored
Merge pull request rust-lang#18622 from Veykril/push-wlzptrukvyup
fix: Fix parsing of dyn T in generic arg on 2015 edition
2 parents 23339cb + 59a5b38 commit d5c7e64

File tree

7 files changed

+68
-3
lines changed

7 files changed

+68
-3
lines changed

src/tools/rust-analyzer/crates/parser/src/grammar/generic_args.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ pub(crate) const GENERIC_ARG_FIRST: TokenSet = TokenSet::new(&[
4545
const GENERIC_ARG_RECOVERY_SET: TokenSet = TokenSet::new(&[T![>], T![,]]);
4646

4747
// test generic_arg
48-
// type T = S<i32>;
48+
// type T = S<i32, dyn T, fn()>;
4949
pub(crate) fn generic_arg(p: &mut Parser<'_>) -> bool {
5050
match p.current() {
5151
LIFETIME_IDENT if !p.nth_at(1, T![+]) => lifetime_arg(p),
@@ -57,6 +57,9 @@ pub(crate) fn generic_arg(p: &mut Parser<'_>) -> bool {
5757
// type ParenthesizedArgs = Foo<Item(T), Item::(T), Item(T): Bound, Item::(T): Bound, Item(T) = Item, Item::(T) = Item>;
5858
// type RTN = Foo<Item(..), Item(..), Item(..): Bound, Item(..): Bound, Item(..) = Item, Item(..) = Item>;
5959

60+
// test edition_2015_dyn_prefix_inside_generic_arg 2015
61+
// type A = Foo<dyn T>;
62+
T![ident] if !p.edition().at_least_2018() && types::is_dyn_weak(p) => type_arg(p),
6063
// test macro_inside_generic_arg
6164
// type A = Foo<syn::Token![_]>;
6265
k if PATH_NAME_REF_KINDS.contains(k) => {

src/tools/rust-analyzer/crates/parser/src/grammar/types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ fn type_with_bounds_cond(p: &mut Parser<'_>, allow_bounds: bool) {
5858
}
5959
}
6060

61-
fn is_dyn_weak(p: &Parser<'_>) -> bool {
61+
pub(crate) fn is_dyn_weak(p: &Parser<'_>) -> bool {
6262
const WEAK_DYN_PATH_FIRST: TokenSet = TokenSet::new(&[
6363
IDENT,
6464
T![self],

src/tools/rust-analyzer/crates/parser/test_data/generated/runner.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,13 @@ mod ok {
190190
);
191191
}
192192
#[test]
193+
fn edition_2015_dyn_prefix_inside_generic_arg() {
194+
run_and_expect_no_errors_with_edition(
195+
"test_data/parser/inline/ok/edition_2015_dyn_prefix_inside_generic_arg.rs",
196+
crate::Edition::Edition2015,
197+
);
198+
}
199+
#[test]
193200
fn effect_blocks() { run_and_expect_no_errors("test_data/parser/inline/ok/effect_blocks.rs"); }
194201
#[test]
195202
fn exclusive_range_pat() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
SOURCE_FILE
2+
TYPE_ALIAS
3+
COMMENT "// 2015"
4+
WHITESPACE "\n"
5+
TYPE_KW "type"
6+
WHITESPACE " "
7+
NAME
8+
IDENT "A"
9+
WHITESPACE " "
10+
EQ "="
11+
WHITESPACE " "
12+
PATH_TYPE
13+
PATH
14+
PATH_SEGMENT
15+
NAME_REF
16+
IDENT "Foo"
17+
GENERIC_ARG_LIST
18+
L_ANGLE "<"
19+
TYPE_ARG
20+
DYN_TRAIT_TYPE
21+
DYN_KW "dyn"
22+
WHITESPACE " "
23+
TYPE_BOUND_LIST
24+
TYPE_BOUND
25+
PATH_TYPE
26+
PATH
27+
PATH_SEGMENT
28+
NAME_REF
29+
IDENT "T"
30+
R_ANGLE ">"
31+
SEMICOLON ";"
32+
WHITESPACE "\n"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// 2015
2+
type A = Foo<dyn T>;

src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/generic_arg.rast

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,27 @@ SOURCE_FILE
2020
PATH_SEGMENT
2121
NAME_REF
2222
IDENT "i32"
23+
COMMA ","
24+
WHITESPACE " "
25+
TYPE_ARG
26+
DYN_TRAIT_TYPE
27+
DYN_KW "dyn"
28+
WHITESPACE " "
29+
TYPE_BOUND_LIST
30+
TYPE_BOUND
31+
PATH_TYPE
32+
PATH
33+
PATH_SEGMENT
34+
NAME_REF
35+
IDENT "T"
36+
COMMA ","
37+
WHITESPACE " "
38+
TYPE_ARG
39+
FN_PTR_TYPE
40+
FN_KW "fn"
41+
PARAM_LIST
42+
L_PAREN "("
43+
R_PAREN ")"
2344
R_ANGLE ">"
2445
SEMICOLON ";"
2546
WHITESPACE "\n"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
type T = S<i32>;
1+
type T = S<i32, dyn T, fn()>;

0 commit comments

Comments
 (0)