diff options
Diffstat (limited to 'src/bin')
-rw-r--r-- | src/bin/gen.rs | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/bin/gen.rs b/src/bin/gen.rs index f5a66d9f2..9d7f7e389 100644 --- a/src/bin/gen.rs +++ b/src/bin/gen.rs | |||
@@ -17,6 +17,7 @@ fn main() { | |||
17 | 17 | ||
18 | #[derive(Deserialize)] | 18 | #[derive(Deserialize)] |
19 | struct Grammar { | 19 | struct Grammar { |
20 | keywords: Vec<String>, | ||
20 | tokens: Vec<String>, | 21 | tokens: Vec<String>, |
21 | nodes: Vec<String>, | 22 | nodes: Vec<String>, |
22 | } | 23 | } |
@@ -33,8 +34,10 @@ impl Grammar { | |||
33 | acc.push_str("use tree::{SyntaxKind, SyntaxInfo};\n"); | 34 | acc.push_str("use tree::{SyntaxKind, SyntaxInfo};\n"); |
34 | acc.push_str("\n"); | 35 | acc.push_str("\n"); |
35 | 36 | ||
36 | let syntax_kinds: Vec<&String> = | 37 | let syntax_kinds: Vec<String> = |
37 | self.tokens.iter().chain(self.nodes.iter()) | 38 | self.keywords.iter().map(|kw| kw_token(kw)) |
39 | .chain(self.tokens.iter().cloned()) | ||
40 | .chain(self.nodes.iter().cloned()) | ||
38 | .collect(); | 41 | .collect(); |
39 | 42 | ||
40 | for (idx, kind) in syntax_kinds.iter().enumerate() { | 43 | for (idx, kind) in syntax_kinds.iter().enumerate() { |
@@ -60,6 +63,14 @@ impl Grammar { | |||
60 | 63 | ||
61 | acc.push_str("pub(crate) fn syntax_info(kind: SyntaxKind) -> &'static SyntaxInfo {\n"); | 64 | acc.push_str("pub(crate) fn syntax_info(kind: SyntaxKind) -> &'static SyntaxInfo {\n"); |
62 | acc.push_str(" &INFOS[kind.0 as usize]\n"); | 65 | acc.push_str(" &INFOS[kind.0 as usize]\n"); |
66 | acc.push_str("}\n\n"); | ||
67 | acc.push_str("pub(crate) fn ident_to_keyword(ident: &str) -> Option<SyntaxKind> {\n"); | ||
68 | acc.push_str(" match ident {\n"); | ||
69 | for kw in self.keywords.iter() { | ||
70 | write!(acc, " {:?} => Some({}),\n", kw, kw_token(kw)).unwrap(); | ||
71 | } | ||
72 | acc.push_str(" _ => None,\n"); | ||
73 | acc.push_str(" }\n"); | ||
63 | acc.push_str("}\n"); | 74 | acc.push_str("}\n"); |
64 | acc | 75 | acc |
65 | } | 76 | } |
@@ -77,4 +88,8 @@ fn generated_file() -> PathBuf { | |||
77 | 88 | ||
78 | fn scream(word: &str) -> String { | 89 | fn scream(word: &str) -> String { |
79 | word.chars().map(|c| c.to_ascii_uppercase()).collect() | 90 | word.chars().map(|c| c.to_ascii_uppercase()).collect() |
91 | } | ||
92 | |||
93 | fn kw_token(keyword: &str) -> String { | ||
94 | format!("{}_KW", scream(keyword)) | ||
80 | } \ No newline at end of file | 95 | } \ No newline at end of file |