From 7cdf990c40e932a466e8799ca3fa582467d32c91 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 2 Feb 2018 22:21:06 +0300 Subject: Move use item parsing to a separate file --- src/parser/event_parser/grammar/items/mod.rs | 73 +---------------------- src/parser/event_parser/grammar/items/use_item.rs | 66 ++++++++++++++++++++ src/parser/event_parser/grammar/paths.rs | 6 +- 3 files changed, 73 insertions(+), 72 deletions(-) create mode 100644 src/parser/event_parser/grammar/items/use_item.rs (limited to 'src') diff --git a/src/parser/event_parser/grammar/items/mod.rs b/src/parser/event_parser/grammar/items/mod.rs index a6d8f375c..1c092779b 100644 --- a/src/parser/event_parser/grammar/items/mod.rs +++ b/src/parser/event_parser/grammar/items/mod.rs @@ -1,6 +1,7 @@ use super::*; mod structs; +mod use_item; pub(super) fn mod_contents(p: &mut Parser, stop_on_r_curly: bool) { attributes::inner_attributes(p); @@ -20,7 +21,7 @@ fn item(p: &mut Parser) { let la = p.nth(1); let item_kind = match p.current() { USE_KW => { - use_item(p); + use_item::use_item(p); USE_ITEM } EXTERN_KW if la == CRATE_KW => { @@ -179,76 +180,6 @@ fn extern_block(p: &mut Parser) { p.expect(R_CURLY); } -pub(super) fn is_use_tree_start(kind: SyntaxKind) -> bool { - kind == STAR || kind == L_CURLY -} - -fn use_item(p: &mut Parser) { - assert!(p.at(USE_KW)); - p.bump(); - - use_tree(p); - p.expect(SEMI); - - fn use_tree(p: &mut Parser) { - let la = p.nth(1); - let m = p.start(); - match (p.current(), la) { - (STAR, _) => p.bump(), - (COLONCOLON, STAR) => { - p.bump(); - p.bump(); - } - (L_CURLY, _) | (COLONCOLON, L_CURLY) => { - if p.at(COLONCOLON) { - p.bump(); - } - nested_trees(p); - } - _ if paths::is_path_start(p) => { - paths::use_path(p); - match p.current() { - AS_KW => { - alias(p); - } - COLONCOLON => { - p.bump(); - match p.current() { - STAR => { - p.bump(); - } - L_CURLY => nested_trees(p), - _ => { - // is this unreachable? - p.error().message("expected `{` or `*`").emit(); - } - } - } - _ => (), - } - } - _ => { - m.abandon(p); - p.err_and_bump("expected one of `*`, `::`, `{`, `self`, `super`, `indent`"); - return; - } - } - m.complete(p, USE_TREE); - } - - fn nested_trees(p: &mut Parser) { - assert!(p.at(L_CURLY)); - p.bump(); - while !p.at(EOF) && !p.at(R_CURLY) { - use_tree(p); - if !p.at(R_CURLY) { - p.expect(COMMA); - } - } - p.expect(R_CURLY); - } -} - fn abi(p: &mut Parser) { assert!(p.at(EXTERN_KW)); let abi = p.start(); diff --git a/src/parser/event_parser/grammar/items/use_item.rs b/src/parser/event_parser/grammar/items/use_item.rs new file mode 100644 index 000000000..38e7b3f8a --- /dev/null +++ b/src/parser/event_parser/grammar/items/use_item.rs @@ -0,0 +1,66 @@ +use super::*; + +pub(super) fn use_item(p: &mut Parser) { + assert!(p.at(USE_KW)); + p.bump(); + use_tree(p); + p.expect(SEMI); +} + +fn use_tree(p: &mut Parser) { + let la = p.nth(1); + let m = p.start(); + match (p.current(), la) { + (STAR, _) => p.bump(), + (COLONCOLON, STAR) => { + p.bump(); + p.bump(); + } + (L_CURLY, _) | (COLONCOLON, L_CURLY) => { + if p.at(COLONCOLON) { + p.bump(); + } + nested_trees(p); + } + _ if paths::is_path_start(p) => { + paths::use_path(p); + match p.current() { + AS_KW => { + alias(p); + } + COLONCOLON => { + p.bump(); + match p.current() { + STAR => { + p.bump(); + } + L_CURLY => nested_trees(p), + _ => { + // is this unreachable? + p.error().message("expected `{` or `*`").emit(); + } + } + } + _ => (), + } + } + _ => { + m.abandon(p); + p.err_and_bump("expected one of `*`, `::`, `{`, `self`, `super`, `indent`"); + return; + } + } + m.complete(p, USE_TREE); +} + +fn nested_trees(p: &mut Parser) { + assert!(p.at(L_CURLY)); + p.bump(); + while !p.at(EOF) && !p.at(R_CURLY) { + use_tree(p); + if !p.at(R_CURLY) { + p.expect(COMMA); + } + } + p.expect(R_CURLY); +} diff --git a/src/parser/event_parser/grammar/paths.rs b/src/parser/event_parser/grammar/paths.rs index 4c0d2c8b4..6efac2610 100644 --- a/src/parser/event_parser/grammar/paths.rs +++ b/src/parser/event_parser/grammar/paths.rs @@ -20,7 +20,11 @@ fn path(p: &mut Parser) { path_segment(p, true); let mut qual = path.complete(p, PATH); loop { - if p.at(COLONCOLON) && !items::is_use_tree_start(p.nth(1)) { + let use_tree = match p.nth(1) { + STAR | L_CURLY => true, + _ => false, + }; + if p.at(COLONCOLON) && !use_tree { let path = qual.precede(p); p.bump(); path_segment(p, false); -- cgit v1.2.3 From be20b014d9fd4df64a8b6b88aaf6950d44ca6f39 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 2 Feb 2018 23:23:39 +0300 Subject: Move type parameter parsing to a separate file --- src/parser/event_parser/grammar/items/mod.rs | 70 ---------------------- src/parser/event_parser/grammar/items/structs.rs | 8 +-- src/parser/event_parser/grammar/mod.rs | 1 + src/parser/event_parser/grammar/type_params.rs | 75 ++++++++++++++++++++++++ 4 files changed, 80 insertions(+), 74 deletions(-) create mode 100644 src/parser/event_parser/grammar/type_params.rs (limited to 'src') diff --git a/src/parser/event_parser/grammar/items/mod.rs b/src/parser/event_parser/grammar/items/mod.rs index 1c092779b..35825e7c4 100644 --- a/src/parser/event_parser/grammar/items/mod.rs +++ b/src/parser/event_parser/grammar/items/mod.rs @@ -83,76 +83,6 @@ fn item(p: &mut Parser) { item.complete(p, item_kind); } -fn type_param_list(p: &mut Parser) { - if !p.at(L_ANGLE) { - return; - } - let m = p.start(); - p.bump(); - - while !p.at(EOF) && !p.at(R_ANGLE) { - match p.current() { - LIFETIME => lifetime_param(p), - IDENT => type_param(p), - _ => p.err_and_bump("expected type parameter"), - } - if !p.at(R_ANGLE) && !p.expect(COMMA) { - break; - } - } - p.expect(R_ANGLE); - m.complete(p, TYPE_PARAM_LIST); - - fn lifetime_param(p: &mut Parser) { - assert!(p.at(LIFETIME)); - let m = p.start(); - p.bump(); - if p.eat(COLON) { - while p.at(LIFETIME) { - p.bump(); - if !p.eat(PLUS) { - break; - } - } - } - m.complete(p, LIFETIME_PARAM); - } - - fn type_param(p: &mut Parser) { - assert!(p.at(IDENT)); - let m = p.start(); - p.bump(); - if p.eat(COLON) { - loop { - let has_paren = p.eat(L_PAREN); - p.eat(QUESTION); - if p.at(FOR_KW) { - //TODO - } - if p.at(LIFETIME) { - p.bump(); - } else if paths::is_path_start(p) { - paths::type_path(p); - } else { - break; - } - if has_paren { - p.expect(R_PAREN); - } - if !p.eat(PLUS) { - break; - } - } - } - if p.at(EQ) { - types::type_ref(p) - } - m.complete(p, TYPE_PARAM); - } -} - -fn where_clause(_: &mut Parser) {} - fn extern_crate_item(p: &mut Parser) { assert!(p.at(EXTERN_KW)); p.bump(); diff --git a/src/parser/event_parser/grammar/items/structs.rs b/src/parser/event_parser/grammar/items/structs.rs index 6e438413b..69d95c698 100644 --- a/src/parser/event_parser/grammar/items/structs.rs +++ b/src/parser/event_parser/grammar/items/structs.rs @@ -7,10 +7,10 @@ pub(super) fn struct_item(p: &mut Parser) { if !p.expect(IDENT) { return; } - type_param_list(p); + type_params::list(p); match p.current() { WHERE_KW => { - where_clause(p); + type_params::where_clause(p); match p.current() { SEMI => { p.bump(); @@ -44,8 +44,8 @@ pub(super) fn enum_item(p: &mut Parser) { assert!(p.at(ENUM_KW)); p.bump(); p.expect(IDENT); - type_param_list(p); - where_clause(p); + type_params::list(p); + type_params::where_clause(p); if p.expect(L_CURLY) { while !p.at(EOF) && !p.at(R_CURLY) { let var = p.start(); diff --git a/src/parser/event_parser/grammar/mod.rs b/src/parser/event_parser/grammar/mod.rs index e7f1915d2..afce308d0 100644 --- a/src/parser/event_parser/grammar/mod.rs +++ b/src/parser/event_parser/grammar/mod.rs @@ -7,6 +7,7 @@ mod attributes; mod expressions; mod types; mod paths; +mod type_params; pub(crate) fn file(p: &mut Parser) { let file = p.start(); diff --git a/src/parser/event_parser/grammar/type_params.rs b/src/parser/event_parser/grammar/type_params.rs new file mode 100644 index 000000000..12c9a5362 --- /dev/null +++ b/src/parser/event_parser/grammar/type_params.rs @@ -0,0 +1,75 @@ +use super::*; + +pub(super) fn list(p: &mut Parser) { + if !p.at(L_ANGLE) { + return; + } + let m = p.start(); + p.bump(); + + while !p.at(EOF) && !p.at(R_ANGLE) { + match p.current() { + LIFETIME => lifetime_param(p), + IDENT => type_param(p), + _ => p.err_and_bump("expected type parameter"), + } + if !p.at(R_ANGLE) && !p.expect(COMMA) { + break; + } + } + p.expect(R_ANGLE); + m.complete(p, TYPE_PARAM_LIST); + + fn lifetime_param(p: &mut Parser) { + assert!(p.at(LIFETIME)); + let m = p.start(); + p.bump(); + if p.eat(COLON) { + while p.at(LIFETIME) { + p.bump(); + if !p.eat(PLUS) { + break; + } + } + } + m.complete(p, LIFETIME_PARAM); + } + + fn type_param(p: &mut Parser) { + assert!(p.at(IDENT)); + let m = p.start(); + p.bump(); + if p.eat(COLON) { + loop { + let has_paren = p.eat(L_PAREN); + p.eat(QUESTION); + if p.at(FOR_KW) { + //TODO + } + if p.at(LIFETIME) { + p.bump(); + } else if paths::is_path_start(p) { + paths::type_path(p); + } else { + break; + } + if has_paren { + p.expect(R_PAREN); + } + if !p.eat(PLUS) { + break; + } + } + } + if p.at(EQ) { + types::type_ref(p) + } + m.complete(p, TYPE_PARAM); + } +} + +pub(super) fn where_clause(p: &mut Parser) { + if p.at(WHERE_KW) { + p.bump(); + } +} -- cgit v1.2.3