use crate::grammar::{DocComment, Message, MessageComponent};
use crate::slice_file::{Location, Span};
use lalrpop_util::lalrpop_mod;
lalrpop_mod!(
#[allow(unused, clippy::all)] pub lalrpop,
"/parsers/comments/grammar.rs"
);
macro_rules! append_tag_to_comment {
($comment:ident, $field:ident, $block:expr) => {{
$comment.span.end = $block.span.end;
$comment.$field.push($block);
$comment
}};
}
use append_tag_to_comment;
fn create_doc_comment(overview: Option<Message>, start: Location, file: &str) -> DocComment {
let mut span = Span::new(start, start, file);
span.start.col -= 3;
if let Some(overview_field) = &overview {
span.end = overview_field.span.end;
}
DocComment {
overview,
params: Vec::new(),
returns: Vec::new(),
throws: Vec::new(),
see: Vec::new(),
span,
}
}
fn get_scoped_identifier_string<'a>(first: &'a str, mut others: Vec<&'a str>, is_globally_scoped: bool) -> String {
others.insert(0, first);
if is_globally_scoped {
others.insert(0, ""); }
others.join("::")
}
fn construct_section_message(
inline_message: Option<Vec<MessageComponent>>,
message_lines: Option<Message>,
span: Span,
) -> Message {
let mut value = message_lines.map(|m| m.value).unwrap_or_default();
if let Some(mut message) = inline_message {
if let Some(MessageComponent::Text(text)) = message.first_mut() {
*text = text.trim_start().to_owned();
}
message.push(MessageComponent::Text("\n".to_owned()));
message.append(&mut value);
value = message;
}
Message { value, span }
}
fn sanitize_message_lines(lines: Vec<Option<Vec<MessageComponent>>>, span: Span) -> Message {
let mut common_leading_whitespace = usize::MAX;
for line in &lines {
if let Some(message) = &line {
match message.first().unwrap() {
MessageComponent::Text(text) => {
let whitespace_index = text.find(|c: char| !c.is_whitespace()).unwrap_or_default();
common_leading_whitespace = std::cmp::min(whitespace_index, common_leading_whitespace);
}
MessageComponent::Link(_) => {
common_leading_whitespace = 0;
break;
}
}
}
}
let value = lines
.into_iter()
.flat_map(|line| match line {
Some(mut message) => {
if let MessageComponent::Text(text) = message.first_mut().unwrap() {
text.replace_range(..common_leading_whitespace, "");
}
message.push(MessageComponent::Text("\n".to_owned()));
message
}
None => vec![MessageComponent::Text("\n".to_owned())],
})
.collect();
Message { value, span }
}