aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-07-31 18:38:36 +0100
committerAleksey Kladov <[email protected]>2018-07-31 18:38:36 +0100
commitce3462ce8fed8bb86d887643479c73908fc326a3 (patch)
treef6999e706291b7e39da48259728efd8ec85c848c /src
parenteba1e8a334a707645701db48fddc61acad7b2dbc (diff)
struct literals
Diffstat (limited to 'src')
-rw-r--r--src/grammar.ron2
-rw-r--r--src/parser/grammar/expressions.rs39
-rw-r--r--src/syntax_kinds/generated.rs4
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// }
171fn 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" },