pub struct SyntaxNode<'a> { /* private fields */ }Expand description
SyntaxNode. Untyped view of the syntax tree. Adds parent() and offset() capabilities.
This is a public wrapper around a private tracked struct. Construction only happens through
tracked functions to ensure uniqueness of SyntaxNodes.
Use SyntaxNode::new_root or SyntaxNode::new_root_with_offset to create root nodes.
Implementations§
Source§impl<'db> SyntaxNode<'db>
impl<'db> SyntaxNode<'db>
Sourcepub fn offset(self, db: &'db dyn Database) -> TextOffset
pub fn offset(self, db: &'db dyn Database) -> TextOffset
Get the offset of this syntax node from the beginning of the file.
Sourcepub fn parent(self, db: &'db dyn Database) -> Option<SyntaxNode<'db>>
pub fn parent(self, db: &'db dyn Database) -> Option<SyntaxNode<'db>>
Get the parent syntax node, if any.
Sourcepub fn grandparent(self, db: &'db dyn Database) -> Option<SyntaxNode<'db>>
pub fn grandparent(self, db: &'db dyn Database) -> Option<SyntaxNode<'db>>
Get the grandparent syntax node, if any. This uses a cached parent when available, avoiding some database lookups.
Sourcepub fn stable_ptr(self, _db: &'db dyn Database) -> SyntaxStablePtrId<'db>
pub fn stable_ptr(self, _db: &'db dyn Database) -> SyntaxStablePtrId<'db>
Get the stable pointer for this syntax node.
pub fn raw_id(&self, db: &'db dyn Database) -> &'db SyntaxNodeId<'db>
Sourcepub fn key_fields(self, db: &'db dyn Database) -> &'db [GreenId<'db>]
pub fn key_fields(self, db: &'db dyn Database) -> &'db [GreenId<'db>]
Get the key fields of this syntax node. These define the unique identifier of the node.
Sourcepub fn file_id(&self, db: &'db dyn Database) -> FileId<'db>
pub fn file_id(&self, db: &'db dyn Database) -> FileId<'db>
Returns the file id of the file containing this node.
Sourcepub fn nth_parent<'r: 'db>(
&self,
db: &'r dyn Database,
n: usize,
) -> SyntaxNode<'db>
pub fn nth_parent<'r: 'db>( &self, db: &'r dyn Database, n: usize, ) -> SyntaxNode<'db>
Returns the stable pointer of the nth parent of this stable pointer.
n = 0: returns itself.
n = 1: return the parent.
n = 2: return the grand parent.
And so on…
Assumes that the nth parent exists. Panics otherwise.
Source§impl<'a> SyntaxNode<'a>
impl<'a> SyntaxNode<'a>
Sourcepub fn new_root(
db: &'a dyn Database,
file_id: FileId<'a>,
green: GreenId<'a>,
) -> Self
pub fn new_root( db: &'a dyn Database, file_id: FileId<'a>, green: GreenId<'a>, ) -> Self
Create a new root syntax node.
Sourcepub fn new_root_with_offset(
db: &'a dyn Database,
file_id: FileId<'a>,
green: GreenId<'a>,
initial_offset: Option<TextOffset>,
) -> Self
pub fn new_root_with_offset( db: &'a dyn Database, file_id: FileId<'a>, green: GreenId<'a>, initial_offset: Option<TextOffset>, ) -> Self
Create a new root syntax node with a custom initial offset.
Sourcepub fn kind(&self, _db: &dyn Database) -> SyntaxKind
pub fn kind(&self, _db: &dyn Database) -> SyntaxKind
Get the syntax kind of this node.
Sourcepub fn text(&self, db: &'a dyn Database) -> Option<SmolStrId<'a>>
pub fn text(&self, db: &'a dyn Database) -> Option<SmolStrId<'a>>
Returns the text of the token if this node is a token.
Sourcepub fn green_node(&self, db: &'a dyn Database) -> &'a GreenNode<'a>
pub fn green_node(&self, db: &'a dyn Database) -> &'a GreenNode<'a>
Returns the green node of the syntax node.
Sourcepub fn span_without_trivia(&self, db: &dyn Database) -> TextSpan
pub fn span_without_trivia(&self, db: &dyn Database) -> TextSpan
Returns the span of the syntax node without trivia.
Sourcepub fn get_terminal_token(
&'a self,
db: &'a dyn Database,
) -> Option<SyntaxNode<'a>>
pub fn get_terminal_token( &'a self, db: &'a dyn Database, ) -> Option<SyntaxNode<'a>>
Gets the inner token from a terminal SyntaxNode. If the given node is not a terminal, returns None.
Sourcepub fn get_children(&self, db: &'a dyn Database) -> &'a [SyntaxNode<'a>]
pub fn get_children(&self, db: &'a dyn Database) -> &'a [SyntaxNode<'a>]
Gets the children syntax nodes of the current node.
Sourcepub fn span_start_without_trivia(&self, db: &dyn Database) -> TextOffset
pub fn span_start_without_trivia(&self, db: &dyn Database) -> TextOffset
Returns the start of the span of the syntax node without trivia.
Sourcepub fn span_end_without_trivia(&self, db: &dyn Database) -> TextOffset
pub fn span_end_without_trivia(&self, db: &dyn Database) -> TextOffset
Returns the end of the span of the syntax node without trivia.
Sourcepub fn lookup_offset(
&self,
db: &'a dyn Database,
offset: TextOffset,
) -> SyntaxNode<'a>
pub fn lookup_offset( &self, db: &'a dyn Database, offset: TextOffset, ) -> SyntaxNode<'a>
Lookups a syntax node using an offset.
Sourcepub fn lookup_position(
&self,
db: &'a dyn Database,
position: TextPosition,
) -> SyntaxNode<'a>
pub fn lookup_position( &self, db: &'a dyn Database, position: TextPosition, ) -> SyntaxNode<'a>
Lookups a syntax node using a position.
Sourcepub fn get_text(&self, db: &'a dyn Database) -> &'a str
pub fn get_text(&self, db: &'a dyn Database) -> &'a str
Returns all the text under the syntax node.
Sourcepub fn get_text_without_inner_commentable_children(
&self,
db: &dyn Database,
) -> String
pub fn get_text_without_inner_commentable_children( &self, db: &dyn Database, ) -> String
Returns all the text under the syntax node. It traverses all the syntax tree of the node, but ignores functions and modules. We ignore those, because if there’s some inner functions or modules, we don’t want to get raw text of them. Comments inside them refer themselves directly, not this SyntaxNode.
Sourcepub fn get_text_without_all_comment_trivia(&self, db: &dyn Database) -> String
pub fn get_text_without_all_comment_trivia(&self, db: &dyn Database) -> String
Returns all the text of the item without comments trivia. It traverses all the syntax tree of the node.
Sourcepub fn get_text_without_trivia(self, db: &'a dyn Database) -> SmolStrId<'a>
pub fn get_text_without_trivia(self, db: &'a dyn Database) -> SmolStrId<'a>
Returns all the text under the syntax node, without the outmost trivia (the leading trivia of the first token and the trailing trivia of the last token).
Note that this traverses the syntax tree, and generates a new string, so use responsibly.
Sourcepub fn get_text_of_span(self, db: &'a dyn Database, span: TextSpan) -> &'a str
pub fn get_text_of_span(self, db: &'a dyn Database, span: TextSpan) -> &'a str
Returns the text under the syntax node, according to the given span.
span is assumed to be contained within the span of self.
Note that this traverses the syntax tree, and generates a new string, so use responsibly.
Sourcepub fn descendants(
&self,
db: &'a dyn Database,
) -> impl Iterator<Item = SyntaxNode<'a>> + 'a
pub fn descendants( &self, db: &'a dyn Database, ) -> impl Iterator<Item = SyntaxNode<'a>> + 'a
Traverse the subtree rooted at the current node (including the current node) in preorder.
This is a shortcut for Self::preorder paired with filtering for WalkEvent::Enter
events only.
Sourcepub fn preorder(&self, db: &'a dyn Database) -> Preorder<'a> ⓘ
pub fn preorder(&self, db: &'a dyn Database) -> Preorder<'a> ⓘ
Traverse the subtree rooted at the current node (including the current node) in preorder, excluding tokens.
Sourcepub fn tokens(&self, db: &'a dyn Database) -> impl Iterator<Item = Self> + 'a
pub fn tokens(&self, db: &'a dyn Database) -> impl Iterator<Item = Self> + 'a
Gets all the leaves of the SyntaxTree, where the self node is the root of a tree.
Sourcepub fn cast<T: TypedSyntaxNode<'a>>(self, db: &'a dyn Database) -> Option<T>
pub fn cast<T: TypedSyntaxNode<'a>>(self, db: &'a dyn Database) -> Option<T>
Mirror of TypedSyntaxNode::cast.
Sourcepub fn ancestors(
&self,
db: &'a dyn Database,
) -> impl Iterator<Item = SyntaxNode<'a>> + 'a
pub fn ancestors( &self, db: &'a dyn Database, ) -> impl Iterator<Item = SyntaxNode<'a>> + 'a
Creates an iterator that yields ancestors of this syntax node.
Sourcepub fn ancestors_with_self(
&self,
db: &'a dyn Database,
) -> impl Iterator<Item = SyntaxNode<'a>> + 'a
pub fn ancestors_with_self( &self, db: &'a dyn Database, ) -> impl Iterator<Item = SyntaxNode<'a>> + 'a
Creates an iterator that yields this syntax node and walks up its ancestors.
Sourcepub fn is_ancestor(&self, db: &dyn Database, node: &SyntaxNode<'_>) -> bool
pub fn is_ancestor(&self, db: &dyn Database, node: &SyntaxNode<'_>) -> bool
Checks whether this syntax node is strictly above the given syntax node in the syntax tree.
Sourcepub fn is_descendant(&self, db: &dyn Database, node: &SyntaxNode<'_>) -> bool
pub fn is_descendant(&self, db: &dyn Database, node: &SyntaxNode<'_>) -> bool
Checks whether this syntax node is strictly under the given syntax node in the syntax tree.
Sourcepub fn is_ancestor_or_self(
&self,
db: &dyn Database,
node: &SyntaxNode<'_>,
) -> bool
pub fn is_ancestor_or_self( &self, db: &dyn Database, node: &SyntaxNode<'_>, ) -> bool
Checks whether this syntax node is or is above the given syntax node in the syntax tree.
Sourcepub fn is_descendant_or_self(
&self,
db: &dyn Database,
node: &SyntaxNode<'_>,
) -> bool
pub fn is_descendant_or_self( &self, db: &dyn Database, node: &SyntaxNode<'_>, ) -> bool
Checks whether this syntax node is or is under the given syntax node in the syntax tree.
Sourcepub fn ancestor_of_kind(
&self,
db: &'a dyn Database,
kind: SyntaxKind,
) -> Option<SyntaxNode<'a>>
pub fn ancestor_of_kind( &self, db: &'a dyn Database, kind: SyntaxKind, ) -> Option<SyntaxNode<'a>>
Finds the first ancestor of a given kind.
Sourcepub fn ancestor_of_type<T: TypedSyntaxNode<'a>>(
&self,
db: &'a dyn Database,
) -> Option<T>
pub fn ancestor_of_type<T: TypedSyntaxNode<'a>>( &self, db: &'a dyn Database, ) -> Option<T>
Finds the first ancestor of a given kind and returns it in typed form.
Sourcepub fn parent_of_kind(
&self,
db: &'a dyn Database,
kind: SyntaxKind,
) -> Option<SyntaxNode<'a>>
pub fn parent_of_kind( &self, db: &'a dyn Database, kind: SyntaxKind, ) -> Option<SyntaxNode<'a>>
Finds the parent of a given kind.
Sourcepub fn parent_of_type<T: TypedSyntaxNode<'a>>(
&self,
db: &'a dyn Database,
) -> Option<T>
pub fn parent_of_type<T: TypedSyntaxNode<'a>>( &self, db: &'a dyn Database, ) -> Option<T>
Finds the parent of a given kind and returns it in typed form.
Sourcepub fn ancestor_of_kinds(
&self,
db: &'a dyn Database,
kinds: &[SyntaxKind],
) -> Option<SyntaxNode<'a>>
pub fn ancestor_of_kinds( &self, db: &'a dyn Database, kinds: &[SyntaxKind], ) -> Option<SyntaxNode<'a>>
Finds the first parent of one of the kinds.
Sourcepub fn parent_kind(&self, _db: &dyn Database) -> Option<SyntaxKind>
pub fn parent_kind(&self, _db: &dyn Database) -> Option<SyntaxKind>
Gets the kind of the given node’s parent if it exists.
Sourcepub fn grandparent_kind(&self, db: &dyn Database) -> Option<SyntaxKind>
pub fn grandparent_kind(&self, db: &dyn Database) -> Option<SyntaxKind>
Gets the kind of the given node’s grandparent if it exists.
Sourcepub fn grandgrandparent_kind(&self, db: &dyn Database) -> Option<SyntaxKind>
pub fn grandgrandparent_kind(&self, db: &dyn Database) -> Option<SyntaxKind>
Gets the kind of the given node’s grandgrandparent if it exists.
Trait Implementations§
Source§impl<'a> Clone for SyntaxNode<'a>
impl<'a> Clone for SyntaxNode<'a>
Source§fn clone(&self) -> SyntaxNode<'a>
fn clone(&self) -> SyntaxNode<'a>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<'db> Debug for SyntaxNode<'db>
impl<'db> Debug for SyntaxNode<'db>
Source§impl<'db> DebugWithDb<'db> for SyntaxNode<'db>
impl<'db> DebugWithDb<'db> for SyntaxNode<'db>
type Db = dyn Database
fn fmt(&self, f: &mut Formatter<'_>, db: &'db Self::Db) -> Result
fn debug<'me>(&'me self, db: &'db Self::Db) -> DebugWith<'me, 'db, Self::Db>where
Self: Sized + 'me,
fn into_debug<'me>(self, db: &'db Self::Db) -> DebugWith<'me, 'db, Self::Db>where
Self: Sized + 'me,
Source§impl<'a> Hash for SyntaxNode<'a>
impl<'a> Hash for SyntaxNode<'a>
Source§impl<'a> PartialEq for SyntaxNode<'a>
impl<'a> PartialEq for SyntaxNode<'a>
Source§impl<'a> QueryAttrs<'a> for SyntaxNode<'a>
Allows querying attributes of a syntax node, any typed node which QueryAttrs is implemented for
should be added here.
impl<'a> QueryAttrs<'a> for SyntaxNode<'a>
Allows querying attributes of a syntax node, any typed node which QueryAttrs is implemented for should be added here.
Source§fn attributes_elements(
&self,
db: &'a dyn Database,
) -> impl Iterator<Item = Attribute<'a>>
fn attributes_elements( &self, db: &'a dyn Database, ) -> impl Iterator<Item = Attribute<'a>>
self.attributes(db).elements(db).Source§fn query_attr(
&self,
db: &'a dyn Database,
attr: &'a str,
) -> impl Iterator<Item = Attribute<'a>>
fn query_attr( &self, db: &'a dyn Database, attr: &'a str, ) -> impl Iterator<Item = Attribute<'a>>
attr attached to this node.Source§fn find_attr(
&self,
db: &'a dyn Database,
attr: &'a str,
) -> Option<Attribute<'a>>
fn find_attr( &self, db: &'a dyn Database, attr: &'a str, ) -> Option<Attribute<'a>>
attr attached to this node.Source§impl<'a> Update for SyntaxNode<'a>
impl<'a> Update for SyntaxNode<'a>
impl<'a> Copy for SyntaxNode<'a>
impl<'a> Eq for SyntaxNode<'a>
impl<'a> StructuralPartialEq for SyntaxNode<'a>
Auto Trait Implementations§
impl<'a> Freeze for SyntaxNode<'a>
impl<'a> RefUnwindSafe for SyntaxNode<'a>
impl<'a> Send for SyntaxNode<'a>
impl<'a> Sync for SyntaxNode<'a>
impl<'a> Unpin for SyntaxNode<'a>
impl<'a> UnwindSafe for SyntaxNode<'a>
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<'db, T> DebugDbUpcast<'db, T> for Twhere
T: ?Sized,
impl<'db, T> DebugDbUpcast<'db, T> for Twhere
T: ?Sized,
fn debug_db_upcast(&'db self) -> &'db T
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