diff options
author | Aleksey Kladov <[email protected]> | 2018-08-11 08:11:58 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-08-11 08:11:58 +0100 |
commit | 2e971cdcbbeb543ab6b66dc8558644c1f4a80670 (patch) | |
tree | 61facd6dbdcdf00bbbbda503cc3b78826e63af07 | |
parent | e69c70e2a208fd89d4d49a104f5516c55546309e (diff) |
Use dict for AST
-rw-r--r-- | crates/libsyntax2/src/ast/generated.rs | 3 | ||||
-rw-r--r-- | crates/libsyntax2/src/ast/generated.rs.tera | 23 | ||||
-rw-r--r-- | crates/libsyntax2/src/grammar.ron | 18 |
3 files changed, 18 insertions, 26 deletions
diff --git a/crates/libsyntax2/src/ast/generated.rs b/crates/libsyntax2/src/ast/generated.rs index 0767df334..12e5a1c3e 100644 --- a/crates/libsyntax2/src/ast/generated.rs +++ b/crates/libsyntax2/src/ast/generated.rs | |||
@@ -4,7 +4,6 @@ use { | |||
4 | SyntaxKind::*, | 4 | SyntaxKind::*, |
5 | }; | 5 | }; |
6 | 6 | ||
7 | |||
8 | #[derive(Debug, Clone, Copy)] | 7 | #[derive(Debug, Clone, Copy)] |
9 | pub struct File<R: TreeRoot = Arc<SyntaxRoot>> { | 8 | pub struct File<R: TreeRoot = Arc<SyntaxRoot>> { |
10 | syntax: SyntaxNode<R>, | 9 | syntax: SyntaxNode<R>, |
@@ -28,7 +27,6 @@ impl<R: TreeRoot> File<R> { | |||
28 | } | 27 | } |
29 | } | 28 | } |
30 | 29 | ||
31 | |||
32 | #[derive(Debug, Clone, Copy)] | 30 | #[derive(Debug, Clone, Copy)] |
33 | pub struct Function<R: TreeRoot = Arc<SyntaxRoot>> { | 31 | pub struct Function<R: TreeRoot = Arc<SyntaxRoot>> { |
34 | syntax: SyntaxNode<R>, | 32 | syntax: SyntaxNode<R>, |
@@ -53,7 +51,6 @@ impl<R: TreeRoot> Function<R> { | |||
53 | } | 51 | } |
54 | } | 52 | } |
55 | 53 | ||
56 | |||
57 | #[derive(Debug, Clone, Copy)] | 54 | #[derive(Debug, Clone, Copy)] |
58 | pub struct Name<R: TreeRoot = Arc<SyntaxRoot>> { | 55 | pub struct Name<R: TreeRoot = Arc<SyntaxRoot>> { |
59 | syntax: SyntaxNode<R>, | 56 | syntax: SyntaxNode<R>, |
diff --git a/crates/libsyntax2/src/ast/generated.rs.tera b/crates/libsyntax2/src/ast/generated.rs.tera index 86de7bce8..09630e427 100644 --- a/crates/libsyntax2/src/ast/generated.rs.tera +++ b/crates/libsyntax2/src/ast/generated.rs.tera | |||
@@ -3,28 +3,27 @@ use { | |||
3 | SyntaxNode, SyntaxRoot, TreeRoot, AstNode, | 3 | SyntaxNode, SyntaxRoot, TreeRoot, AstNode, |
4 | SyntaxKind::*, | 4 | SyntaxKind::*, |
5 | }; | 5 | }; |
6 | {% for node in ast %} | 6 | {% for node, methods in ast %} |
7 | {% set Name = node.kind | camel %} | ||
8 | #[derive(Debug, Clone, Copy)] | 7 | #[derive(Debug, Clone, Copy)] |
9 | pub struct {{ Name }}<R: TreeRoot = Arc<SyntaxRoot>> { | 8 | pub struct {{ node }}<R: TreeRoot = Arc<SyntaxRoot>> { |
10 | syntax: SyntaxNode<R>, | 9 | syntax: SyntaxNode<R>, |
11 | } | 10 | } |
12 | 11 | ||
13 | impl<R: TreeRoot> AstNode<R> for {{ Name }}<R> { | 12 | impl<R: TreeRoot> AstNode<R> for {{ node }}<R> { |
14 | fn cast(syntax: SyntaxNode<R>) -> Option<Self> { | 13 | fn cast(syntax: SyntaxNode<R>) -> Option<Self> { |
15 | match syntax.kind() { | 14 | match syntax.kind() { |
16 | {{ node.kind }} => Some({{ Name }} { syntax }), | 15 | {{ node | upper }} => Some({{ node }} { syntax }), |
17 | _ => None, | 16 | _ => None, |
18 | } | 17 | } |
19 | } | 18 | } |
20 | fn syntax(&self) -> &SyntaxNode<R> { &self.syntax } | 19 | fn syntax(&self) -> &SyntaxNode<R> { &self.syntax } |
21 | } | 20 | } |
22 | 21 | ||
23 | impl<R: TreeRoot> {{ Name }}<R> { | 22 | impl<R: TreeRoot> {{ node }}<R> { |
24 | {%- if node.collections -%} | 23 | {%- if methods.collections -%} |
25 | {%- for m in node.collections -%} | 24 | {%- for m in methods.collections -%} |
26 | {%- set method_name = m.0 -%} | 25 | {%- set method_name = m.0 -%} |
27 | {%- set ChildName = m.1 | camel %} | 26 | {%- set ChildName = m.1 %} |
28 | pub fn {{ method_name }}<'a>(&'a self) -> impl Iterator<Item = {{ ChildName }}<R>> + 'a { | 27 | pub fn {{ method_name }}<'a>(&'a self) -> impl Iterator<Item = {{ ChildName }}<R>> + 'a { |
29 | self.syntax() | 28 | self.syntax() |
30 | .children() | 29 | .children() |
@@ -33,10 +32,10 @@ impl<R: TreeRoot> {{ Name }}<R> { | |||
33 | {% endfor -%} | 32 | {% endfor -%} |
34 | {%- endif -%} | 33 | {%- endif -%} |
35 | 34 | ||
36 | {%- if node.options -%} | 35 | {%- if methods.options -%} |
37 | {%- for m in node.options -%} | 36 | {%- for m in methods.options -%} |
38 | {%- set method_name = m.0 -%} | 37 | {%- set method_name = m.0 -%} |
39 | {%- set ChildName = m.1 | camel %} | 38 | {%- set ChildName = m.1 %} |
40 | pub fn {{ method_name }}(&self) -> Option<{{ ChildName }}<R>> { | 39 | pub fn {{ method_name }}(&self) -> Option<{{ ChildName }}<R>> { |
41 | self.syntax() | 40 | self.syntax() |
42 | .children() | 41 | .children() |
diff --git a/crates/libsyntax2/src/grammar.ron b/crates/libsyntax2/src/grammar.ron index 06a4eb6a7..650f72212 100644 --- a/crates/libsyntax2/src/grammar.ron +++ b/crates/libsyntax2/src/grammar.ron | |||
@@ -213,21 +213,17 @@ Grammar( | |||
213 | "SELF_PARAM", | 213 | "SELF_PARAM", |
214 | "ARG_LIST", | 214 | "ARG_LIST", |
215 | ], | 215 | ], |
216 | ast: [ | 216 | ast: { |
217 | ( | 217 | "File": ( |
218 | kind: "FILE", | ||
219 | collections: [ | 218 | collections: [ |
220 | ["functions", "FUNCTION"] | 219 | ["functions", "Function"] |
221 | ] | 220 | ] |
222 | ), | 221 | ), |
223 | ( | 222 | "Function": ( |
224 | kind: "FUNCTION", | ||
225 | options: [ | 223 | options: [ |
226 | ["name", "NAME"] | 224 | ["name", "Name"] |
227 | ] | 225 | ] |
228 | ), | 226 | ), |
229 | ( | 227 | "Name": (), |
230 | kind: "NAME" | 228 | }, |
231 | ), | ||
232 | ] | ||
233 | ) | 229 | ) |