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 ++++++++++---- 3 files changed, 38 insertions(+), 7 deletions(-) (limited to 'src') 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" }, -- cgit v1.2.3