1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
use crate::{ pos::Spanned, syntax_pos::{BytePos, Span}, }; use chashmap::{CHashMap, ReadGuard}; type CommentMap = CHashMap<BytePos, Vec<Comment>>; #[derive(Debug, Default)] pub struct Comments { leading: CommentMap, trailing: CommentMap, } impl Comments { pub fn add_leading(&self, pos: BytePos, cmt: Vec<Comment>) { self.leading.insert(pos, cmt); } pub fn add_trailing(&self, pos: BytePos, cmt: Comment) { self.trailing.alter(pos, |v| match v { Some(mut value) => { value.push(cmt); Some(value) } None => Some(vec![cmt]), }); } pub fn take_trailing_comments(&self, pos: BytePos) -> Option<Vec<Comment>> { self.trailing.remove(&pos) } pub fn trailing_comments(&self, pos: BytePos) -> Option<ReadGuard<'_, BytePos, Vec<Comment>>> { self.trailing.get(&pos) } pub fn take_leading_comments(&self, pos: BytePos) -> Option<Vec<Comment>> { self.leading.remove(&pos) } pub fn leading_comments(&self, pos: BytePos) -> Option<ReadGuard<'_, BytePos, Vec<Comment>>> { self.leading.get(&pos) } pub fn move_leading(&self, from: BytePos, to: BytePos) { let cmt = self.leading.remove(&from); if let Some(cmt) = cmt { self.leading.alter(to, |v| match v { Some(mut value) => { value.extend(cmt); Some(value) } None => Some(cmt), }); } } pub fn move_trailing(&self, from: BytePos, to: BytePos) { let cmt = self.trailing.remove(&from); if let Some(cmt) = cmt { self.trailing.alter(to, |v| match v { Some(mut value) => { value.extend(cmt); Some(value) } None => Some(cmt), }); } } } #[derive(Debug, Clone, PartialEq, Eq)] pub struct Comment { pub kind: CommentKind, pub span: Span, pub text: String, } impl Spanned for Comment { fn span(&self) -> Span { self.span } } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum CommentKind { Line, Block, }