Struct cstree::GreenNodeBuilder [−][src]
A builder for green trees.
Construct with new
or with_cache
. To
add tree nodes, start them with start_node
, add
token
s and then finish_node
. When
the whole tree is constructed, call finish
to obtain the root.
Examples
let mut builder = GreenNodeBuilder::new(); builder.start_node(ROOT); builder.token(INT, "42"); builder.finish_node(); let (tree, interner) = builder.finish(); assert_eq!(tree.kind(), ROOT); let int = tree.children().next().unwrap(); assert_eq!(int.kind(), INT); let resolver = interner.unwrap().into_resolver(); assert_eq!(int.as_token().unwrap().text(&resolver), "42");
Implementations
impl GreenNodeBuilder<'static, 'static>
[src]
impl<'cache, 'interner, I> GreenNodeBuilder<'cache, 'interner, I> where
I: Interner,
[src]
I: Interner,
pub fn with_cache(cache: &'cache mut NodeCache<'interner, I>) -> Self
[src]
Reusing a NodeCache
between multiple builders saves memory, as it allows to structurally
share underlying trees.
pub fn token(&mut self, kind: SyntaxKind, text: &str)
[src]
Add new token to the current branch.
pub fn start_node(&mut self, kind: SyntaxKind)
[src]
Start new node of the given kind
and make it current.
pub fn finish_node(&mut self)
[src]
Finish the current branch and restore the previous branch as current.
pub fn checkpoint(&self) -> Checkpoint
[src]
Prepare for maybe wrapping the next node with a surrounding node.
The way wrapping works is that you first get a checkpoint, then you add nodes and tokens as
normal, and then you maybe call start_node_at
.
Examples
let checkpoint = builder.checkpoint(); parser.parse_expr(); if parser.peek() == Some(PLUS) { // 1 + 2 = Add(1, 2) builder.start_node_at(checkpoint, OPERATION); parser.parse_expr(); builder.finish_node(); }
pub fn start_node_at(&mut self, checkpoint: Checkpoint, kind: SyntaxKind)
[src]
Wrap the previous branch marked by checkpoint
in a new
branch and make it current.
pub fn finish(self) -> (GreenNode, Option<I>)
[src]
Complete building the tree.
Make sure that calls to start_node
/
start_node_at
and
finish_node
are balanced, i.e. that every started node has
been completed!
If this builder was constructed with new
, this method returns the
interner used to deduplicate source text (strings) as its second return value to allow
resolving tree tokens back to text and re-using the interner to build additonal trees.
Trait Implementations
impl<'cache, 'interner, I: Debug> Debug for GreenNodeBuilder<'cache, 'interner, I>
[src]
impl Default for GreenNodeBuilder<'static, 'static>
[src]
Auto Trait Implementations
impl<'cache, 'interner, I> RefUnwindSafe for GreenNodeBuilder<'cache, 'interner, I> where
I: RefUnwindSafe,
I: RefUnwindSafe,
impl<'cache, 'interner, I> Send for GreenNodeBuilder<'cache, 'interner, I> where
I: Send,
I: Send,
impl<'cache, 'interner, I> Sync for GreenNodeBuilder<'cache, 'interner, I> where
I: Sync,
I: Sync,
impl<'cache, 'interner, I> Unpin for GreenNodeBuilder<'cache, 'interner, I> where
I: Unpin,
'interner: 'cache,
I: Unpin,
'interner: 'cache,
impl<'cache, 'interner, I = TokenInterner> !UnwindSafe for GreenNodeBuilder<'cache, 'interner, I>
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,