aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-02-10 11:17:38 +0000
committerAleksey Kladov <[email protected]>2018-02-10 11:17:38 +0000
commite792ec3eca6214329d053715a6477cc4f7a05672 (patch)
tree983d71dd78990607924edce788a0326db1bfad20
parentfa2131365e8ff2a6fa4fcb47aa04e6d51a32943e (diff)
G: use name refs in paths
-rw-r--r--src/parser/grammar/mod.rs10
-rw-r--r--src/parser/grammar/paths.rs3
-rw-r--r--tests/data/parser/err/0004_use_path_bad_segment.txt5
-rw-r--r--tests/data/parser/ok/0009_use_item.txt8
-rw-r--r--tests/data/parser/ok/0010_use_path_segments.txt20
-rw-r--r--tests/data/parser/ok/0012_visibility.txt11
-rw-r--r--tests/data/parser/ok/0013_use_path_self_super.txt12
-rw-r--r--tests/data/parser/ok/0014_use_tree.txt26
-rw-r--r--tests/data/parser/ok/0015_use_tree.txt22
-rw-r--r--tests/data/parser/ok/0020_type_param_bounds.txt27
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) {
60 } 60 }
61} 61}
62 62
63fn name_ref(p: &mut Parser) {
64 if p.at(IDENT) {
65 let m = p.start();
66 p.bump();
67 m.complete(p, NAME_REF);
68 } else {
69 p.error("expected identifier");
70 }
71}
72
63fn error_block(p: &mut Parser, message: &str) { 73fn error_block(p: &mut Parser, message: &str) {
64 assert!(p.at(L_CURLY)); 74 assert!(p.at(L_CURLY));
65 let err = p.start(); 75 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) {
42 p.eat(COLONCOLON); 42 p.eat(COLONCOLON);
43 } 43 }
44 match p.current() { 44 match p.current() {
45 IDENT | SELF_KW | SUPER_KW => p.bump(), 45 IDENT => name_ref(p),
46 SELF_KW | SUPER_KW => p.bump(),
46 _ => { 47 _ => {
47 p.error("expected identifier"); 48 p.error("expected identifier");
48 } 49 }
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)
5 PATH@[3; 9) 5 PATH@[3; 9)
6 PATH@[3; 7) 6 PATH@[3; 7)
7 PATH_SEGMENT@[3; 7) 7 PATH_SEGMENT@[3; 7)
8 WHITESPACE@[3; 4) 8 NAME_REF@[3; 7)
9 IDENT@[4; 7) "foo" 9 WHITESPACE@[3; 4)
10 IDENT@[4; 7) "foo"
10 COLONCOLON@[7; 9) 11 COLONCOLON@[7; 9)
11 PATH_SEGMENT@[9; 9) 12 PATH_SEGMENT@[9; 9)
12 err: `expected identifier` 13 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)
4 USE_TREE@[3; 7) 4 USE_TREE@[3; 7)
5 PATH@[3; 7) 5 PATH@[3; 7)
6 PATH_SEGMENT@[3; 7) 6 PATH_SEGMENT@[3; 7)
7 WHITESPACE@[3; 4) 7 NAME_REF@[3; 7)
8 IDENT@[4; 7) "foo" 8 WHITESPACE@[3; 4)
9 IDENT@[4; 7) "foo"
9 SEMI@[7; 8) 10 SEMI@[7; 8)
10 WHITESPACE@[8; 9) 11 WHITESPACE@[8; 9)
11 USE_ITEM@[9; 19) 12 USE_ITEM@[9; 19)
@@ -15,5 +16,6 @@ FILE@[0; 19)
15 PATH_SEGMENT@[12; 18) 16 PATH_SEGMENT@[12; 18)
16 WHITESPACE@[12; 13) 17 WHITESPACE@[12; 13)
17 COLONCOLON@[13; 15) 18 COLONCOLON@[13; 15)
18 IDENT@[15; 18) "bar" 19 NAME_REF@[15; 18)
20 IDENT@[15; 18) "bar"
19 SEMI@[18; 19) 21 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)
8 PATH_SEGMENT@[3; 9) 8 PATH_SEGMENT@[3; 9)
9 WHITESPACE@[3; 4) 9 WHITESPACE@[3; 4)
10 COLONCOLON@[4; 6) 10 COLONCOLON@[4; 6)
11 IDENT@[6; 9) "foo" 11 NAME_REF@[6; 9)
12 IDENT@[6; 9) "foo"
12 COLONCOLON@[9; 11) 13 COLONCOLON@[9; 11)
13 PATH_SEGMENT@[11; 14) 14 PATH_SEGMENT@[11; 14)
14 IDENT@[11; 14) "bar" 15 NAME_REF@[11; 14)
16 IDENT@[11; 14) "bar"
15 COLONCOLON@[14; 16) 17 COLONCOLON@[14; 16)
16 PATH_SEGMENT@[16; 19) 18 PATH_SEGMENT@[16; 19)
17 IDENT@[16; 19) "baz" 19 NAME_REF@[16; 19)
20 IDENT@[16; 19) "baz"
18 SEMI@[19; 20) 21 SEMI@[19; 20)
19 WHITESPACE@[20; 21) 22 WHITESPACE@[20; 21)
20 USE_ITEM@[21; 40) 23 USE_ITEM@[21; 40)
@@ -24,13 +27,16 @@ FILE@[0; 40)
24 PATH@[24; 33) 27 PATH@[24; 33)
25 PATH@[24; 28) 28 PATH@[24; 28)
26 PATH_SEGMENT@[24; 28) 29 PATH_SEGMENT@[24; 28)
27 WHITESPACE@[24; 25) 30 NAME_REF@[24; 28)
28 IDENT@[25; 28) "foo" 31 WHITESPACE@[24; 25)
32 IDENT@[25; 28) "foo"
29 COLONCOLON@[28; 30) 33 COLONCOLON@[28; 30)
30 PATH_SEGMENT@[30; 33) 34 PATH_SEGMENT@[30; 33)
31 IDENT@[30; 33) "bar" 35 NAME_REF@[30; 33)
36 IDENT@[30; 33) "bar"
32 COLONCOLON@[33; 35) 37 COLONCOLON@[33; 35)
33 PATH_SEGMENT@[35; 38) 38 PATH_SEGMENT@[35; 38)
34 IDENT@[35; 38) "baz" 39 NAME_REF@[35; 38)
40 IDENT@[35; 38) "baz"
35 SEMI@[38; 39) 41 SEMI@[38; 39)
36 WHITESPACE@[39; 40) 42 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)
67 PATH@[72; 81) 67 PATH@[72; 81)
68 PATH@[72; 76) 68 PATH@[72; 76)
69 PATH_SEGMENT@[72; 76) 69 PATH_SEGMENT@[72; 76)
70 WHITESPACE@[72; 73) 70 NAME_REF@[72; 76)
71 IDENT@[73; 76) "foo" 71 WHITESPACE@[72; 73)
72 IDENT@[73; 76) "foo"
72 COLONCOLON@[76; 78) 73 COLONCOLON@[76; 78)
73 PATH_SEGMENT@[78; 81) 74 PATH_SEGMENT@[78; 81)
74 IDENT@[78; 81) "bar" 75 NAME_REF@[78; 81)
76 IDENT@[78; 81) "bar"
75 COLONCOLON@[81; 83) 77 COLONCOLON@[81; 83)
76 PATH_SEGMENT@[83; 86) 78 PATH_SEGMENT@[83; 86)
77 IDENT@[83; 86) "baz" 79 NAME_REF@[83; 86)
80 IDENT@[83; 86) "baz"
78 R_PAREN@[86; 87) 81 R_PAREN@[86; 87)
79 WHITESPACE@[87; 88) 82 WHITESPACE@[87; 88)
80 FN_KW@[88; 90) 83 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)
9 SELF_KW@[4; 8) 9 SELF_KW@[4; 8)
10 COLONCOLON@[8; 10) 10 COLONCOLON@[8; 10)
11 PATH_SEGMENT@[10; 13) 11 PATH_SEGMENT@[10; 13)
12 IDENT@[10; 13) "foo" 12 NAME_REF@[10; 13)
13 IDENT@[10; 13) "foo"
13 SEMI@[13; 14) 14 SEMI@[13; 14)
14 WHITESPACE@[14; 15) 15 WHITESPACE@[14; 15)
15 USE_ITEM@[15; 38) 16 USE_ITEM@[15; 38)
@@ -26,7 +27,8 @@ FILE@[0; 65)
26 SUPER_KW@[26; 31) 27 SUPER_KW@[26; 31)
27 COLONCOLON@[31; 33) 28 COLONCOLON@[31; 33)
28 PATH_SEGMENT@[33; 36) 29 PATH_SEGMENT@[33; 36)
29 IDENT@[33; 36) "bar" 30 NAME_REF@[33; 36)
31 IDENT@[33; 36) "bar"
30 SEMI@[36; 37) 32 SEMI@[36; 37)
31 WHITESPACE@[37; 38) 33 WHITESPACE@[37; 38)
32 USE_ITEM@[38; 65) 34 USE_ITEM@[38; 65)
@@ -42,12 +44,14 @@ FILE@[0; 65)
42 SELF_KW@[44; 48) 44 SELF_KW@[44; 48)
43 COLONCOLON@[48; 50) 45 COLONCOLON@[48; 50)
44 PATH_SEGMENT@[50; 51) 46 PATH_SEGMENT@[50; 51)
45 IDENT@[50; 51) "a" 47 NAME_REF@[50; 51)
48 IDENT@[50; 51) "a"
46 COLONCOLON@[51; 53) 49 COLONCOLON@[51; 53)
47 PATH_SEGMENT@[53; 58) 50 PATH_SEGMENT@[53; 58)
48 SUPER_KW@[53; 58) 51 SUPER_KW@[53; 58)
49 COLONCOLON@[58; 60) 52 COLONCOLON@[58; 60)
50 PATH_SEGMENT@[60; 63) 53 PATH_SEGMENT@[60; 63)
51 IDENT@[60; 63) "bar" 54 NAME_REF@[60; 63)
55 IDENT@[60; 63) "bar"
52 SEMI@[63; 64) 56 SEMI@[63; 64)
53 WHITESPACE@[64; 65) 57 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)
36 USE_TREE@[37; 44) 36 USE_TREE@[37; 44)
37 PATH@[37; 41) 37 PATH@[37; 41)
38 PATH_SEGMENT@[37; 41) 38 PATH_SEGMENT@[37; 41)
39 WHITESPACE@[37; 38) 39 NAME_REF@[37; 41)
40 IDENT@[38; 41) "foo" 40 WHITESPACE@[37; 38)
41 IDENT@[38; 41) "foo"
41 COLONCOLON@[41; 43) 42 COLONCOLON@[41; 43)
42 STAR@[43; 44) 43 STAR@[43; 44)
43 SEMI@[44; 45) 44 SEMI@[44; 45)
@@ -47,8 +48,9 @@ FILE@[0; 81)
47 USE_TREE@[49; 57) 48 USE_TREE@[49; 57)
48 PATH@[49; 53) 49 PATH@[49; 53)
49 PATH_SEGMENT@[49; 53) 50 PATH_SEGMENT@[49; 53)
50 WHITESPACE@[49; 50) 51 NAME_REF@[49; 53)
51 IDENT@[50; 53) "foo" 52 WHITESPACE@[49; 50)
53 IDENT@[50; 53) "foo"
52 COLONCOLON@[53; 55) 54 COLONCOLON@[53; 55)
53 L_CURLY@[55; 56) 55 L_CURLY@[55; 56)
54 R_CURLY@[56; 57) 56 R_CURLY@[56; 57)
@@ -61,25 +63,29 @@ FILE@[0; 81)
61 PATH_SEGMENT@[62; 68) 63 PATH_SEGMENT@[62; 68)
62 WHITESPACE@[62; 63) 64 WHITESPACE@[62; 63)
63 COLONCOLON@[63; 65) 65 COLONCOLON@[63; 65)
64 IDENT@[65; 68) "foo" 66 NAME_REF@[65; 68)
67 IDENT@[65; 68) "foo"
65 COLONCOLON@[68; 70) 68 COLONCOLON@[68; 70)
66 L_CURLY@[70; 71) 69 L_CURLY@[70; 71)
67 USE_TREE@[71; 72) 70 USE_TREE@[71; 72)
68 PATH@[71; 72) 71 PATH@[71; 72)
69 PATH_SEGMENT@[71; 72) 72 PATH_SEGMENT@[71; 72)
70 IDENT@[71; 72) "a" 73 NAME_REF@[71; 72)
74 IDENT@[71; 72) "a"
71 COMMA@[72; 73) 75 COMMA@[72; 73)
72 USE_TREE@[73; 75) 76 USE_TREE@[73; 75)
73 PATH@[73; 75) 77 PATH@[73; 75)
74 PATH_SEGMENT@[73; 75) 78 PATH_SEGMENT@[73; 75)
75 WHITESPACE@[73; 74) 79 NAME_REF@[73; 75)
76 IDENT@[74; 75) "b" 80 WHITESPACE@[73; 74)
81 IDENT@[74; 75) "b"
77 COMMA@[75; 76) 82 COMMA@[75; 76)
78 USE_TREE@[76; 78) 83 USE_TREE@[76; 78)
79 PATH@[76; 78) 84 PATH@[76; 78)
80 PATH_SEGMENT@[76; 78) 85 PATH_SEGMENT@[76; 78)
81 WHITESPACE@[76; 77) 86 NAME_REF@[76; 78)
82 IDENT@[77; 78) "c" 87 WHITESPACE@[76; 77)
88 IDENT@[77; 78) "c"
83 R_CURLY@[78; 79) 89 R_CURLY@[78; 79)
84 SEMI@[79; 80) 90 SEMI@[79; 80)
85 WHITESPACE@[80; 81) 91 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)
4 USE_TREE@[3; 14) 4 USE_TREE@[3; 14)
5 PATH@[3; 8) 5 PATH@[3; 8)
6 PATH_SEGMENT@[3; 8) 6 PATH_SEGMENT@[3; 8)
7 WHITESPACE@[3; 4) 7 NAME_REF@[3; 8)
8 IDENT@[4; 7) "foo" 8 WHITESPACE@[3; 4)
9 WHITESPACE@[7; 8) 9 IDENT@[4; 7) "foo"
10 WHITESPACE@[7; 8)
10 ALIAS@[8; 14) 11 ALIAS@[8; 14)
11 AS_KW@[8; 10) 12 AS_KW@[8; 10)
12 NAME@[10; 14) 13 NAME@[10; 14)
@@ -19,15 +20,17 @@ FILE@[0; 55)
19 USE_TREE@[19; 53) 20 USE_TREE@[19; 53)
20 PATH@[19; 23) 21 PATH@[19; 23)
21 PATH_SEGMENT@[19; 23) 22 PATH_SEGMENT@[19; 23)
22 WHITESPACE@[19; 20) 23 NAME_REF@[19; 23)
23 IDENT@[20; 23) "foo" 24 WHITESPACE@[19; 20)
25 IDENT@[20; 23) "foo"
24 COLONCOLON@[23; 25) 26 COLONCOLON@[23; 25)
25 L_CURLY@[25; 26) 27 L_CURLY@[25; 26)
26 USE_TREE@[26; 32) 28 USE_TREE@[26; 32)
27 PATH@[26; 28) 29 PATH@[26; 28)
28 PATH_SEGMENT@[26; 28) 30 PATH_SEGMENT@[26; 28)
29 IDENT@[26; 27) "a" 31 NAME_REF@[26; 28)
30 WHITESPACE@[27; 28) 32 IDENT@[26; 27) "a"
33 WHITESPACE@[27; 28)
31 ALIAS@[28; 32) 34 ALIAS@[28; 32)
32 AS_KW@[28; 30) 35 AS_KW@[28; 30)
33 NAME@[30; 32) 36 NAME@[30; 32)
@@ -48,8 +51,9 @@ FILE@[0; 55)
48 PATH_SEGMENT@[41; 48) 51 PATH_SEGMENT@[41; 48)
49 WHITESPACE@[41; 42) 52 WHITESPACE@[41; 42)
50 COLONCOLON@[42; 44) 53 COLONCOLON@[42; 44)
51 IDENT@[44; 47) "foo" 54 NAME_REF@[44; 48)
52 WHITESPACE@[47; 48) 55 IDENT@[44; 47) "foo"
56 WHITESPACE@[47; 48)
53 ALIAS@[48; 52) 57 ALIAS@[48; 52)
54 AS_KW@[48; 50) 58 AS_KW@[48; 50)
55 NAME@[50; 52) 59 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)
97 PLUS@[107; 108) 97 PLUS@[107; 108)
98 PATH@[108; 114) 98 PATH@[108; 114)
99 PATH_SEGMENT@[108; 114) 99 PATH_SEGMENT@[108; 114)
100 WHITESPACE@[108; 109) 100 NAME_REF@[108; 114)
101 IDENT@[109; 114) "Clone" 101 WHITESPACE@[108; 109)
102 IDENT@[109; 114) "Clone"
102 R_ANGLE@[114; 115) 103 R_ANGLE@[114; 115)
103 SEMI@[115; 116) 104 SEMI@[115; 116)
104 WHITESPACE@[116; 117) 105 WHITESPACE@[116; 117)
@@ -114,14 +115,16 @@ FILE@[0; 200)
114 COLON@[127; 128) 115 COLON@[127; 128)
115 PATH@[128; 135) 116 PATH@[128; 135)
116 PATH_SEGMENT@[128; 135) 117 PATH_SEGMENT@[128; 135)
117 WHITESPACE@[128; 129) 118 NAME_REF@[128; 135)
118 IDENT@[129; 134) "Clone" 119 WHITESPACE@[128; 129)
119 WHITESPACE@[134; 135) 120 IDENT@[129; 134) "Clone"
121 WHITESPACE@[134; 135)
120 PLUS@[135; 136) 122 PLUS@[135; 136)
121 PATH@[136; 141) 123 PATH@[136; 141)
122 PATH_SEGMENT@[136; 141) 124 PATH_SEGMENT@[136; 141)
123 WHITESPACE@[136; 137) 125 NAME_REF@[136; 141)
124 IDENT@[137; 141) "Copy" 126 WHITESPACE@[136; 137)
127 IDENT@[137; 141) "Copy"
125 R_ANGLE@[141; 142) 128 R_ANGLE@[141; 142)
126 SEMI@[142; 143) 129 SEMI@[142; 143)
127 WHITESPACE@[143; 144) 130 WHITESPACE@[143; 144)
@@ -139,8 +142,9 @@ FILE@[0; 200)
139 PATH_SEGMENT@[155; 162) 142 PATH_SEGMENT@[155; 162)
140 WHITESPACE@[155; 156) 143 WHITESPACE@[155; 156)
141 COLONCOLON@[156; 158) 144 COLONCOLON@[156; 158)
142 IDENT@[158; 161) "Foo" 145 NAME_REF@[158; 162)
143 WHITESPACE@[161; 162) 146 IDENT@[158; 161) "Foo"
147 WHITESPACE@[161; 162)
144 PLUS@[162; 163) 148 PLUS@[162; 163)
145 PATH@[163; 174) 149 PATH@[163; 174)
146 PATH@[163; 168) 150 PATH@[163; 168)
@@ -149,8 +153,9 @@ FILE@[0; 200)
149 SELF_KW@[164; 168) 153 SELF_KW@[164; 168)
150 COLONCOLON@[168; 170) 154 COLONCOLON@[168; 170)
151 PATH_SEGMENT@[170; 174) 155 PATH_SEGMENT@[170; 174)
152 IDENT@[170; 173) "Bar" 156 NAME_REF@[170; 174)
153 WHITESPACE@[173; 174) 157 IDENT@[170; 173) "Bar"
158 WHITESPACE@[173; 174)
154 PLUS@[174; 175) 159 PLUS@[174; 175)
155 WHITESPACE@[175; 176) 160 WHITESPACE@[175; 176)
156 LIFETIME@[176; 178) "'a" 161 LIFETIME@[176; 178) "'a"