about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-10-16T23·13+0300
committerclbot <clbot@tvl.fyi>2022-10-16T23·35+0000
commit8e9bfc1ca7e1b95419949439f85097e7eb5f840d (patch)
treeeb32feb1206a518c83c50bf3bdba0de86f4da102
parent5ee2258692da4d5c65b22416fcc3ec87db013ff8 (diff)
fix(tvix/eval): more faithfully serialise ast::Literal r/5149
The previous serialisation format kind of lost the information about
what AST node we're dealing with (e.g. `1234` would serialise to an
AST with a literal `1234`).

That's great for pretty-printing the _code_, but we explicitly want to
serialise how rnix-parser parses something.

To that end, literals are now instead serialised into a structure like
all the other ones (`kind: literal` and appropriate value fields).

Change-Id: I586c95d7db41820b8ec43565ba4016ed3834d1b5
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7030
Autosubmit: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
Reviewed-by: j4m3s <james.landrein@gmail.com>
Reviewed-by: Adam Joseph <adam@westernsemico.com>
-rw-r--r--tvix/eval/src/pretty_ast.rs19
1 files changed, 9 insertions, 10 deletions
diff --git a/tvix/eval/src/pretty_ast.rs b/tvix/eval/src/pretty_ast.rs
index e8e3b214c497..a829be26d814 100644
--- a/tvix/eval/src/pretty_ast.rs
+++ b/tvix/eval/src/pretty_ast.rs
@@ -135,17 +135,16 @@ impl<'a> Serialize for SerializeAST<&'a ast::Path> {
 
 impl<'a> Serialize for SerializeAST<&'a ast::Literal> {
     fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
+        let mut map = serializer.serialize_map(Some(2))?;
+        map.serialize_entry("kind", "literal")?;
+
         match self.0.kind() {
-            ast::LiteralKind::Float(val) => serializer.serialize_f64(val.value().unwrap()),
-            ast::LiteralKind::Integer(val) => serializer.serialize_i64(val.value().unwrap()),
-            ast::LiteralKind::Uri(val) => {
-                let url = val.syntax().text();
-                let mut map = serializer.serialize_map(Some(2))?;
-                map.serialize_entry("kind", "url")?;
-                map.serialize_entry("url", url)?;
-                map.end()
-            }
-        }
+            ast::LiteralKind::Float(val) => map.serialize_entry("float", &val.value().unwrap()),
+            ast::LiteralKind::Integer(val) => map.serialize_entry("int", &val.value().unwrap()),
+            ast::LiteralKind::Uri(val) => map.serialize_entry("uri", val.syntax().text()),
+        }?;
+
+        map.end()
     }
 }