Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/syntax/src/ast/traits.rs')
| -rw-r--r-- | crates/syntax/src/ast/traits.rs | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/crates/syntax/src/ast/traits.rs b/crates/syntax/src/ast/traits.rs index eae3a7e2fe..2817f75d07 100644 --- a/crates/syntax/src/ast/traits.rs +++ b/crates/syntax/src/ast/traits.rs @@ -1,10 +1,12 @@ //! Various traits that are implemented by ast nodes. //! //! The implementations are usually trivial, and live in generated.rs +use itertools::Either; + use crate::{ ast::{self, support, AstChildren, AstNode, AstToken}, syntax_node::SyntaxElementChildren, - SyntaxToken, T, + SyntaxElement, SyntaxToken, T, }; pub trait HasName: AstNode { @@ -74,6 +76,9 @@ pub trait HasDocComments: HasAttrs { fn doc_comments(&self) -> CommentIter { CommentIter { iter: self.syntax().children_with_tokens() } } + fn doc_comments_and_attrs(&self) -> AttrCommentIter { + AttrCommentIter { iter: self.syntax().children_with_tokens() } + } } impl CommentIter { @@ -105,3 +110,17 @@ impl Iterator for CommentIter { self.iter.by_ref().find_map(|el| el.into_token().and_then(ast::Comment::cast)) } } + +pub struct AttrCommentIter { + iter: SyntaxElementChildren, +} + +impl Iterator for AttrCommentIter { + type Item = Either<ast::Comment, ast::Attr>; + fn next(&mut self) -> Option<Self::Item> { + self.iter.by_ref().find_map(|el| match el { + SyntaxElement::Node(node) => ast::Attr::cast(node).map(Either::Right), + SyntaxElement::Token(tok) => ast::Comment::cast(tok).map(Either::Left), + }) + } +} |