diff options
author | Aleksey Kladov <[email protected]> | 2018-07-31 18:38:36 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-07-31 18:38:36 +0100 |
commit | ce3462ce8fed8bb86d887643479c73908fc326a3 (patch) | |
tree | f6999e706291b7e39da48259728efd8ec85c848c /src | |
parent | eba1e8a334a707645701db48fddc61acad7b2dbc (diff) |
struct literals
Diffstat (limited to 'src')
-rw-r--r-- | src/grammar.ron | 2 | ||||
-rw-r--r-- | src/parser/grammar/expressions.rs | 39 | ||||
-rw-r--r-- | src/syntax_kinds/generated.rs | 4 |
3 files changed, 44 insertions, 1 deletions
diff --git a/src/grammar.ron b/src/grammar.ron index 6c67db739..564249200 100644 --- a/src/grammar.ron +++ b/src/grammar.ron | |||
@@ -129,6 +129,8 @@ Grammar( | |||
129 | "METHOD_CALL_EXPR", | 129 | "METHOD_CALL_EXPR", |
130 | "FIELD_EXPR", | 130 | "FIELD_EXPR", |
131 | "REF_EXPR", | 131 | "REF_EXPR", |
132 | "STRUCT_LIT", | ||
133 | "STRUCT_LIT_FIELD", | ||
132 | 134 | ||
133 | "EXTERN_BLOCK", | 135 | "EXTERN_BLOCK", |
134 | "ENUM_VARIANT", | 136 | "ENUM_VARIANT", |
diff --git a/src/parser/grammar/expressions.rs b/src/parser/grammar/expressions.rs index 3956df568..5b18e2294 100644 --- a/src/parser/grammar/expressions.rs +++ b/src/parser/grammar/expressions.rs | |||
@@ -154,5 +154,42 @@ fn path_expr(p: &mut Parser) -> CompletedMarker { | |||
154 | assert!(paths::is_path_start(p)); | 154 | assert!(paths::is_path_start(p)); |
155 | let m = p.start(); | 155 | let m = p.start(); |
156 | paths::expr_path(p); | 156 | paths::expr_path(p); |
157 | m.complete(p, PATH_EXPR) | 157 | if p.at(L_CURLY) { |
158 | struct_lit(p); | ||
159 | m.complete(p, STRUCT_LIT) | ||
160 | } else { | ||
161 | m.complete(p, PATH_EXPR) | ||
162 | } | ||
163 | } | ||
164 | |||
165 | // test struct_lit | ||
166 | // fn foo() { | ||
167 | // S {}; | ||
168 | // S { x, y: 32, }; | ||
169 | // S { x, y: 32, ..Default::default() }; | ||
170 | // } | ||
171 | fn struct_lit(p: &mut Parser) { | ||
172 | assert!(p.at(L_CURLY)); | ||
173 | p.bump(); | ||
174 | while !p.at(EOF) && !p.at(R_CURLY) { | ||
175 | match p.current() { | ||
176 | IDENT => { | ||
177 | let m = p.start(); | ||
178 | name_ref(p); | ||
179 | if p.eat(COLON) { | ||
180 | expr(p); | ||
181 | } | ||
182 | m.complete(p, STRUCT_LIT_FIELD); | ||
183 | }, | ||
184 | DOTDOT => { | ||
185 | p.bump(); | ||
186 | expr(p); | ||
187 | }, | ||
188 | _ => p.err_and_bump("expected identifier"), | ||
189 | } | ||
190 | if !p.at(R_CURLY) { | ||
191 | p.expect(COMMA); | ||
192 | } | ||
193 | } | ||
194 | p.expect(R_CURLY); | ||
158 | } | 195 | } |
diff --git a/src/syntax_kinds/generated.rs b/src/syntax_kinds/generated.rs index 7c9333fc5..655764528 100644 --- a/src/syntax_kinds/generated.rs +++ b/src/syntax_kinds/generated.rs | |||
@@ -120,6 +120,8 @@ pub enum SyntaxKind { | |||
120 | METHOD_CALL_EXPR, | 120 | METHOD_CALL_EXPR, |
121 | FIELD_EXPR, | 121 | FIELD_EXPR, |
122 | REF_EXPR, | 122 | REF_EXPR, |
123 | STRUCT_LIT, | ||
124 | STRUCT_LIT_FIELD, | ||
123 | EXTERN_BLOCK, | 125 | EXTERN_BLOCK, |
124 | ENUM_VARIANT, | 126 | ENUM_VARIANT, |
125 | NAMED_FIELD, | 127 | NAMED_FIELD, |
@@ -277,6 +279,8 @@ impl SyntaxKind { | |||
277 | METHOD_CALL_EXPR => &SyntaxInfo { name: "METHOD_CALL_EXPR" }, | 279 | METHOD_CALL_EXPR => &SyntaxInfo { name: "METHOD_CALL_EXPR" }, |
278 | FIELD_EXPR => &SyntaxInfo { name: "FIELD_EXPR" }, | 280 | FIELD_EXPR => &SyntaxInfo { name: "FIELD_EXPR" }, |
279 | REF_EXPR => &SyntaxInfo { name: "REF_EXPR" }, | 281 | REF_EXPR => &SyntaxInfo { name: "REF_EXPR" }, |
282 | STRUCT_LIT => &SyntaxInfo { name: "STRUCT_LIT" }, | ||
283 | STRUCT_LIT_FIELD => &SyntaxInfo { name: "STRUCT_LIT_FIELD" }, | ||
280 | EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" }, | 284 | EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" }, |
281 | ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" }, | 285 | ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" }, |
282 | NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" }, | 286 | NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" }, |