diff options
Diffstat (limited to 'dhall_core')
-rw-r--r-- | dhall_core/src/label.rs | 7 | ||||
-rw-r--r-- | dhall_core/src/parser.rs | 7 | ||||
-rw-r--r-- | dhall_core/src/printer.rs | 15 |
3 files changed, 21 insertions, 8 deletions
diff --git a/dhall_core/src/label.rs b/dhall_core/src/label.rs index 3633b93..8b371af 100644 --- a/dhall_core/src/label.rs +++ b/dhall_core/src/label.rs @@ -1,4 +1,3 @@ -use std::fmt::{self, Display}; use std::rc::Rc; // The type for labels throughout the AST @@ -25,12 +24,6 @@ impl From<Label> for String { } } -impl Display for Label { - fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - self.0.as_ref().fmt(f) - } -} - impl Label { pub fn from_str(s: &str) -> Label { Label(s.into()) diff --git a/dhall_core/src/parser.rs b/dhall_core/src/parser.rs index 165b393..8908c78 100644 --- a/dhall_core/src/parser.rs +++ b/dhall_core/src/parser.rs @@ -257,7 +257,12 @@ fn can_be_shortcutted(rule: Rule) -> bool { make_parser! { rule!(EOI<()>; raw_pair!(_) => ()); - rule!(label_raw<Label>; captured_str!(s) => Label::from(s.trim().to_owned())); + rule!(simple_label<Label>; captured_str!(s) => Label::from(s.trim().to_owned())); + rule!(quoted_label<Label>; captured_str!(s) => Label::from(s.trim().to_owned())); + rule!(label_raw<Label>; children!( + [simple_label(l)] => l, + [quoted_label(l)] => l, + )); rule!(double_quote_literal<ParsedText>; children!( [double_quote_chunk(chunks..)] => { diff --git a/dhall_core/src/printer.rs b/dhall_core/src/printer.rs index 7b108d5..508c1c8 100644 --- a/dhall_core/src/printer.rs +++ b/dhall_core/src/printer.rs @@ -285,6 +285,21 @@ impl Display for Const { } } +impl Display for Label { + fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { + let s = String::from(self.clone()); + let is_keyword = |s| match s { + "let" | "in" | "if" | "then" | "else" => true, + _ => false, + }; + if s.chars().all(|c| c.is_ascii_alphanumeric()) && !is_keyword(&s) { + write!(f, "{}", s) + } else { + write!(f, "`{}`", s) + } + } +} + impl Display for Import { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { use std::path::PathBuf; |