summaryrefslogtreecommitdiff
path: root/dhall_core
diff options
context:
space:
mode:
authorNadrieril2019-03-22 18:12:13 +0100
committerNadrieril2019-03-22 18:12:13 +0100
commit8110651ccf498bcf3f0cd55f3b1730d9972cf254 (patch)
tree2e0b08153582b23bce178f4ca3b945b01ddd6306 /dhall_core
parent9a8a14ba3863b3bc5e79cd8070d6779451ff8466 (diff)
Handle quoted labels
Diffstat (limited to 'dhall_core')
-rw-r--r--dhall_core/src/label.rs7
-rw-r--r--dhall_core/src/parser.rs7
-rw-r--r--dhall_core/src/printer.rs15
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;