From e792ec3eca6214329d053715a6477cc4f7a05672 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 10 Feb 2018 14:17:38 +0300 Subject: G: use name refs in paths --- src/parser/grammar/mod.rs | 10 ++++++++ src/parser/grammar/paths.rs | 3 ++- .../data/parser/err/0004_use_path_bad_segment.txt | 5 ++-- tests/data/parser/ok/0009_use_item.txt | 8 ++++--- tests/data/parser/ok/0010_use_path_segments.txt | 20 ++++++++++------ tests/data/parser/ok/0012_visibility.txt | 11 +++++---- tests/data/parser/ok/0013_use_path_self_super.txt | 12 ++++++---- tests/data/parser/ok/0014_use_tree.txt | 26 +++++++++++++-------- tests/data/parser/ok/0015_use_tree.txt | 22 ++++++++++-------- tests/data/parser/ok/0020_type_param_bounds.txt | 27 +++++++++++++--------- 10 files changed, 93 insertions(+), 51 deletions(-) diff --git a/src/parser/grammar/mod.rs b/src/parser/grammar/mod.rs index 6e82d7c69..abf9fe86c 100644 --- a/src/parser/grammar/mod.rs +++ b/src/parser/grammar/mod.rs @@ -60,6 +60,16 @@ fn name(p: &mut Parser) { } } +fn name_ref(p: &mut Parser) { + if p.at(IDENT) { + let m = p.start(); + p.bump(); + m.complete(p, NAME_REF); + } else { + p.error("expected identifier"); + } +} + fn error_block(p: &mut Parser, message: &str) { assert!(p.at(L_CURLY)); let err = p.start(); diff --git a/src/parser/grammar/paths.rs b/src/parser/grammar/paths.rs index a7fc90774..6ed315c3d 100644 --- a/src/parser/grammar/paths.rs +++ b/src/parser/grammar/paths.rs @@ -42,7 +42,8 @@ fn path_segment(p: &mut Parser, first: bool) { p.eat(COLONCOLON); } match p.current() { - IDENT | SELF_KW | SUPER_KW => p.bump(), + IDENT => name_ref(p), + SELF_KW | SUPER_KW => p.bump(), _ => { p.error("expected identifier"); } diff --git a/tests/data/parser/err/0004_use_path_bad_segment.txt b/tests/data/parser/err/0004_use_path_bad_segment.txt index 7f43611eb..0a67002ac 100644 --- a/tests/data/parser/err/0004_use_path_bad_segment.txt +++ b/tests/data/parser/err/0004_use_path_bad_segment.txt @@ -5,8 +5,9 @@ FILE@[0; 12) PATH@[3; 9) PATH@[3; 7) PATH_SEGMENT@[3; 7) - WHITESPACE@[3; 4) - IDENT@[4; 7) "foo" + NAME_REF@[3; 7) + WHITESPACE@[3; 4) + IDENT@[4; 7) "foo" COLONCOLON@[7; 9) PATH_SEGMENT@[9; 9) err: `expected identifier` diff --git a/tests/data/parser/ok/0009_use_item.txt b/tests/data/parser/ok/0009_use_item.txt index 08ae990d9..8daf4be0d 100644 --- a/tests/data/parser/ok/0009_use_item.txt +++ b/tests/data/parser/ok/0009_use_item.txt @@ -4,8 +4,9 @@ FILE@[0; 19) USE_TREE@[3; 7) PATH@[3; 7) PATH_SEGMENT@[3; 7) - WHITESPACE@[3; 4) - IDENT@[4; 7) "foo" + NAME_REF@[3; 7) + WHITESPACE@[3; 4) + IDENT@[4; 7) "foo" SEMI@[7; 8) WHITESPACE@[8; 9) USE_ITEM@[9; 19) @@ -15,5 +16,6 @@ FILE@[0; 19) PATH_SEGMENT@[12; 18) WHITESPACE@[12; 13) COLONCOLON@[13; 15) - IDENT@[15; 18) "bar" + NAME_REF@[15; 18) + IDENT@[15; 18) "bar" SEMI@[18; 19) diff --git a/tests/data/parser/ok/0010_use_path_segments.txt b/tests/data/parser/ok/0010_use_path_segments.txt index 37e3dfdbf..96d10d741 100644 --- a/tests/data/parser/ok/0010_use_path_segments.txt +++ b/tests/data/parser/ok/0010_use_path_segments.txt @@ -8,13 +8,16 @@ FILE@[0; 40) PATH_SEGMENT@[3; 9) WHITESPACE@[3; 4) COLONCOLON@[4; 6) - IDENT@[6; 9) "foo" + NAME_REF@[6; 9) + IDENT@[6; 9) "foo" COLONCOLON@[9; 11) PATH_SEGMENT@[11; 14) - IDENT@[11; 14) "bar" + NAME_REF@[11; 14) + IDENT@[11; 14) "bar" COLONCOLON@[14; 16) PATH_SEGMENT@[16; 19) - IDENT@[16; 19) "baz" + NAME_REF@[16; 19) + IDENT@[16; 19) "baz" SEMI@[19; 20) WHITESPACE@[20; 21) USE_ITEM@[21; 40) @@ -24,13 +27,16 @@ FILE@[0; 40) PATH@[24; 33) PATH@[24; 28) PATH_SEGMENT@[24; 28) - WHITESPACE@[24; 25) - IDENT@[25; 28) "foo" + NAME_REF@[24; 28) + WHITESPACE@[24; 25) + IDENT@[25; 28) "foo" COLONCOLON@[28; 30) PATH_SEGMENT@[30; 33) - IDENT@[30; 33) "bar" + NAME_REF@[30; 33) + IDENT@[30; 33) "bar" COLONCOLON@[33; 35) PATH_SEGMENT@[35; 38) - IDENT@[35; 38) "baz" + NAME_REF@[35; 38) + IDENT@[35; 38) "baz" SEMI@[38; 39) WHITESPACE@[39; 40) diff --git a/tests/data/parser/ok/0012_visibility.txt b/tests/data/parser/ok/0012_visibility.txt index 8f7ba697d..c138b73f3 100644 --- a/tests/data/parser/ok/0012_visibility.txt +++ b/tests/data/parser/ok/0012_visibility.txt @@ -67,14 +67,17 @@ FILE@[0; 98) PATH@[72; 81) PATH@[72; 76) PATH_SEGMENT@[72; 76) - WHITESPACE@[72; 73) - IDENT@[73; 76) "foo" + NAME_REF@[72; 76) + WHITESPACE@[72; 73) + IDENT@[73; 76) "foo" COLONCOLON@[76; 78) PATH_SEGMENT@[78; 81) - IDENT@[78; 81) "bar" + NAME_REF@[78; 81) + IDENT@[78; 81) "bar" COLONCOLON@[81; 83) PATH_SEGMENT@[83; 86) - IDENT@[83; 86) "baz" + NAME_REF@[83; 86) + IDENT@[83; 86) "baz" R_PAREN@[86; 87) WHITESPACE@[87; 88) FN_KW@[88; 90) diff --git a/tests/data/parser/ok/0013_use_path_self_super.txt b/tests/data/parser/ok/0013_use_path_self_super.txt index f3dfaba4b..3542b2164 100644 --- a/tests/data/parser/ok/0013_use_path_self_super.txt +++ b/tests/data/parser/ok/0013_use_path_self_super.txt @@ -9,7 +9,8 @@ FILE@[0; 65) SELF_KW@[4; 8) COLONCOLON@[8; 10) PATH_SEGMENT@[10; 13) - IDENT@[10; 13) "foo" + NAME_REF@[10; 13) + IDENT@[10; 13) "foo" SEMI@[13; 14) WHITESPACE@[14; 15) USE_ITEM@[15; 38) @@ -26,7 +27,8 @@ FILE@[0; 65) SUPER_KW@[26; 31) COLONCOLON@[31; 33) PATH_SEGMENT@[33; 36) - IDENT@[33; 36) "bar" + NAME_REF@[33; 36) + IDENT@[33; 36) "bar" SEMI@[36; 37) WHITESPACE@[37; 38) USE_ITEM@[38; 65) @@ -42,12 +44,14 @@ FILE@[0; 65) SELF_KW@[44; 48) COLONCOLON@[48; 50) PATH_SEGMENT@[50; 51) - IDENT@[50; 51) "a" + NAME_REF@[50; 51) + IDENT@[50; 51) "a" COLONCOLON@[51; 53) PATH_SEGMENT@[53; 58) SUPER_KW@[53; 58) COLONCOLON@[58; 60) PATH_SEGMENT@[60; 63) - IDENT@[60; 63) "bar" + NAME_REF@[60; 63) + IDENT@[60; 63) "bar" SEMI@[63; 64) WHITESPACE@[64; 65) diff --git a/tests/data/parser/ok/0014_use_tree.txt b/tests/data/parser/ok/0014_use_tree.txt index cddaa5462..a7326214d 100644 --- a/tests/data/parser/ok/0014_use_tree.txt +++ b/tests/data/parser/ok/0014_use_tree.txt @@ -36,8 +36,9 @@ FILE@[0; 81) USE_TREE@[37; 44) PATH@[37; 41) PATH_SEGMENT@[37; 41) - WHITESPACE@[37; 38) - IDENT@[38; 41) "foo" + NAME_REF@[37; 41) + WHITESPACE@[37; 38) + IDENT@[38; 41) "foo" COLONCOLON@[41; 43) STAR@[43; 44) SEMI@[44; 45) @@ -47,8 +48,9 @@ FILE@[0; 81) USE_TREE@[49; 57) PATH@[49; 53) PATH_SEGMENT@[49; 53) - WHITESPACE@[49; 50) - IDENT@[50; 53) "foo" + NAME_REF@[49; 53) + WHITESPACE@[49; 50) + IDENT@[50; 53) "foo" COLONCOLON@[53; 55) L_CURLY@[55; 56) R_CURLY@[56; 57) @@ -61,25 +63,29 @@ FILE@[0; 81) PATH_SEGMENT@[62; 68) WHITESPACE@[62; 63) COLONCOLON@[63; 65) - IDENT@[65; 68) "foo" + NAME_REF@[65; 68) + IDENT@[65; 68) "foo" COLONCOLON@[68; 70) L_CURLY@[70; 71) USE_TREE@[71; 72) PATH@[71; 72) PATH_SEGMENT@[71; 72) - IDENT@[71; 72) "a" + NAME_REF@[71; 72) + IDENT@[71; 72) "a" COMMA@[72; 73) USE_TREE@[73; 75) PATH@[73; 75) PATH_SEGMENT@[73; 75) - WHITESPACE@[73; 74) - IDENT@[74; 75) "b" + NAME_REF@[73; 75) + WHITESPACE@[73; 74) + IDENT@[74; 75) "b" COMMA@[75; 76) USE_TREE@[76; 78) PATH@[76; 78) PATH_SEGMENT@[76; 78) - WHITESPACE@[76; 77) - IDENT@[77; 78) "c" + NAME_REF@[76; 78) + WHITESPACE@[76; 77) + IDENT@[77; 78) "c" R_CURLY@[78; 79) SEMI@[79; 80) WHITESPACE@[80; 81) diff --git a/tests/data/parser/ok/0015_use_tree.txt b/tests/data/parser/ok/0015_use_tree.txt index 28f5f789e..2ba15bbee 100644 --- a/tests/data/parser/ok/0015_use_tree.txt +++ b/tests/data/parser/ok/0015_use_tree.txt @@ -4,9 +4,10 @@ FILE@[0; 55) USE_TREE@[3; 14) PATH@[3; 8) PATH_SEGMENT@[3; 8) - WHITESPACE@[3; 4) - IDENT@[4; 7) "foo" - WHITESPACE@[7; 8) + NAME_REF@[3; 8) + WHITESPACE@[3; 4) + IDENT@[4; 7) "foo" + WHITESPACE@[7; 8) ALIAS@[8; 14) AS_KW@[8; 10) NAME@[10; 14) @@ -19,15 +20,17 @@ FILE@[0; 55) USE_TREE@[19; 53) PATH@[19; 23) PATH_SEGMENT@[19; 23) - WHITESPACE@[19; 20) - IDENT@[20; 23) "foo" + NAME_REF@[19; 23) + WHITESPACE@[19; 20) + IDENT@[20; 23) "foo" COLONCOLON@[23; 25) L_CURLY@[25; 26) USE_TREE@[26; 32) PATH@[26; 28) PATH_SEGMENT@[26; 28) - IDENT@[26; 27) "a" - WHITESPACE@[27; 28) + NAME_REF@[26; 28) + IDENT@[26; 27) "a" + WHITESPACE@[27; 28) ALIAS@[28; 32) AS_KW@[28; 30) NAME@[30; 32) @@ -48,8 +51,9 @@ FILE@[0; 55) PATH_SEGMENT@[41; 48) WHITESPACE@[41; 42) COLONCOLON@[42; 44) - IDENT@[44; 47) "foo" - WHITESPACE@[47; 48) + NAME_REF@[44; 48) + IDENT@[44; 47) "foo" + WHITESPACE@[47; 48) ALIAS@[48; 52) AS_KW@[48; 50) NAME@[50; 52) diff --git a/tests/data/parser/ok/0020_type_param_bounds.txt b/tests/data/parser/ok/0020_type_param_bounds.txt index a1c0cbc37..7132eec6e 100644 --- a/tests/data/parser/ok/0020_type_param_bounds.txt +++ b/tests/data/parser/ok/0020_type_param_bounds.txt @@ -97,8 +97,9 @@ FILE@[0; 200) PLUS@[107; 108) PATH@[108; 114) PATH_SEGMENT@[108; 114) - WHITESPACE@[108; 109) - IDENT@[109; 114) "Clone" + NAME_REF@[108; 114) + WHITESPACE@[108; 109) + IDENT@[109; 114) "Clone" R_ANGLE@[114; 115) SEMI@[115; 116) WHITESPACE@[116; 117) @@ -114,14 +115,16 @@ FILE@[0; 200) COLON@[127; 128) PATH@[128; 135) PATH_SEGMENT@[128; 135) - WHITESPACE@[128; 129) - IDENT@[129; 134) "Clone" - WHITESPACE@[134; 135) + NAME_REF@[128; 135) + WHITESPACE@[128; 129) + IDENT@[129; 134) "Clone" + WHITESPACE@[134; 135) PLUS@[135; 136) PATH@[136; 141) PATH_SEGMENT@[136; 141) - WHITESPACE@[136; 137) - IDENT@[137; 141) "Copy" + NAME_REF@[136; 141) + WHITESPACE@[136; 137) + IDENT@[137; 141) "Copy" R_ANGLE@[141; 142) SEMI@[142; 143) WHITESPACE@[143; 144) @@ -139,8 +142,9 @@ FILE@[0; 200) PATH_SEGMENT@[155; 162) WHITESPACE@[155; 156) COLONCOLON@[156; 158) - IDENT@[158; 161) "Foo" - WHITESPACE@[161; 162) + NAME_REF@[158; 162) + IDENT@[158; 161) "Foo" + WHITESPACE@[161; 162) PLUS@[162; 163) PATH@[163; 174) PATH@[163; 168) @@ -149,8 +153,9 @@ FILE@[0; 200) SELF_KW@[164; 168) COLONCOLON@[168; 170) PATH_SEGMENT@[170; 174) - IDENT@[170; 173) "Bar" - WHITESPACE@[173; 174) + NAME_REF@[170; 174) + IDENT@[170; 173) "Bar" + WHITESPACE@[173; 174) PLUS@[174; 175) WHITESPACE@[175; 176) LIFETIME@[176; 178) "'a" -- cgit v1.2.3