aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-01-13 08:55:03 +0000
committerAleksey Kladov <[email protected]>2018-01-13 08:55:03 +0000
commit29b2e0adcc35834dda2884222624bfcc268a3eff (patch)
tree0838a22c27bba0361dcde3660075175f243a4d7a
parentf31d85860771b0c4c8d232d79e4a3489a051ba9d (diff)
G: allow self & super in paths
-rw-r--r--grammar.ron1
-rw-r--r--src/parser/event_parser/grammar/paths.rs13
-rw-r--r--src/syntax_kinds.rs135
-rw-r--r--tests/data/lexer/0011_keywords.rs3
-rw-r--r--tests/data/lexer/0011_keywords.txt4
-rw-r--r--tests/data/parser/err/0004_use_path_bad_segment.rs1
-rw-r--r--tests/data/parser/err/0004_use_path_bad_segment.txt16
-rw-r--r--tests/data/parser/ok/0012_visibility.txt2
-rw-r--r--tests/data/parser/ok/0013_use_path_self_super.rs3
-rw-r--r--tests/data/parser/ok/0013_use_path_self_super.txt50
10 files changed, 156 insertions, 72 deletions
diff --git a/grammar.ron b/grammar.ron
index ed3af53e4..ca6299f23 100644
--- a/grammar.ron
+++ b/grammar.ron
@@ -15,6 +15,7 @@ Grammar(
15 "pub", 15 "pub",
16 "self", 16 "self",
17 "super", 17 "super",
18 "in",
18 ], 19 ],
19 tokens: [ 20 tokens: [
20 "ERROR", 21 "ERROR",
diff --git a/src/parser/event_parser/grammar/paths.rs b/src/parser/event_parser/grammar/paths.rs
index 108545bc2..d6887a9ba 100644
--- a/src/parser/event_parser/grammar/paths.rs
+++ b/src/parser/event_parser/grammar/paths.rs
@@ -1,7 +1,7 @@
1use super::*; 1use super::*;
2 2
3pub(crate) fn use_path(p: &mut Parser) { 3pub(crate) fn use_path(p: &mut Parser) {
4 if !AnyOf(&[IDENT, COLONCOLON]).is_ahead(p) { 4 if !AnyOf(&[IDENT, SELF_KW, SUPER_KW, COLONCOLON]).is_ahead(p) {
5 return; 5 return;
6 } 6 }
7 let mut prev = p.mark(); 7 let mut prev = p.mark();
@@ -23,6 +23,15 @@ fn path_segment(p: &mut Parser, first: bool) {
23 if first { 23 if first {
24 p.eat(COLONCOLON); 24 p.eat(COLONCOLON);
25 } 25 }
26 p.expect(IDENT); 26 match p.current() {
27 IDENT | SELF_KW | SUPER_KW => {
28 p.bump();
29 },
30 _ => {
31 p.error()
32 .message("expected identifier")
33 .emit();
34 }
35 };
27 }) 36 })
28} \ No newline at end of file 37} \ No newline at end of file
diff --git a/src/syntax_kinds.rs b/src/syntax_kinds.rs
index 84f1072b7..48f55fa97 100644
--- a/src/syntax_kinds.rs
+++ b/src/syntax_kinds.rs
@@ -16,73 +16,74 @@ pub const MOD_KW: SyntaxKind = SyntaxKind(11);
16pub const PUB_KW: SyntaxKind = SyntaxKind(12); 16pub const PUB_KW: SyntaxKind = SyntaxKind(12);
17pub const SELF_KW: SyntaxKind = SyntaxKind(13); 17pub const SELF_KW: SyntaxKind = SyntaxKind(13);
18pub const SUPER_KW: SyntaxKind = SyntaxKind(14); 18pub const SUPER_KW: SyntaxKind = SyntaxKind(14);
19pub const ERROR: SyntaxKind = SyntaxKind(15); 19pub const IN_KW: SyntaxKind = SyntaxKind(15);
20pub const IDENT: SyntaxKind = SyntaxKind(16); 20pub const ERROR: SyntaxKind = SyntaxKind(16);
21pub const UNDERSCORE: SyntaxKind = SyntaxKind(17); 21pub const IDENT: SyntaxKind = SyntaxKind(17);
22pub const WHITESPACE: SyntaxKind = SyntaxKind(18); 22pub const UNDERSCORE: SyntaxKind = SyntaxKind(18);
23pub const INT_NUMBER: SyntaxKind = SyntaxKind(19); 23pub const WHITESPACE: SyntaxKind = SyntaxKind(19);
24pub const FLOAT_NUMBER: SyntaxKind = SyntaxKind(20); 24pub const INT_NUMBER: SyntaxKind = SyntaxKind(20);
25pub const SEMI: SyntaxKind = SyntaxKind(21); 25pub const FLOAT_NUMBER: SyntaxKind = SyntaxKind(21);
26pub const COMMA: SyntaxKind = SyntaxKind(22); 26pub const SEMI: SyntaxKind = SyntaxKind(22);
27pub const DOT: SyntaxKind = SyntaxKind(23); 27pub const COMMA: SyntaxKind = SyntaxKind(23);
28pub const DOTDOT: SyntaxKind = SyntaxKind(24); 28pub const DOT: SyntaxKind = SyntaxKind(24);
29pub const DOTDOTDOT: SyntaxKind = SyntaxKind(25); 29pub const DOTDOT: SyntaxKind = SyntaxKind(25);
30pub const DOTDOTEQ: SyntaxKind = SyntaxKind(26); 30pub const DOTDOTDOT: SyntaxKind = SyntaxKind(26);
31pub const L_PAREN: SyntaxKind = SyntaxKind(27); 31pub const DOTDOTEQ: SyntaxKind = SyntaxKind(27);
32pub const R_PAREN: SyntaxKind = SyntaxKind(28); 32pub const L_PAREN: SyntaxKind = SyntaxKind(28);
33pub const L_CURLY: SyntaxKind = SyntaxKind(29); 33pub const R_PAREN: SyntaxKind = SyntaxKind(29);
34pub const R_CURLY: SyntaxKind = SyntaxKind(30); 34pub const L_CURLY: SyntaxKind = SyntaxKind(30);
35pub const L_BRACK: SyntaxKind = SyntaxKind(31); 35pub const R_CURLY: SyntaxKind = SyntaxKind(31);
36pub const R_BRACK: SyntaxKind = SyntaxKind(32); 36pub const L_BRACK: SyntaxKind = SyntaxKind(32);
37pub const L_ANGLE: SyntaxKind = SyntaxKind(33); 37pub const R_BRACK: SyntaxKind = SyntaxKind(33);
38pub const R_ANGLE: SyntaxKind = SyntaxKind(34); 38pub const L_ANGLE: SyntaxKind = SyntaxKind(34);
39pub const AT: SyntaxKind = SyntaxKind(35); 39pub const R_ANGLE: SyntaxKind = SyntaxKind(35);
40pub const POUND: SyntaxKind = SyntaxKind(36); 40pub const AT: SyntaxKind = SyntaxKind(36);
41pub const TILDE: SyntaxKind = SyntaxKind(37); 41pub const POUND: SyntaxKind = SyntaxKind(37);
42pub const QUESTION: SyntaxKind = SyntaxKind(38); 42pub const TILDE: SyntaxKind = SyntaxKind(38);
43pub const COLON: SyntaxKind = SyntaxKind(39); 43pub const QUESTION: SyntaxKind = SyntaxKind(39);
44pub const COLONCOLON: SyntaxKind = SyntaxKind(40); 44pub const COLON: SyntaxKind = SyntaxKind(40);
45pub const DOLLAR: SyntaxKind = SyntaxKind(41); 45pub const COLONCOLON: SyntaxKind = SyntaxKind(41);
46pub const EQ: SyntaxKind = SyntaxKind(42); 46pub const DOLLAR: SyntaxKind = SyntaxKind(42);
47pub const EQEQ: SyntaxKind = SyntaxKind(43); 47pub const EQ: SyntaxKind = SyntaxKind(43);
48pub const FAT_ARROW: SyntaxKind = SyntaxKind(44); 48pub const EQEQ: SyntaxKind = SyntaxKind(44);
49pub const NEQ: SyntaxKind = SyntaxKind(45); 49pub const FAT_ARROW: SyntaxKind = SyntaxKind(45);
50pub const EXCL: SyntaxKind = SyntaxKind(46); 50pub const NEQ: SyntaxKind = SyntaxKind(46);
51pub const LIFETIME: SyntaxKind = SyntaxKind(47); 51pub const EXCL: SyntaxKind = SyntaxKind(47);
52pub const CHAR: SyntaxKind = SyntaxKind(48); 52pub const LIFETIME: SyntaxKind = SyntaxKind(48);
53pub const BYTE: SyntaxKind = SyntaxKind(49); 53pub const CHAR: SyntaxKind = SyntaxKind(49);
54pub const STRING: SyntaxKind = SyntaxKind(50); 54pub const BYTE: SyntaxKind = SyntaxKind(50);
55pub const RAW_STRING: SyntaxKind = SyntaxKind(51); 55pub const STRING: SyntaxKind = SyntaxKind(51);
56pub const BYTE_STRING: SyntaxKind = SyntaxKind(52); 56pub const RAW_STRING: SyntaxKind = SyntaxKind(52);
57pub const RAW_BYTE_STRING: SyntaxKind = SyntaxKind(53); 57pub const BYTE_STRING: SyntaxKind = SyntaxKind(53);
58pub const PLUS: SyntaxKind = SyntaxKind(54); 58pub const RAW_BYTE_STRING: SyntaxKind = SyntaxKind(54);
59pub const MINUS: SyntaxKind = SyntaxKind(55); 59pub const PLUS: SyntaxKind = SyntaxKind(55);
60pub const STAR: SyntaxKind = SyntaxKind(56); 60pub const MINUS: SyntaxKind = SyntaxKind(56);
61pub const SLASH: SyntaxKind = SyntaxKind(57); 61pub const STAR: SyntaxKind = SyntaxKind(57);
62pub const CARET: SyntaxKind = SyntaxKind(58); 62pub const SLASH: SyntaxKind = SyntaxKind(58);
63pub const PERCENT: SyntaxKind = SyntaxKind(59); 63pub const CARET: SyntaxKind = SyntaxKind(59);
64pub const AMPERSAND: SyntaxKind = SyntaxKind(60); 64pub const PERCENT: SyntaxKind = SyntaxKind(60);
65pub const PIPE: SyntaxKind = SyntaxKind(61); 65pub const AMPERSAND: SyntaxKind = SyntaxKind(61);
66pub const THIN_ARROW: SyntaxKind = SyntaxKind(62); 66pub const PIPE: SyntaxKind = SyntaxKind(62);
67pub const COMMENT: SyntaxKind = SyntaxKind(63); 67pub const THIN_ARROW: SyntaxKind = SyntaxKind(63);
68pub const DOC_COMMENT: SyntaxKind = SyntaxKind(64); 68pub const COMMENT: SyntaxKind = SyntaxKind(64);
69pub const SHEBANG: SyntaxKind = SyntaxKind(65); 69pub const DOC_COMMENT: SyntaxKind = SyntaxKind(65);
70pub const FILE: SyntaxKind = SyntaxKind(66); 70pub const SHEBANG: SyntaxKind = SyntaxKind(66);
71pub const STRUCT_ITEM: SyntaxKind = SyntaxKind(67); 71pub const FILE: SyntaxKind = SyntaxKind(67);
72pub const STRUCT_FIELD: SyntaxKind = SyntaxKind(68); 72pub const STRUCT_ITEM: SyntaxKind = SyntaxKind(68);
73pub const FN_ITEM: SyntaxKind = SyntaxKind(69); 73pub const STRUCT_FIELD: SyntaxKind = SyntaxKind(69);
74pub const EXTERN_CRATE_ITEM: SyntaxKind = SyntaxKind(70); 74pub const FN_ITEM: SyntaxKind = SyntaxKind(70);
75pub const ATTR: SyntaxKind = SyntaxKind(71); 75pub const EXTERN_CRATE_ITEM: SyntaxKind = SyntaxKind(71);
76pub const META_ITEM: SyntaxKind = SyntaxKind(72); 76pub const ATTR: SyntaxKind = SyntaxKind(72);
77pub const MOD_ITEM: SyntaxKind = SyntaxKind(73); 77pub const META_ITEM: SyntaxKind = SyntaxKind(73);
78pub const USE_ITEM: SyntaxKind = SyntaxKind(74); 78pub const MOD_ITEM: SyntaxKind = SyntaxKind(74);
79pub const PATH: SyntaxKind = SyntaxKind(75); 79pub const USE_ITEM: SyntaxKind = SyntaxKind(75);
80pub const PATH_SEGMENT: SyntaxKind = SyntaxKind(76); 80pub const PATH: SyntaxKind = SyntaxKind(76);
81pub const LITERAL: SyntaxKind = SyntaxKind(77); 81pub const PATH_SEGMENT: SyntaxKind = SyntaxKind(77);
82pub const ALIAS: SyntaxKind = SyntaxKind(78); 82pub const LITERAL: SyntaxKind = SyntaxKind(78);
83pub const VISIBILITY: SyntaxKind = SyntaxKind(79); 83pub const ALIAS: SyntaxKind = SyntaxKind(79);
84pub const VISIBILITY: SyntaxKind = SyntaxKind(80);
84 85
85static INFOS: [SyntaxInfo; 80] = [ 86static INFOS: [SyntaxInfo; 81] = [
86 SyntaxInfo { name: "USE_KW" }, 87 SyntaxInfo { name: "USE_KW" },
87 SyntaxInfo { name: "FN_KW" }, 88 SyntaxInfo { name: "FN_KW" },
88 SyntaxInfo { name: "STRUCT_KW" }, 89 SyntaxInfo { name: "STRUCT_KW" },
@@ -98,6 +99,7 @@ static INFOS: [SyntaxInfo; 80] = [
98 SyntaxInfo { name: "PUB_KW" }, 99 SyntaxInfo { name: "PUB_KW" },
99 SyntaxInfo { name: "SELF_KW" }, 100 SyntaxInfo { name: "SELF_KW" },
100 SyntaxInfo { name: "SUPER_KW" }, 101 SyntaxInfo { name: "SUPER_KW" },
102 SyntaxInfo { name: "IN_KW" },
101 SyntaxInfo { name: "ERROR" }, 103 SyntaxInfo { name: "ERROR" },
102 SyntaxInfo { name: "IDENT" }, 104 SyntaxInfo { name: "IDENT" },
103 SyntaxInfo { name: "UNDERSCORE" }, 105 SyntaxInfo { name: "UNDERSCORE" },
@@ -186,6 +188,7 @@ pub(crate) fn ident_to_keyword(ident: &str) -> Option<SyntaxKind> {
186 "pub" => Some(PUB_KW), 188 "pub" => Some(PUB_KW),
187 "self" => Some(SELF_KW), 189 "self" => Some(SELF_KW),
188 "super" => Some(SUPER_KW), 190 "super" => Some(SUPER_KW),
191 "in" => Some(IN_KW),
189 _ => None, 192 _ => None,
190 } 193 }
191} 194}
diff --git a/tests/data/lexer/0011_keywords.rs b/tests/data/lexer/0011_keywords.rs
index c5a58a205..aa729cdbd 100644
--- a/tests/data/lexer/0011_keywords.rs
+++ b/tests/data/lexer/0011_keywords.rs
@@ -1,2 +1 @@
1fn use struct trait enum impl true false as extern crate mod pub self super fn use struct trait enum impl true false as extern crate mod pub self super in
2
diff --git a/tests/data/lexer/0011_keywords.txt b/tests/data/lexer/0011_keywords.txt
index 248628f34..8a1f525ac 100644
--- a/tests/data/lexer/0011_keywords.txt
+++ b/tests/data/lexer/0011_keywords.txt
@@ -27,4 +27,6 @@ WHITESPACE 1 " "
27SELF_KW 4 "self" 27SELF_KW 4 "self"
28WHITESPACE 1 " " 28WHITESPACE 1 " "
29SUPER_KW 5 "super" 29SUPER_KW 5 "super"
30WHITESPACE 2 "\n\n" 30WHITESPACE 1 " "
31IN_KW 2 "in"
32WHITESPACE 1 "\n"
diff --git a/tests/data/parser/err/0004_use_path_bad_segment.rs b/tests/data/parser/err/0004_use_path_bad_segment.rs
new file mode 100644
index 000000000..060e65d06
--- /dev/null
+++ b/tests/data/parser/err/0004_use_path_bad_segment.rs
@@ -0,0 +1 @@
use foo::92; \ No newline at end of file
diff --git a/tests/data/parser/err/0004_use_path_bad_segment.txt b/tests/data/parser/err/0004_use_path_bad_segment.txt
new file mode 100644
index 000000000..241ee8562
--- /dev/null
+++ b/tests/data/parser/err/0004_use_path_bad_segment.txt
@@ -0,0 +1,16 @@
1FILE@[0; 12)
2 USE_ITEM@[0; 9)
3 USE_KW@[0; 3)
4 PATH@[3; 9)
5 PATH@[3; 7)
6 PATH_SEGMENT@[3; 7)
7 WHITESPACE@[3; 4)
8 IDENT@[4; 7)
9 COLONCOLON@[7; 9)
10 PATH_SEGMENT@[9; 9)
11 err: `expected identifier`
12 err: `expected SEMI`
13 ERROR@[9; 12)
14 err: `expected item`
15 INT_NUMBER@[9; 11)
16 SEMI@[11; 12)
diff --git a/tests/data/parser/ok/0012_visibility.txt b/tests/data/parser/ok/0012_visibility.txt
index 8324c48d5..0e091724d 100644
--- a/tests/data/parser/ok/0012_visibility.txt
+++ b/tests/data/parser/ok/0012_visibility.txt
@@ -58,7 +58,7 @@ FILE@[0; 98)
58 VISIBILITY@[66; 88) 58 VISIBILITY@[66; 88)
59 PUB_KW@[66; 69) 59 PUB_KW@[66; 69)
60 L_PAREN@[69; 70) 60 L_PAREN@[69; 70)
61 IDENT@[70; 72) 61 IN_KW@[70; 72)
62 PATH@[72; 86) 62 PATH@[72; 86)
63 PATH@[72; 81) 63 PATH@[72; 81)
64 PATH@[72; 76) 64 PATH@[72; 76)
diff --git a/tests/data/parser/ok/0013_use_path_self_super.rs b/tests/data/parser/ok/0013_use_path_self_super.rs
new file mode 100644
index 000000000..faf6a42c7
--- /dev/null
+++ b/tests/data/parser/ok/0013_use_path_self_super.rs
@@ -0,0 +1,3 @@
1use self::foo;
2use super::super::bar;
3use ::self::a::super::bar;
diff --git a/tests/data/parser/ok/0013_use_path_self_super.txt b/tests/data/parser/ok/0013_use_path_self_super.txt
new file mode 100644
index 000000000..90bbb9b2d
--- /dev/null
+++ b/tests/data/parser/ok/0013_use_path_self_super.txt
@@ -0,0 +1,50 @@
1FILE@[0; 65)
2 USE_ITEM@[0; 15)
3 USE_KW@[0; 3)
4 PATH@[3; 13)
5 PATH@[3; 8)
6 PATH_SEGMENT@[3; 8)
7 WHITESPACE@[3; 4)
8 SELF_KW@[4; 8)
9 COLONCOLON@[8; 10)
10 PATH_SEGMENT@[10; 13)
11 IDENT@[10; 13)
12 SEMI@[13; 14)
13 WHITESPACE@[14; 15)
14 USE_ITEM@[15; 38)
15 USE_KW@[15; 18)
16 PATH@[18; 36)
17 PATH@[18; 31)
18 PATH@[18; 24)
19 PATH_SEGMENT@[18; 24)
20 WHITESPACE@[18; 19)
21 SUPER_KW@[19; 24)
22 COLONCOLON@[24; 26)
23 PATH_SEGMENT@[26; 31)
24 SUPER_KW@[26; 31)
25 COLONCOLON@[31; 33)
26 PATH_SEGMENT@[33; 36)
27 IDENT@[33; 36)
28 SEMI@[36; 37)
29 WHITESPACE@[37; 38)
30 USE_ITEM@[38; 65)
31 USE_KW@[38; 41)
32 PATH@[41; 63)
33 PATH@[41; 58)
34 PATH@[41; 51)
35 PATH@[41; 48)
36 PATH_SEGMENT@[41; 48)
37 WHITESPACE@[41; 42)
38 COLONCOLON@[42; 44)
39 SELF_KW@[44; 48)
40 COLONCOLON@[48; 50)
41 PATH_SEGMENT@[50; 51)
42 IDENT@[50; 51)
43 COLONCOLON@[51; 53)
44 PATH_SEGMENT@[53; 58)
45 SUPER_KW@[53; 58)
46 COLONCOLON@[58; 60)
47 PATH_SEGMENT@[60; 63)
48 IDENT@[60; 63)
49 SEMI@[63; 64)
50 WHITESPACE@[64; 65)