From 63e2ed4e75bc16cdd1882be031d026469b49dbc4 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 31 Jul 2018 19:37:40 +0300 Subject: Nodes for type args --- src/grammar.ron | 7 ++++-- src/parser/grammar/type_args.rs | 24 +++++++++++++++++- src/syntax_kinds/generated.rs | 14 ++++++++--- tests/data/parser/inline/0039_path_expr.txt | 11 ++++---- tests/data/parser/inline/0058_type_arg.rs | 1 + tests/data/parser/inline/0058_type_arg.txt | 39 +++++++++++++++++++++++++++++ 6 files changed, 84 insertions(+), 12 deletions(-) create mode 100644 tests/data/parser/inline/0058_type_arg.rs create mode 100644 tests/data/parser/inline/0058_type_arg.txt diff --git a/src/grammar.ron b/src/grammar.ron index e10e5aaf4..6c67db739 100644 --- a/src/grammar.ron +++ b/src/grammar.ron @@ -152,10 +152,13 @@ Grammar( "LET_STMT", "EXPR_STMT", - "TYPE_PARAM", - "LIFETIME_PARAM", "TYPE_PARAM_LIST", + "LIFETIME_PARAM", + "TYPE_PARAM", "TYPE_ARG_LIST", + "LIFETIME_ARG", + "TYPE_ARG", + "ASSOC_TYPE_ARG", "PARAM_LIST", "SELF_PARAM", diff --git a/src/parser/grammar/type_args.rs b/src/parser/grammar/type_args.rs index adac73e7e..6b2217012 100644 --- a/src/parser/grammar/type_args.rs +++ b/src/parser/grammar/type_args.rs @@ -16,7 +16,7 @@ pub(super) fn list(p: &mut Parser, colon_colon_required: bool) { }; while !p.at(EOF) && !p.at(R_ANGLE) { - types::type_(p); + type_arg(p); if !p.at(R_ANGLE) && !p.expect(COMMA) { break; } @@ -24,3 +24,25 @@ pub(super) fn list(p: &mut Parser, colon_colon_required: bool) { p.expect(R_ANGLE); m.complete(p, TYPE_ARG_LIST); } + +// test type_arg +// type A = B<'static, i32, Item=u64> +fn type_arg(p: &mut Parser) { + let m = p.start(); + match p.current() { + LIFETIME => { + p.bump(); + m.complete(p, LIFETIME_ARG); + }, + IDENT if p.nth(1) == EQ => { + p.bump(); + p.bump(); + types::type_(p); + m.complete(p, ASSOC_TYPE_ARG); + }, + _ => { + types::type_(p); + m.complete(p, TYPE_ARG); + }, + } +} diff --git a/src/syntax_kinds/generated.rs b/src/syntax_kinds/generated.rs index 0603f53fd..7c9333fc5 100644 --- a/src/syntax_kinds/generated.rs +++ b/src/syntax_kinds/generated.rs @@ -140,10 +140,13 @@ pub enum SyntaxKind { BLOCK, LET_STMT, EXPR_STMT, - TYPE_PARAM, - LIFETIME_PARAM, TYPE_PARAM_LIST, + LIFETIME_PARAM, + TYPE_PARAM, TYPE_ARG_LIST, + LIFETIME_ARG, + TYPE_ARG, + ASSOC_TYPE_ARG, PARAM_LIST, SELF_PARAM, ARG_LIST, @@ -294,10 +297,13 @@ impl SyntaxKind { BLOCK => &SyntaxInfo { name: "BLOCK" }, LET_STMT => &SyntaxInfo { name: "LET_STMT" }, EXPR_STMT => &SyntaxInfo { name: "EXPR_STMT" }, - TYPE_PARAM => &SyntaxInfo { name: "TYPE_PARAM" }, - LIFETIME_PARAM => &SyntaxInfo { name: "LIFETIME_PARAM" }, TYPE_PARAM_LIST => &SyntaxInfo { name: "TYPE_PARAM_LIST" }, + LIFETIME_PARAM => &SyntaxInfo { name: "LIFETIME_PARAM" }, + TYPE_PARAM => &SyntaxInfo { name: "TYPE_PARAM" }, TYPE_ARG_LIST => &SyntaxInfo { name: "TYPE_ARG_LIST" }, + LIFETIME_ARG => &SyntaxInfo { name: "LIFETIME_ARG" }, + TYPE_ARG => &SyntaxInfo { name: "TYPE_ARG" }, + ASSOC_TYPE_ARG => &SyntaxInfo { name: "ASSOC_TYPE_ARG" }, PARAM_LIST => &SyntaxInfo { name: "PARAM_LIST" }, SELF_PARAM => &SyntaxInfo { name: "SELF_PARAM" }, ARG_LIST => &SyntaxInfo { name: "ARG_LIST" }, diff --git a/tests/data/parser/inline/0039_path_expr.txt b/tests/data/parser/inline/0039_path_expr.txt index 36a4ace6a..c3fc0c4bf 100644 --- a/tests/data/parser/inline/0039_path_expr.txt +++ b/tests/data/parser/inline/0039_path_expr.txt @@ -63,11 +63,12 @@ FILE@[0; 68) TYPE_ARG_LIST@[59; 64) COLONCOLON@[59; 61) L_ANGLE@[61; 62) - PATH_TYPE@[62; 63) - PATH@[62; 63) - PATH_SEGMENT@[62; 63) - NAME_REF@[62; 63) - IDENT@[62; 63) "b" + TYPE_ARG@[62; 63) + PATH_TYPE@[62; 63) + PATH@[62; 63) + PATH_SEGMENT@[62; 63) + NAME_REF@[62; 63) + IDENT@[62; 63) "b" R_ANGLE@[63; 64) SEMI@[64; 65) WHITESPACE@[65; 66) diff --git a/tests/data/parser/inline/0058_type_arg.rs b/tests/data/parser/inline/0058_type_arg.rs new file mode 100644 index 000000000..f0c8cc3a8 --- /dev/null +++ b/tests/data/parser/inline/0058_type_arg.rs @@ -0,0 +1 @@ +type A = B<'static, i32, Item=u64> diff --git a/tests/data/parser/inline/0058_type_arg.txt b/tests/data/parser/inline/0058_type_arg.txt new file mode 100644 index 000000000..af4bcedef --- /dev/null +++ b/tests/data/parser/inline/0058_type_arg.txt @@ -0,0 +1,39 @@ +FILE@[0; 35) + TYPE_ITEM@[0; 35) + TYPE_KW@[0; 4) + NAME@[4; 7) + WHITESPACE@[4; 5) + IDENT@[5; 6) "A" + WHITESPACE@[6; 7) + EQ@[7; 8) + PATH_TYPE@[8; 35) + PATH@[8; 35) + PATH_SEGMENT@[8; 35) + NAME_REF@[8; 10) + WHITESPACE@[8; 9) + IDENT@[9; 10) "B" + TYPE_ARG_LIST@[10; 35) + L_ANGLE@[10; 11) + LIFETIME_ARG@[11; 18) + LIFETIME@[11; 18) "'static" + COMMA@[18; 19) + TYPE_ARG@[19; 23) + PATH_TYPE@[19; 23) + PATH@[19; 23) + PATH_SEGMENT@[19; 23) + NAME_REF@[19; 23) + WHITESPACE@[19; 20) + IDENT@[20; 23) "i32" + COMMA@[23; 24) + ASSOC_TYPE_ARG@[24; 33) + WHITESPACE@[24; 25) + IDENT@[25; 29) "Item" + EQ@[29; 30) + PATH_TYPE@[30; 33) + PATH@[30; 33) + PATH_SEGMENT@[30; 33) + NAME_REF@[30; 33) + IDENT@[30; 33) "u64" + R_ANGLE@[33; 34) + WHITESPACE@[34; 35) + err: `expected SEMI` -- cgit v1.2.3