aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-01-08 21:06:42 +0000
committerAleksey Kladov <[email protected]>2018-01-08 21:06:42 +0000
commit7f8ca07d864b5ec8e668c48c4c029dd0584eae4a (patch)
treeddf968cb2da4e95bb8cb247a261a1baa87664718
parent0cf2d6afee52fe248c8a032346c5bdb6dc7cd928 (diff)
G: extern crate
-rw-r--r--grammar.ron5
-rw-r--r--src/parser/event_parser/grammar/items.rs9
-rw-r--r--src/parser/event_parser/grammar/mod.rs7
-rw-r--r--src/syntax_kinds.rs131
-rw-r--r--tests/data/lexer/0011_keywords.rs2
-rw-r--r--tests/data/lexer/0011_keywords.txt6
-rw-r--r--tests/data/parser/ok/0007_extern_crate.rs2
-rw-r--r--tests/data/parser/ok/0007_extern_crate.txt22
8 files changed, 122 insertions, 62 deletions
diff --git a/grammar.ron b/grammar.ron
index 8418ed2a5..c475826e4 100644
--- a/grammar.ron
+++ b/grammar.ron
@@ -8,6 +8,9 @@ Grammar(
8 "impl", 8 "impl",
9 "true", 9 "true",
10 "false", 10 "false",
11 "as",
12 "extern",
13 "crate",
11 ], 14 ],
12 tokens: [ 15 tokens: [
13 "ERROR", 16 "ERROR",
@@ -67,8 +70,10 @@ Grammar(
67 "STRUCT_ITEM", 70 "STRUCT_ITEM",
68 "STRUCT_FIELD", 71 "STRUCT_FIELD",
69 "FN_ITEM", 72 "FN_ITEM",
73 "EXTERN_CRATE_ITEM",
70 "ATTR", 74 "ATTR",
71 "META_ITEM", 75 "META_ITEM",
72 "LITERAL", 76 "LITERAL",
77 "ALIAS",
73 ] 78 ]
74) \ No newline at end of file 79) \ No newline at end of file
diff --git a/src/parser/event_parser/grammar/items.rs b/src/parser/event_parser/grammar/items.rs
index 68b444b69..9b174679c 100644
--- a/src/parser/event_parser/grammar/items.rs
+++ b/src/parser/event_parser/grammar/items.rs
@@ -11,7 +11,7 @@ pub(super) fn mod_items(p: &mut Parser) {
11 11
12fn item_first(p: &Parser) -> bool { 12fn item_first(p: &Parser) -> bool {
13 match p.current() { 13 match p.current() {
14 STRUCT_KW | FN_KW => true, 14 STRUCT_KW | FN_KW | EXTERN_KW => true,
15 _ => false, 15 _ => false,
16 } 16 }
17} 17}
@@ -41,7 +41,8 @@ fn item(p: &mut Parser) -> bool {
41 // || node_if(p, FN_KW, FN_ITEM, fn_item) 41 // || node_if(p, FN_KW, FN_ITEM, fn_item)
42 // || node_if(p, MOD_KW, MOD_ITEM, mod_item) 42 // || node_if(p, MOD_KW, MOD_ITEM, mod_item)
43 // || node_if(p, TYPE_KW, TYPE_ITEM, type_item) 43 // || node_if(p, TYPE_KW, TYPE_ITEM, type_item)
44 node_if(p, STRUCT_KW, STRUCT_ITEM, struct_item) 44 node_if(p, [EXTERN_KW, CRATE_KW], EXTERN_CRATE_ITEM, extern_crate_item)
45 || node_if(p, STRUCT_KW, STRUCT_ITEM, struct_item)
45 || node_if(p, FN_KW, FN_ITEM, fn_item) 46 || node_if(p, FN_KW, FN_ITEM, fn_item)
46} 47}
47 48
@@ -50,6 +51,10 @@ fn struct_item(p: &mut Parser) {
50 && p.curly_block(|p| comma_list(p, EOF, struct_field)); 51 && p.curly_block(|p| comma_list(p, EOF, struct_field));
51} 52}
52 53
54fn extern_crate_item(p: &mut Parser) {
55 p.expect(IDENT) && alias(p) && p.expect(SEMI);
56}
57
53fn struct_field(p: &mut Parser) -> bool { 58fn struct_field(p: &mut Parser) -> bool {
54 node_if(p, IDENT, STRUCT_FIELD, |p| { 59 node_if(p, IDENT, STRUCT_FIELD, |p| {
55 p.expect(COLON) && p.expect(IDENT); 60 p.expect(COLON) && p.expect(IDENT);
diff --git a/src/parser/event_parser/grammar/mod.rs b/src/parser/event_parser/grammar/mod.rs
index 78309aa83..dd1270eae 100644
--- a/src/parser/event_parser/grammar/mod.rs
+++ b/src/parser/event_parser/grammar/mod.rs
@@ -18,6 +18,13 @@ pub(crate) fn file(p: &mut Parser) {
18fn visibility(_: &mut Parser) { 18fn visibility(_: &mut Parser) {
19} 19}
20 20
21fn alias(p: &mut Parser) -> bool {
22 node_if(p, AS_KW, ALIAS, |p| {
23 p.expect(IDENT);
24 });
25 true //FIXME: return false if three are errors
26}
27
21fn node_if<F: FnOnce(&mut Parser), L: Lookahead>( 28fn node_if<F: FnOnce(&mut Parser), L: Lookahead>(
22 p: &mut Parser, 29 p: &mut Parser,
23 first: L, 30 first: L,
diff --git a/src/syntax_kinds.rs b/src/syntax_kinds.rs
index b82a4f7f2..6db82051e 100644
--- a/src/syntax_kinds.rs
+++ b/src/syntax_kinds.rs
@@ -9,66 +9,71 @@ pub const TRAIT_KW: SyntaxKind = SyntaxKind(4);
9pub const IMPL_KW: SyntaxKind = SyntaxKind(5); 9pub const IMPL_KW: SyntaxKind = SyntaxKind(5);
10pub const TRUE_KW: SyntaxKind = SyntaxKind(6); 10pub const TRUE_KW: SyntaxKind = SyntaxKind(6);
11pub const FALSE_KW: SyntaxKind = SyntaxKind(7); 11pub const FALSE_KW: SyntaxKind = SyntaxKind(7);
12pub const ERROR: SyntaxKind = SyntaxKind(8); 12pub const AS_KW: SyntaxKind = SyntaxKind(8);
13pub const IDENT: SyntaxKind = SyntaxKind(9); 13pub const EXTERN_KW: SyntaxKind = SyntaxKind(9);
14pub const UNDERSCORE: SyntaxKind = SyntaxKind(10); 14pub const CRATE_KW: SyntaxKind = SyntaxKind(10);
15pub const WHITESPACE: SyntaxKind = SyntaxKind(11); 15pub const ERROR: SyntaxKind = SyntaxKind(11);
16pub const INT_NUMBER: SyntaxKind = SyntaxKind(12); 16pub const IDENT: SyntaxKind = SyntaxKind(12);
17pub const FLOAT_NUMBER: SyntaxKind = SyntaxKind(13); 17pub const UNDERSCORE: SyntaxKind = SyntaxKind(13);
18pub const SEMI: SyntaxKind = SyntaxKind(14); 18pub const WHITESPACE: SyntaxKind = SyntaxKind(14);
19pub const COMMA: SyntaxKind = SyntaxKind(15); 19pub const INT_NUMBER: SyntaxKind = SyntaxKind(15);
20pub const DOT: SyntaxKind = SyntaxKind(16); 20pub const FLOAT_NUMBER: SyntaxKind = SyntaxKind(16);
21pub const DOTDOT: SyntaxKind = SyntaxKind(17); 21pub const SEMI: SyntaxKind = SyntaxKind(17);
22pub const DOTDOTDOT: SyntaxKind = SyntaxKind(18); 22pub const COMMA: SyntaxKind = SyntaxKind(18);
23pub const DOTDOTEQ: SyntaxKind = SyntaxKind(19); 23pub const DOT: SyntaxKind = SyntaxKind(19);
24pub const L_PAREN: SyntaxKind = SyntaxKind(20); 24pub const DOTDOT: SyntaxKind = SyntaxKind(20);
25pub const R_PAREN: SyntaxKind = SyntaxKind(21); 25pub const DOTDOTDOT: SyntaxKind = SyntaxKind(21);
26pub const L_CURLY: SyntaxKind = SyntaxKind(22); 26pub const DOTDOTEQ: SyntaxKind = SyntaxKind(22);
27pub const R_CURLY: SyntaxKind = SyntaxKind(23); 27pub const L_PAREN: SyntaxKind = SyntaxKind(23);
28pub const L_BRACK: SyntaxKind = SyntaxKind(24); 28pub const R_PAREN: SyntaxKind = SyntaxKind(24);
29pub const R_BRACK: SyntaxKind = SyntaxKind(25); 29pub const L_CURLY: SyntaxKind = SyntaxKind(25);
30pub const L_ANGLE: SyntaxKind = SyntaxKind(26); 30pub const R_CURLY: SyntaxKind = SyntaxKind(26);
31pub const R_ANGLE: SyntaxKind = SyntaxKind(27); 31pub const L_BRACK: SyntaxKind = SyntaxKind(27);
32pub const AT: SyntaxKind = SyntaxKind(28); 32pub const R_BRACK: SyntaxKind = SyntaxKind(28);
33pub const POUND: SyntaxKind = SyntaxKind(29); 33pub const L_ANGLE: SyntaxKind = SyntaxKind(29);
34pub const TILDE: SyntaxKind = SyntaxKind(30); 34pub const R_ANGLE: SyntaxKind = SyntaxKind(30);
35pub const QUESTION: SyntaxKind = SyntaxKind(31); 35pub const AT: SyntaxKind = SyntaxKind(31);
36pub const COLON: SyntaxKind = SyntaxKind(32); 36pub const POUND: SyntaxKind = SyntaxKind(32);
37pub const COLONCOLON: SyntaxKind = SyntaxKind(33); 37pub const TILDE: SyntaxKind = SyntaxKind(33);
38pub const DOLLAR: SyntaxKind = SyntaxKind(34); 38pub const QUESTION: SyntaxKind = SyntaxKind(34);
39pub const EQ: SyntaxKind = SyntaxKind(35); 39pub const COLON: SyntaxKind = SyntaxKind(35);
40pub const EQEQ: SyntaxKind = SyntaxKind(36); 40pub const COLONCOLON: SyntaxKind = SyntaxKind(36);
41pub const FAT_ARROW: SyntaxKind = SyntaxKind(37); 41pub const DOLLAR: SyntaxKind = SyntaxKind(37);
42pub const NEQ: SyntaxKind = SyntaxKind(38); 42pub const EQ: SyntaxKind = SyntaxKind(38);
43pub const EXCL: SyntaxKind = SyntaxKind(39); 43pub const EQEQ: SyntaxKind = SyntaxKind(39);
44pub const LIFETIME: SyntaxKind = SyntaxKind(40); 44pub const FAT_ARROW: SyntaxKind = SyntaxKind(40);
45pub const CHAR: SyntaxKind = SyntaxKind(41); 45pub const NEQ: SyntaxKind = SyntaxKind(41);
46pub const BYTE: SyntaxKind = SyntaxKind(42); 46pub const EXCL: SyntaxKind = SyntaxKind(42);
47pub const STRING: SyntaxKind = SyntaxKind(43); 47pub const LIFETIME: SyntaxKind = SyntaxKind(43);
48pub const RAW_STRING: SyntaxKind = SyntaxKind(44); 48pub const CHAR: SyntaxKind = SyntaxKind(44);
49pub const BYTE_STRING: SyntaxKind = SyntaxKind(45); 49pub const BYTE: SyntaxKind = SyntaxKind(45);
50pub const RAW_BYTE_STRING: SyntaxKind = SyntaxKind(46); 50pub const STRING: SyntaxKind = SyntaxKind(46);
51pub const PLUS: SyntaxKind = SyntaxKind(47); 51pub const RAW_STRING: SyntaxKind = SyntaxKind(47);
52pub const MINUS: SyntaxKind = SyntaxKind(48); 52pub const BYTE_STRING: SyntaxKind = SyntaxKind(48);
53pub const STAR: SyntaxKind = SyntaxKind(49); 53pub const RAW_BYTE_STRING: SyntaxKind = SyntaxKind(49);
54pub const SLASH: SyntaxKind = SyntaxKind(50); 54pub const PLUS: SyntaxKind = SyntaxKind(50);
55pub const CARET: SyntaxKind = SyntaxKind(51); 55pub const MINUS: SyntaxKind = SyntaxKind(51);
56pub const PERCENT: SyntaxKind = SyntaxKind(52); 56pub const STAR: SyntaxKind = SyntaxKind(52);
57pub const AMPERSAND: SyntaxKind = SyntaxKind(53); 57pub const SLASH: SyntaxKind = SyntaxKind(53);
58pub const PIPE: SyntaxKind = SyntaxKind(54); 58pub const CARET: SyntaxKind = SyntaxKind(54);
59pub const THIN_ARROW: SyntaxKind = SyntaxKind(55); 59pub const PERCENT: SyntaxKind = SyntaxKind(55);
60pub const COMMENT: SyntaxKind = SyntaxKind(56); 60pub const AMPERSAND: SyntaxKind = SyntaxKind(56);
61pub const DOC_COMMENT: SyntaxKind = SyntaxKind(57); 61pub const PIPE: SyntaxKind = SyntaxKind(57);
62pub const SHEBANG: SyntaxKind = SyntaxKind(58); 62pub const THIN_ARROW: SyntaxKind = SyntaxKind(58);
63pub const FILE: SyntaxKind = SyntaxKind(59); 63pub const COMMENT: SyntaxKind = SyntaxKind(59);
64pub const STRUCT_ITEM: SyntaxKind = SyntaxKind(60); 64pub const DOC_COMMENT: SyntaxKind = SyntaxKind(60);
65pub const STRUCT_FIELD: SyntaxKind = SyntaxKind(61); 65pub const SHEBANG: SyntaxKind = SyntaxKind(61);
66pub const FN_ITEM: SyntaxKind = SyntaxKind(62); 66pub const FILE: SyntaxKind = SyntaxKind(62);
67pub const ATTR: SyntaxKind = SyntaxKind(63); 67pub const STRUCT_ITEM: SyntaxKind = SyntaxKind(63);
68pub const META_ITEM: SyntaxKind = SyntaxKind(64); 68pub const STRUCT_FIELD: SyntaxKind = SyntaxKind(64);
69pub const LITERAL: SyntaxKind = SyntaxKind(65); 69pub const FN_ITEM: SyntaxKind = SyntaxKind(65);
70pub const EXTERN_CRATE_ITEM: SyntaxKind = SyntaxKind(66);
71pub const ATTR: SyntaxKind = SyntaxKind(67);
72pub const META_ITEM: SyntaxKind = SyntaxKind(68);
73pub const LITERAL: SyntaxKind = SyntaxKind(69);
74pub const ALIAS: SyntaxKind = SyntaxKind(70);
70 75
71static INFOS: [SyntaxInfo; 66] = [ 76static INFOS: [SyntaxInfo; 71] = [
72 SyntaxInfo { name: "USE_KW" }, 77 SyntaxInfo { name: "USE_KW" },
73 SyntaxInfo { name: "FN_KW" }, 78 SyntaxInfo { name: "FN_KW" },
74 SyntaxInfo { name: "STRUCT_KW" }, 79 SyntaxInfo { name: "STRUCT_KW" },
@@ -77,6 +82,9 @@ static INFOS: [SyntaxInfo; 66] = [
77 SyntaxInfo { name: "IMPL_KW" }, 82 SyntaxInfo { name: "IMPL_KW" },
78 SyntaxInfo { name: "TRUE_KW" }, 83 SyntaxInfo { name: "TRUE_KW" },
79 SyntaxInfo { name: "FALSE_KW" }, 84 SyntaxInfo { name: "FALSE_KW" },
85 SyntaxInfo { name: "AS_KW" },
86 SyntaxInfo { name: "EXTERN_KW" },
87 SyntaxInfo { name: "CRATE_KW" },
80 SyntaxInfo { name: "ERROR" }, 88 SyntaxInfo { name: "ERROR" },
81 SyntaxInfo { name: "IDENT" }, 89 SyntaxInfo { name: "IDENT" },
82 SyntaxInfo { name: "UNDERSCORE" }, 90 SyntaxInfo { name: "UNDERSCORE" },
@@ -132,9 +140,11 @@ static INFOS: [SyntaxInfo; 66] = [
132 SyntaxInfo { name: "STRUCT_ITEM" }, 140 SyntaxInfo { name: "STRUCT_ITEM" },
133 SyntaxInfo { name: "STRUCT_FIELD" }, 141 SyntaxInfo { name: "STRUCT_FIELD" },
134 SyntaxInfo { name: "FN_ITEM" }, 142 SyntaxInfo { name: "FN_ITEM" },
143 SyntaxInfo { name: "EXTERN_CRATE_ITEM" },
135 SyntaxInfo { name: "ATTR" }, 144 SyntaxInfo { name: "ATTR" },
136 SyntaxInfo { name: "META_ITEM" }, 145 SyntaxInfo { name: "META_ITEM" },
137 SyntaxInfo { name: "LITERAL" }, 146 SyntaxInfo { name: "LITERAL" },
147 SyntaxInfo { name: "ALIAS" },
138]; 148];
139 149
140pub(crate) fn syntax_info(kind: SyntaxKind) -> &'static SyntaxInfo { 150pub(crate) fn syntax_info(kind: SyntaxKind) -> &'static SyntaxInfo {
@@ -151,6 +161,9 @@ pub(crate) fn ident_to_keyword(ident: &str) -> Option<SyntaxKind> {
151 "impl" => Some(IMPL_KW), 161 "impl" => Some(IMPL_KW),
152 "true" => Some(TRUE_KW), 162 "true" => Some(TRUE_KW),
153 "false" => Some(FALSE_KW), 163 "false" => Some(FALSE_KW),
164 "as" => Some(AS_KW),
165 "extern" => Some(EXTERN_KW),
166 "crate" => Some(CRATE_KW),
154 _ => None, 167 _ => None,
155 } 168 }
156} 169}
diff --git a/tests/data/lexer/0011_keywords.rs b/tests/data/lexer/0011_keywords.rs
index 1f4a4a74c..4adb1587e 100644
--- a/tests/data/lexer/0011_keywords.rs
+++ b/tests/data/lexer/0011_keywords.rs
@@ -1 +1 @@
fn use struct trait enum impl true false fn use struct trait enum impl true false as extern crate
diff --git a/tests/data/lexer/0011_keywords.txt b/tests/data/lexer/0011_keywords.txt
index eded37084..bf8ceffd4 100644
--- a/tests/data/lexer/0011_keywords.txt
+++ b/tests/data/lexer/0011_keywords.txt
@@ -13,4 +13,10 @@ WHITESPACE 1 " "
13TRUE_KW 4 "true" 13TRUE_KW 4 "true"
14WHITESPACE 1 " " 14WHITESPACE 1 " "
15FALSE_KW 5 "false" 15FALSE_KW 5 "false"
16WHITESPACE 1 " "
17AS_KW 2 "as"
18WHITESPACE 1 " "
19EXTERN_KW 6 "extern"
20WHITESPACE 1 " "
21CRATE_KW 5 "crate"
16WHITESPACE 1 "\n" 22WHITESPACE 1 "\n"
diff --git a/tests/data/parser/ok/0007_extern_crate.rs b/tests/data/parser/ok/0007_extern_crate.rs
new file mode 100644
index 000000000..3ce336676
--- /dev/null
+++ b/tests/data/parser/ok/0007_extern_crate.rs
@@ -0,0 +1,2 @@
1extern crate foo;
2extern crate foo as bar;
diff --git a/tests/data/parser/ok/0007_extern_crate.txt b/tests/data/parser/ok/0007_extern_crate.txt
new file mode 100644
index 000000000..902c80f7d
--- /dev/null
+++ b/tests/data/parser/ok/0007_extern_crate.txt
@@ -0,0 +1,22 @@
1FILE@[0; 43)
2 EXTERN_CRATE_ITEM@[0; 18)
3 EXTERN_KW@[0; 6)
4 WHITESPACE@[6; 7)
5 CRATE_KW@[7; 12)
6 WHITESPACE@[12; 13)
7 IDENT@[13; 16)
8 SEMI@[16; 17)
9 WHITESPACE@[17; 18)
10 EXTERN_CRATE_ITEM@[18; 43)
11 EXTERN_KW@[18; 24)
12 WHITESPACE@[24; 25)
13 CRATE_KW@[25; 30)
14 WHITESPACE@[30; 31)
15 IDENT@[31; 34)
16 ALIAS@[34; 41)
17 WHITESPACE@[34; 35)
18 AS_KW@[35; 37)
19 WHITESPACE@[37; 38)
20 IDENT@[38; 41)
21 SEMI@[41; 42)
22 WHITESPACE@[42; 43)