From 38157b0e0cbab22dc3f5fa5cc66d9b673a18a55b Mon Sep 17 00:00:00 2001 From: Laurenz Date: Mon, 12 Oct 2020 17:10:01 +0200 Subject: =?UTF-8?q?Synchronous=20layout=20=F0=9F=AA=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/diag.rs | 10 +++++----- src/layout/document.rs | 8 ++++---- src/layout/fixed.rs | 5 ++--- src/layout/mod.rs | 19 +++---------------- src/layout/node.rs | 9 ++++----- src/layout/pad.rs | 5 ++--- src/layout/par.rs | 5 ++--- src/layout/spacing.rs | 3 +-- src/layout/stack.rs | 5 ++--- src/layout/text.rs | 3 +-- src/lib.rs | 4 ++-- src/syntax/span.rs | 8 ++++---- 12 files changed, 32 insertions(+), 52 deletions(-) (limited to 'src') diff --git a/src/diag.rs b/src/diag.rs index 431ad450..74bf894f 100644 --- a/src/diag.rs +++ b/src/diag.rs @@ -68,7 +68,7 @@ impl Feedback { /// A diagnostic that arose in parsing or layouting. #[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd)] -#[cfg_attr(feature = "serialize", derive(serde::Serialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] pub struct Diag { /// How severe / important the diagnostic is. pub level: Level, @@ -78,8 +78,8 @@ pub struct Diag { /// How severe / important a diagnostic is. #[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)] -#[cfg_attr(feature = "serialize", derive(serde::Serialize))] -#[cfg_attr(feature = "serialize", serde(rename_all = "camelCase"))] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] +#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub enum Level { Warning, Error, @@ -103,8 +103,8 @@ impl Display for Level { /// Decorations for semantic syntax highlighting. #[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)] -#[cfg_attr(feature = "serialize", derive(serde::Serialize))] -#[cfg_attr(feature = "serialize", serde(rename_all = "camelCase"))] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] +#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub enum Deco { /// Emphasized text. Emph, diff --git a/src/layout/document.rs b/src/layout/document.rs index a91dbbe9..b233ffd8 100644 --- a/src/layout/document.rs +++ b/src/layout/document.rs @@ -9,10 +9,10 @@ pub struct Document { impl Document { /// Layout the document. - pub async fn layout(&self, ctx: &mut LayoutContext) -> Vec { + pub fn layout(&self, ctx: &mut LayoutContext) -> Vec { let mut layouts = vec![]; for run in &self.runs { - layouts.extend(run.layout(ctx).await); + layouts.extend(run.layout(ctx)); } layouts } @@ -31,9 +31,9 @@ pub struct Pages { impl Pages { /// Layout the page run. - pub async fn layout(&self, ctx: &mut LayoutContext) -> Vec { + pub fn layout(&self, ctx: &mut LayoutContext) -> Vec { let areas = Areas::repeat(self.size); - let layouted = self.child.layout(ctx, &areas).await; + let layouted = self.child.layout(ctx, &areas); layouted.into_iter().filter_map(Layouted::into_boxed).collect() } } diff --git a/src/layout/fixed.rs b/src/layout/fixed.rs index 78a512e6..df099731 100644 --- a/src/layout/fixed.rs +++ b/src/layout/fixed.rs @@ -12,9 +12,8 @@ pub struct Fixed { pub child: LayoutNode, } -#[async_trait(?Send)] impl Layout for Fixed { - async fn layout(&self, ctx: &mut LayoutContext, areas: &Areas) -> Vec { + fn layout(&self, ctx: &mut LayoutContext, areas: &Areas) -> Vec { let Area { rem, full } = areas.current; let size = Size::new( self.width.map(|w| w.eval(full.width)).unwrap_or(rem.width), @@ -22,7 +21,7 @@ impl Layout for Fixed { ); let areas = Areas::once(size); - self.child.layout(ctx, &areas).await + self.child.layout(ctx, &areas) } } diff --git a/src/layout/mod.rs b/src/layout/mod.rs index a6ef4300..643f1a43 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -9,8 +9,6 @@ mod spacing; mod stack; mod text; -use async_trait::async_trait; - use crate::font::SharedFontLoader; use crate::geom::*; use crate::shaping::Shaped; @@ -25,9 +23,9 @@ pub use stack::*; pub use text::*; /// Layout a document and return the produced layouts. -pub async fn layout(document: &Document, loader: SharedFontLoader) -> Vec { +pub fn layout(document: &Document, loader: SharedFontLoader) -> Vec { let mut ctx = LayoutContext { loader }; - document.layout(&mut ctx).await + document.layout(&mut ctx) } /// The context for layouting. @@ -38,20 +36,9 @@ pub struct LayoutContext { } /// Layout a node. -#[async_trait(?Send)] pub trait Layout { /// Layout the node in the given layout context. - /// - /// This signature looks pretty horrible due to async in trait methods, but - /// it's actually just the following: - /// ```rust,ignore - /// async fn layout( - /// &self, - /// ctx: &mut LayoutContext, - /// constraints: LayoutConstraints, - /// ) -> Vec; - /// ``` - async fn layout(&self, ctx: &mut LayoutContext, areas: &Areas) -> Vec; + fn layout(&self, ctx: &mut LayoutContext, areas: &Areas) -> Vec; } /// A sequence of areas to layout into. diff --git a/src/layout/node.rs b/src/layout/node.rs index 31213b9d..4cba3d4f 100644 --- a/src/layout/node.rs +++ b/src/layout/node.rs @@ -24,13 +24,12 @@ impl LayoutNode { } } -#[async_trait(?Send)] impl Layout for LayoutNode { - async fn layout(&self, ctx: &mut LayoutContext, areas: &Areas) -> Vec { + fn layout(&self, ctx: &mut LayoutContext, areas: &Areas) -> Vec { match self { - Self::Spacing(spacing) => spacing.layout(ctx, areas).await, - Self::Text(text) => text.layout(ctx, areas).await, - Self::Dyn(boxed) => boxed.layout(ctx, areas).await, + Self::Spacing(spacing) => spacing.layout(ctx, areas), + Self::Text(text) => text.layout(ctx, areas), + Self::Dyn(boxed) => boxed.layout(ctx, areas), } } } diff --git a/src/layout/pad.rs b/src/layout/pad.rs index 2574fa16..2994dd59 100644 --- a/src/layout/pad.rs +++ b/src/layout/pad.rs @@ -10,9 +10,8 @@ pub struct Pad { pub child: LayoutNode, } -#[async_trait(?Send)] impl Layout for Pad { - async fn layout(&self, ctx: &mut LayoutContext, areas: &Areas) -> Vec { + fn layout(&self, ctx: &mut LayoutContext, areas: &Areas) -> Vec { let shrink = |size| size - self.padding.eval(size).size(); let areas = Areas { current: Area { @@ -23,7 +22,7 @@ impl Layout for Pad { last: areas.last.map(shrink), }; - let mut layouted = self.child.layout(ctx, &areas).await; + let mut layouted = self.child.layout(ctx, &areas); for item in &mut layouted { if let Layouted::Boxed(boxed, _) = item { diff --git a/src/layout/par.rs b/src/layout/par.rs index 729c077f..e77bb4e7 100644 --- a/src/layout/par.rs +++ b/src/layout/par.rs @@ -18,12 +18,11 @@ pub struct Par { pub children: Vec, } -#[async_trait(?Send)] impl Layout for Par { - async fn layout(&self, ctx: &mut LayoutContext, areas: &Areas) -> Vec { + fn layout(&self, ctx: &mut LayoutContext, areas: &Areas) -> Vec { let mut layouter = ParLayouter::new(self, areas.clone()); for child in &self.children { - for layouted in child.layout(ctx, &layouter.areas).await { + for layouted in child.layout(ctx, &layouter.areas) { match layouted { Layouted::Spacing(spacing) => layouter.spacing(spacing), Layouted::Boxed(boxed, aligns) => layouter.boxed(boxed, aligns.cross), diff --git a/src/layout/spacing.rs b/src/layout/spacing.rs index 427cb7b0..f64c7968 100644 --- a/src/layout/spacing.rs +++ b/src/layout/spacing.rs @@ -14,9 +14,8 @@ pub struct Spacing { pub softness: Softness, } -#[async_trait(?Send)] impl Layout for Spacing { - async fn layout(&self, _: &mut LayoutContext, _: &Areas) -> Vec { + fn layout(&self, _: &mut LayoutContext, _: &Areas) -> Vec { vec![Layouted::Spacing(self.amount)] } } diff --git a/src/layout/stack.rs b/src/layout/stack.rs index 2f3ceed8..9aeb80aa 100644 --- a/src/layout/stack.rs +++ b/src/layout/stack.rs @@ -16,12 +16,11 @@ pub struct Stack { pub children: Vec, } -#[async_trait(?Send)] impl Layout for Stack { - async fn layout(&self, ctx: &mut LayoutContext, areas: &Areas) -> Vec { + fn layout(&self, ctx: &mut LayoutContext, areas: &Areas) -> Vec { let mut layouter = StackLayouter::new(self, areas.clone()); for child in &self.children { - for layouted in child.layout(ctx, &layouter.areas).await { + for layouted in child.layout(ctx, &layouter.areas) { match layouted { Layouted::Spacing(spacing) => layouter.spacing(spacing), Layouted::Boxed(boxed, aligns) => layouter.boxed(boxed, aligns), diff --git a/src/layout/text.rs b/src/layout/text.rs index a4156fd3..5e047069 100644 --- a/src/layout/text.rs +++ b/src/layout/text.rs @@ -23,9 +23,8 @@ pub struct Text { pub aligns: Gen, } -#[async_trait(?Send)] impl Layout for Text { - async fn layout(&self, ctx: &mut LayoutContext, _: &Areas) -> Vec { + fn layout(&self, ctx: &mut LayoutContext, _: &Areas) -> Vec { let mut loader = ctx.loader.borrow_mut(); vec![Layouted::Boxed( shaping::shape( diff --git a/src/lib.rs b/src/lib.rs index 381270c9..6750d466 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -50,13 +50,13 @@ use crate::font::SharedFontLoader; use crate::layout::BoxLayout; /// Process _Typst_ source code directly into a collection of layouts. -pub async fn typeset( +pub fn typeset( src: &str, state: State, loader: SharedFontLoader, ) -> Pass> { let Pass { output: tree, feedback: f1 } = parse::parse(src); let Pass { output: document, feedback: f2 } = eval::eval(&tree, state); - let layouts = layout::layout(&document, loader).await; + let layouts = layout::layout(&document, loader); Pass::new(layouts, Feedback::join(f1, f2)) } diff --git a/src/syntax/span.rs b/src/syntax/span.rs index 5f51d157..0e9c15fe 100644 --- a/src/syntax/span.rs +++ b/src/syntax/span.rs @@ -41,7 +41,7 @@ impl Offset for SpanVec { /// A value with the span it corresponds to in the source code. #[derive(Default, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)] -#[cfg_attr(feature = "serialize", derive(serde::Serialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] pub struct Spanned { /// The spanned value. pub v: T, @@ -109,7 +109,7 @@ impl Debug for Spanned { /// Locates a slice of source code. #[derive(Copy, Clone, Ord, PartialOrd)] -#[cfg_attr(feature = "serialize", derive(serde::Serialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] pub struct Span { /// The inclusive start position. pub start: Pos, @@ -210,7 +210,7 @@ impl Debug for Span { /// A byte position in source code. #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd)] -#[cfg_attr(feature = "serialize", derive(serde::Serialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] pub struct Pos(pub u32); impl Pos { @@ -255,7 +255,7 @@ impl Debug for Pos { /// A one-indexed line-column position in source code. #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd)] -#[cfg_attr(feature = "serialize", derive(serde::Serialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] pub struct Location { /// The one-indexed line. pub line: u32, -- cgit v1.2.3