From ce3462ce8fed8bb86d887643479c73908fc326a3 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 31 Jul 2018 20:38:36 +0300 Subject: struct literals --- src/grammar.ron | 2 ++ src/parser/grammar/expressions.rs | 39 ++++++++++++++++++++++++++++++++++++++- src/syntax_kinds/generated.rs | 4 ++++ 3 files changed, 44 insertions(+), 1 deletion(-) (limited to 'src') 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( "METHOD_CALL_EXPR", "FIELD_EXPR", "REF_EXPR", + "STRUCT_LIT", + "STRUCT_LIT_FIELD", "EXTERN_BLOCK", "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 { assert!(paths::is_path_start(p)); let m = p.start(); paths::expr_path(p); - m.complete(p, PATH_EXPR) + if p.at(L_CURLY) { + struct_lit(p); + m.complete(p, STRUCT_LIT) + } else { + m.complete(p, PATH_EXPR) + } +} + +// test struct_lit +// fn foo() { +// S {}; +// S { x, y: 32, }; +// S { x, y: 32, ..Default::default() }; +// } +fn struct_lit(p: &mut Parser) { + assert!(p.at(L_CURLY)); + p.bump(); + while !p.at(EOF) && !p.at(R_CURLY) { + match p.current() { + IDENT => { + let m = p.start(); + name_ref(p); + if p.eat(COLON) { + expr(p); + } + m.complete(p, STRUCT_LIT_FIELD); + }, + DOTDOT => { + p.bump(); + expr(p); + }, + _ => p.err_and_bump("expected identifier"), + } + if !p.at(R_CURLY) { + p.expect(COMMA); + } + } + p.expect(R_CURLY); } 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 { METHOD_CALL_EXPR, FIELD_EXPR, REF_EXPR, + STRUCT_LIT, + STRUCT_LIT_FIELD, EXTERN_BLOCK, ENUM_VARIANT, NAMED_FIELD, @@ -277,6 +279,8 @@ impl SyntaxKind { METHOD_CALL_EXPR => &SyntaxInfo { name: "METHOD_CALL_EXPR" }, FIELD_EXPR => &SyntaxInfo { name: "FIELD_EXPR" }, REF_EXPR => &SyntaxInfo { name: "REF_EXPR" }, + STRUCT_LIT => &SyntaxInfo { name: "STRUCT_LIT" }, + STRUCT_LIT_FIELD => &SyntaxInfo { name: "STRUCT_LIT_FIELD" }, EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" }, ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" }, NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" }, -- cgit v1.2.3