From cc04cfc982b0321b55d54937709c01ca242eb5ff Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sun, 30 Jan 2022 22:18:32 +0100 Subject: Reduce allocations in attribute collection --- crates/syntax/src/ast.rs | 4 ++-- crates/syntax/src/ast/node_ext.rs | 11 +++-------- crates/syntax/src/ast/traits.rs | 20 +++++++++++++------- 3 files changed, 18 insertions(+), 17 deletions(-) (limited to 'crates/syntax/src') diff --git a/crates/syntax/src/ast.rs b/crates/syntax/src/ast.rs index 5c1aed3cd48..91b46cf8e9d 100644 --- a/crates/syntax/src/ast.rs +++ b/crates/syntax/src/ast.rs @@ -27,8 +27,8 @@ pub use self::{ operators::{ArithOp, BinaryOp, CmpOp, LogicOp, Ordering, RangeOp, UnaryOp}, token_ext::{CommentKind, CommentPlacement, CommentShape, IsString, QuoteOffsets, Radix}, traits::{ - DocCommentIter, HasArgList, HasAttrs, HasDocComments, HasGenericParams, HasLoopBody, - HasModuleItem, HasName, HasTypeBounds, HasVisibility, + AttrDocCommentIter, DocCommentIter, HasArgList, HasAttrs, HasDocComments, HasGenericParams, + HasLoopBody, HasModuleItem, HasName, HasTypeBounds, HasVisibility, }, }; diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs index 705aa5edac4..7211c77e880 100644 --- a/crates/syntax/src/ast/node_ext.rs +++ b/crates/syntax/src/ast/node_ext.rs @@ -160,14 +160,9 @@ impl ast::Attr { } pub fn kind(&self) -> AttrKind { - let first_token = self.syntax().first_token(); - let first_token_kind = first_token.as_ref().map(SyntaxToken::kind); - let second_token_kind = - first_token.and_then(|token| token.next_token()).as_ref().map(SyntaxToken::kind); - - match (first_token_kind, second_token_kind) { - (Some(T![#]), Some(T![!])) => AttrKind::Inner, - _ => AttrKind::Outer, + match self.excl_token() { + Some(_) => AttrKind::Inner, + None => AttrKind::Outer, } } diff --git a/crates/syntax/src/ast/traits.rs b/crates/syntax/src/ast/traits.rs index 98b1087e641..aa2b7ed5c8b 100644 --- a/crates/syntax/src/ast/traits.rs +++ b/crates/syntax/src/ast/traits.rs @@ -76,8 +76,8 @@ pub trait HasDocComments: HasAttrs { fn doc_comments(&self) -> DocCommentIter { DocCommentIter { iter: self.syntax().children_with_tokens() } } - fn doc_comments_and_attrs(&self) -> AttrCommentIter { - AttrCommentIter { iter: self.syntax().children_with_tokens() } + fn doc_comments_and_attrs(&self) -> AttrDocCommentIter { + AttrDocCommentIter { iter: self.syntax().children_with_tokens() } } } @@ -113,17 +113,23 @@ impl Iterator for DocCommentIter { } } -pub struct AttrCommentIter { +pub struct AttrDocCommentIter { iter: SyntaxElementChildren, } -impl Iterator for AttrCommentIter { - type Item = Either; +impl AttrDocCommentIter { + pub fn from_syntax_node(syntax_node: &ast::SyntaxNode) -> AttrDocCommentIter { + AttrDocCommentIter { iter: syntax_node.children_with_tokens() } + } +} + +impl Iterator for AttrDocCommentIter { + type Item = Either; fn next(&mut self) -> Option { self.iter.by_ref().find_map(|el| match el { - SyntaxElement::Node(node) => ast::Attr::cast(node).map(Either::Right), + SyntaxElement::Node(node) => ast::Attr::cast(node).map(Either::Left), SyntaxElement::Token(tok) => { - ast::Comment::cast(tok).filter(ast::Comment::is_doc).map(Either::Left) + ast::Comment::cast(tok).filter(ast::Comment::is_doc).map(Either::Right) } }) } -- cgit 1.4.1-3-g733a5