summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2020-01-18 15:58:36 +0100
committerLaurenz <laurmaedje@gmail.com>2020-01-18 15:58:36 +0100
commit277f2d2176f5e98305870f90b16af3feae1bb3d1 (patch)
treea267216f67ebed87cbf83f021bfb01e9b79feae4
parent70878885f5d169f2c5d9e66d3919ee56d5f9f9ca (diff)
ColorToken serialization + function fix 🚧
-rw-r--r--Cargo.toml1
-rw-r--r--src/syntax/mod.rs8
-rw-r--r--src/syntax/parsing.rs12
-rw-r--r--src/syntax/span.rs7
-rw-r--r--tests/layouter/test.typ1
-rw-r--r--tests/src/layouter.rs2
-rw-r--r--tests/src/render.py2
7 files changed, 21 insertions, 12 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 908503bf..101970af 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,6 +12,7 @@ byteorder = "1"
smallvec = "1"
unicode-xid = "0.2"
async-trait = "0.1"
+serde = { version = "1", features = ["derive"] }
futures-executor = { version = "0.3", optional = true }
[features]
diff --git a/src/syntax/mod.rs b/src/syntax/mod.rs
index e9725f04..f644f051 100644
--- a/src/syntax/mod.rs
+++ b/src/syntax/mod.rs
@@ -2,6 +2,7 @@
use std::fmt::{self, Display, Formatter};
use unicode_xid::UnicodeXID;
+use serde::Serialize;
use crate::func::LayoutFunc;
use crate::size::{Size, ScaleSize};
@@ -257,7 +258,7 @@ fn expect<E: ExpressionKind>(opt: ParseResult<Option<E>>) -> ParseResult<E> {
}
}
-#[derive(Debug, Clone, Eq, PartialEq)]
+#[derive(Debug, Clone, Eq, PartialEq, Serialize)]
pub struct Colorization {
pub tokens: Vec<Spanned<ColorToken>>,
}
@@ -277,7 +278,8 @@ impl Colorization {
}
/// Entities which can be colored by syntax highlighting.
-#[derive(Debug, Copy, Clone, Eq, PartialEq)]
+#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize)]
+#[serde(rename_all = "camelCase")]
pub enum ColorToken {
Comment,
Bracket,
@@ -299,7 +301,7 @@ pub enum ColorToken {
Invalid,
}
-#[derive(Debug, Clone, Eq, PartialEq)]
+#[derive(Debug, Clone, Eq, PartialEq, Serialize)]
pub struct ErrorMap {
pub errors: Vec<Spanned<String>>,
}
diff --git a/src/syntax/parsing.rs b/src/syntax/parsing.rs
index 71d6b251..f6d0b629 100644
--- a/src/syntax/parsing.rs
+++ b/src/syntax/parsing.rs
@@ -104,8 +104,11 @@ impl<'s> Parser<'s> {
let name = self.parse_func_name()?;
self.skip_whitespace();
- let args = match self.eat() {
- Some(Spanned { v: Colon, .. }) => self.parse_func_args(),
+ let args = match self.peek() {
+ Some(Spanned { v: Colon, .. }) => {
+ self.eat();
+ self.parse_func_args()
+ }
Some(Spanned { v: RightBracket, .. }) => FuncArgs::new(),
other => {
self.expected_at("colon or closing bracket", name.span.end);
@@ -119,8 +122,9 @@ impl<'s> Parser<'s> {
/// Parses the function name if is the next token. Otherwise, it adds an
/// error and returns `None`.
fn parse_func_name(&mut self) -> Option<Spanned<Ident>> {
- match self.eat() {
+ match self.peek() {
Some(Spanned { v: ExprIdent(ident), span }) => {
+ self.eat();
self.colorization.replace_last(ColorToken::FuncName);
return Some(Spanned { v: Ident(ident.to_string()), span });
}
@@ -280,7 +284,7 @@ impl<'s> Parser<'s> {
None
})?;
- Some(FuncCall(parser(header, body, self.ctx).unwrap()))
+ parser(header, body, self.ctx).ok().map(|f| FuncCall(f))
}
/// Skip all whitespace/comment tokens.
diff --git a/src/syntax/span.rs b/src/syntax/span.rs
index 546b3ad6..df9a3520 100644
--- a/src/syntax/span.rs
+++ b/src/syntax/span.rs
@@ -1,10 +1,11 @@
//! Spans map elements to the part of source code they originate from.
use std::fmt::{self, Debug, Display, Formatter};
+use serde::Serialize;
/// Annotates a value with the part of the source code it corresponds to.
-#[derive(Copy, Clone, Eq, PartialEq, Hash)]
+#[derive(Copy, Clone, Eq, PartialEq, Hash, Serialize)]
pub struct Spanned<T> {
pub v: T,
pub span: Span,
@@ -45,7 +46,7 @@ impl<T> Debug for Spanned<T> where T: std::fmt::Debug {
}
/// Describes a slice of source code.
-#[derive(Copy, Clone, Eq, PartialEq, Hash)]
+#[derive(Copy, Clone, Eq, PartialEq, Hash, Serialize)]
pub struct Span {
pub start: Position,
pub end: Position,
@@ -83,7 +84,7 @@ impl Display for Span {
debug_display!(Span);
/// A line-column position in source code.
-#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
+#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize)]
pub struct Position {
/// The 0-indexed line (inclusive).
pub line: usize,
diff --git a/tests/layouter/test.typ b/tests/layouter/test.typ
new file mode 100644
index 00000000..b7fd334d
--- /dev/null
+++ b/tests/layouter/test.typ
@@ -0,0 +1 @@
+[box][hi]
diff --git a/tests/src/layouter.rs b/tests/src/layouter.rs
index 6d38666b..fa0c631a 100644
--- a/tests/src/layouter.rs
+++ b/tests/src/layouter.rs
@@ -107,7 +107,7 @@ fn test(name: &str, src: &str) -> DynResult<()> {
// Render the layout into a PNG.
Command::new("python")
- .arg("tests/render.py")
+ .arg("tests/src/render.py")
.arg(name)
.spawn()
.expect("failed to run python renderer");
diff --git a/tests/src/render.py b/tests/src/render.py
index bb27e973..d445e49c 100644
--- a/tests/src/render.py
+++ b/tests/src/render.py
@@ -38,7 +38,7 @@ class MultiboxRenderer:
parts = lines[i + 1].split(' ', 2)
index = int(parts[0]), int(parts[1])
path = parts[2]
- self.fonts[index] = os.path.join(BASE, '../../fonts', path)
+ self.fonts[index] = os.path.join(BASE, '../../../fonts', path)
self.content = lines[font_count + 1:]