mirror of
				https://github.com/rust-lang/rust-analyzer.git
				synced 2025-10-30 03:27:44 +00:00 
			
		
		
		
	fix: resolve doc path if outer comments exist on module and replace from cfg_attr bit to doc_place bit
Signed-off-by: Hayashi Mikihiro <34ttrweoewiwe28@gmail.com>
This commit is contained in:
		
							parent
							
								
									d30deb58fe
								
							
						
					
					
						commit
						9f6b4255c2
					
				
					 5 changed files with 99 additions and 34 deletions
				
			
		|  | @ -129,9 +129,8 @@ impl RawAttrs { | |||
|                     .cloned() | ||||
|                     .chain(b.slice.iter().map(|it| { | ||||
|                         let mut it = it.clone(); | ||||
|                         it.id.id = (it.id.ast_index() as u32 + last_ast_index) | ||||
|                             | ((it.id.cfg_attr_index().unwrap_or(0) as u32) | ||||
|                                 << AttrId::AST_INDEX_BITS); | ||||
|                         let id = it.id.ast_index() as u32 + last_ast_index; | ||||
|                         it.id = AttrId::new(id as usize, it.id.is_inner_attr()); | ||||
|                         it | ||||
|                     })) | ||||
|                     .collect::<Vec<_>>(); | ||||
|  | @ -175,25 +174,21 @@ pub struct AttrId { | |||
| // FIXME: This only handles a single level of cfg_attr nesting
 | ||||
| // that is `#[cfg_attr(all(), cfg_attr(all(), cfg(any())))]` breaks again
 | ||||
| impl AttrId { | ||||
|     const CFG_ATTR_BITS: usize = 7; | ||||
|     const AST_INDEX_MASK: usize = 0x00FF_FFFF; | ||||
|     const AST_INDEX_BITS: usize = Self::AST_INDEX_MASK.count_ones() as usize; | ||||
|     const CFG_ATTR_SET_BITS: u32 = 1 << 31; | ||||
|     const INNER_ATTR_BIT: usize = 1 << 31; | ||||
| 
 | ||||
|     pub fn new(id: usize, is_inner: bool) -> Self { | ||||
|         let id = id & Self::AST_INDEX_MASK; | ||||
|         let id = if is_inner { id | Self::INNER_ATTR_BIT } else { id }; | ||||
|         Self { id: id as u32 } | ||||
|     } | ||||
| 
 | ||||
|     pub fn ast_index(&self) -> usize { | ||||
|         self.id as usize & Self::AST_INDEX_MASK | ||||
|     } | ||||
| 
 | ||||
|     pub fn cfg_attr_index(&self) -> Option<usize> { | ||||
|         if self.id & Self::CFG_ATTR_SET_BITS == 0 { | ||||
|             None | ||||
|         } else { | ||||
|             Some(self.id as usize >> Self::AST_INDEX_BITS) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn with_cfg_attr(self, idx: usize) -> AttrId { | ||||
|         AttrId { id: self.id | ((idx as u32) << Self::AST_INDEX_BITS) | Self::CFG_ATTR_SET_BITS } | ||||
|     pub fn is_inner_attr(&self) -> bool { | ||||
|         (self.id as usize) & Self::INNER_ATTR_BIT != 0 | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -333,10 +328,7 @@ impl Attr { | |||
|             None => return smallvec![self.clone()], | ||||
|         }; | ||||
|         let index = self.id; | ||||
|         let attrs = parts | ||||
|             .enumerate() | ||||
|             .take(1 << AttrId::CFG_ATTR_BITS) | ||||
|             .filter_map(|(idx, attr)| Attr::from_tt(db, attr, index.with_cfg_attr(idx))); | ||||
|         let attrs = parts.filter_map(|attr| Attr::from_tt(db, attr, index)); | ||||
| 
 | ||||
|         let cfg = TopSubtree::from_token_trees(subtree.top_subtree().delimiter, cfg); | ||||
|         let cfg = CfgExpr::parse(&cfg); | ||||
|  | @ -467,13 +459,18 @@ fn unescape(s: &str) -> Option<Cow<'_, str>> { | |||
| pub fn collect_attrs( | ||||
|     owner: &dyn ast::HasAttrs, | ||||
| ) -> impl Iterator<Item = (AttrId, Either<ast::Attr, ast::Comment>)> { | ||||
|     let inner_attrs = inner_attributes(owner.syntax()).into_iter().flatten(); | ||||
|     let outer_attrs = | ||||
|         ast::AttrDocCommentIter::from_syntax_node(owner.syntax()).filter(|el| match el { | ||||
|     let inner_attrs = | ||||
|         inner_attributes(owner.syntax()).into_iter().flatten().map(|attr| (attr, true)); | ||||
|     let outer_attrs = ast::AttrDocCommentIter::from_syntax_node(owner.syntax()) | ||||
|         .filter(|el| match el { | ||||
|             Either::Left(attr) => attr.kind().is_outer(), | ||||
|             Either::Right(comment) => comment.is_outer(), | ||||
|         }); | ||||
|     outer_attrs.chain(inner_attrs).enumerate().map(|(id, attr)| (AttrId { id: id as u32 }, attr)) | ||||
|         }) | ||||
|         .map(|attr| (attr, false)); | ||||
|     outer_attrs | ||||
|         .chain(inner_attrs) | ||||
|         .enumerate() | ||||
|         .map(|(id, (attr, is_inner))| (AttrId::new(id, is_inner), attr)) | ||||
| } | ||||
| 
 | ||||
| fn inner_attributes( | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Hayashi Mikihiro
						Hayashi Mikihiro