diff options
author | Nadrieril | 2020-02-20 19:04:13 +0000 |
---|---|---|
committer | Nadrieril | 2020-02-20 19:04:13 +0000 |
commit | 6642077368497583113d685d351ec93d230ffcad (patch) | |
tree | 51f42d5525bdcde81834a28b2b3742472cbac56a /dhall/src | |
parent | 0e07c9cd012efaeae7e1c50a3499a13aef4d2b61 (diff) |
Add support for dotted field syntax
Diffstat (limited to 'dhall/src')
-rw-r--r-- | dhall/src/syntax/ast/span.rs | 3 | ||||
-rw-r--r-- | dhall/src/syntax/text/parser.rs | 13 |
2 files changed, 14 insertions, 2 deletions
diff --git a/dhall/src/syntax/ast/span.rs b/dhall/src/syntax/ast/span.rs index 6d017f6..7c004c5 100644 --- a/dhall/src/syntax/ast/span.rs +++ b/dhall/src/syntax/ast/span.rs @@ -18,8 +18,9 @@ pub(crate) struct ParsedSpan { pub(crate) enum Span { /// A location in the source text Parsed(ParsedSpan), - /// Desugaring of duplicate fields + /// Desugarings DuplicateRecordFieldsSugar, + DottedFieldSugar, /// For expressions obtained from decoding binary Decoded, /// For expressions constructed during normalization/typecheck diff --git a/dhall/src/syntax/text/parser.rs b/dhall/src/syntax/text/parser.rs index f74794b..ba64a75 100644 --- a/dhall/src/syntax/text/parser.rs +++ b/dhall/src/syntax/text/parser.rs @@ -915,7 +915,18 @@ impl DhallParser { fn record_literal_entry(input: ParseInput) -> ParseResult<(Label, Expr)> { Ok(match_nodes!(input.into_children(); - [label(name), expression(expr)] => (name, expr) + [label(name), expression(expr)] => (name, expr), + [label(first_name), label(names).., expression(expr)] => { + // Desugar dotted field syntax into nested records + let expr = names.rev().fold(expr, |e, l| { + let map = Some((l, e)).into_iter().collect(); + Expr::new( + RecordLit(map), + Span::DottedFieldSugar, + ) + }); + (first_name, expr) + }, )) } |