pub enum Doc {
Text(Cow<'static, str>, usize),
SourceCodeSlice(Cow<'static, str>, usize),
Line(LineKind),
Concat(Vec<Doc>),
BestFitting(Vec<Doc>),
Group {
content: Box<Doc>,
expand: bool,
must_break: bool,
},
IfBreak {
broken: Box<Doc>,
flat: Box<Doc>,
},
Indent(Box<Doc>),
LineSuffix(Box<Doc>),
BreakParent,
}Expand description
The pretty-printer intermediate representation.
Construct values through the builder functions rather than the variants directly; the shape is public only so tests and future SQL rules can pattern-match if needed.
Variants§
Text(Cow<'static, str>, usize)
Verbatim text. Must not contain newlines — use the line builders for those so width
tracking and indentation stay correct. The display width is folded in at construction time
(via text) so the fit/break measurement never re-scans the string.
SourceCodeSlice(Cow<'static, str>, usize)
A verbatim slice of source that may contain newlines, reproduced byte-for-byte (modulo the
printer’s per-line right trim in the final output pass). This is the vehicle for verbatim fallback
regions without smuggling embedded \ns through Doc::Text, which would corrupt column
tracking. Each contained newline re-bases the column to the current indentation.
The cached width is the display width of the slice’s last line. Build through
source_code_slice, which folds the width in.
Line(LineKind)
A line break whose rendering depends on the enclosing group’s mode (see LineKind).
Concat(Vec<Doc>)
A sequence of documents laid out one after another.
BestFitting(Vec<Doc>)
Try candidate layouts in order and print the first one that fits on the current line; if no candidate fits, print the last one. This is the small Doc-IR escape hatch used by Prettier / Biome for constructs with genuinely different layouts rather than just flat-vs-break lines.
Group
A layout-choice boundary. Printed flat if it fits, otherwise broken. When expand is set
the group always breaks (Prettier’s shouldBreak) — used for “explode this collection”
decisions like a magic trailing comma. Unlike a hard line, expand does not propagate
to enclosing groups, so an inner collection can explode while its parent stays flat.
must_break is expand || has_forced_break(content), computed once when the group is built
(see group). Because groups are constructed bottom-up, each group carries its own
answer and ancestors read it in O(1) instead of re-walking the whole subtree on every
fit/break decision.
IfBreak
Picks one of two layouts by the enclosing group’s mode: broken when that group breaks,
flat when it stays flat (Prettier’s ifBreak). Built through [if_group_breaks].
The broken arm is not consulted when detecting forced breaks, so an if_group_breaks whose broken
arm contains a hard line does not force its own group to break.
Indent(Box<Doc>)
Increases the indentation level applied to line breaks inside it.
LineSuffix(Box<Doc>)
Content deferred to just before the next newline (or the document’s end). The vehicle for trailing line comments, which must not have code emitted after them on the same line.
BreakParent
A zero-width marker that forces every enclosing group to break, without itself emitting a
newline. Pairs with line suffixes so a trailing -- comment actually ends its line.
Trait Implementations§
impl Eq for Doc
impl StructuralPartialEq for Doc
Auto Trait Implementations§
impl Freeze for Doc
impl RefUnwindSafe for Doc
impl Send for Doc
impl Sync for Doc
impl Unpin for Doc
impl UnsafeUnpin for Doc
impl UnwindSafe for Doc
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more