Skip to content

Commit 44f8cf3

Browse files
committed
Use generic sink fns instead of dynamic dispatch
1 parent 77eadeb commit 44f8cf3

File tree

1 file changed

+51
-19
lines changed

1 file changed

+51
-19
lines changed

src/librustdoc/html/highlight.rs

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -895,7 +895,7 @@ impl<'src> Classifier<'src> {
895895
/// The general structure for this method is to iterate over each token,
896896
/// possibly giving it an HTML span with a class specifying what flavor of
897897
/// token is used.
898-
fn highlight(mut self, sink: &mut dyn FnMut(Span, Highlight<'src>)) {
898+
fn highlight(mut self, mut sink: impl FnMut(Span, Highlight<'src>)) {
899899
loop {
900900
if let Some(decs) = self.decorations.as_mut() {
901901
let byte_pos = self.byte_pos;
@@ -918,15 +918,15 @@ impl<'src> Classifier<'src> {
918918
let tokens = self.get_full_ident_path();
919919
for (token, start, end) in &tokens {
920920
let text = &self.src[*start..*end];
921-
self.advance(*token, text, sink, *start as u32);
921+
self.advance(*token, text, &mut sink, *start as u32);
922922
self.byte_pos += text.len() as u32;
923923
}
924924
if !tokens.is_empty() {
925925
continue;
926926
}
927927
}
928928
if let Some((token, text, before)) = self.next() {
929-
self.advance(token, text, sink, before);
929+
self.advance(token, text, &mut sink, before);
930930
} else {
931931
break;
932932
}
@@ -943,15 +943,14 @@ impl<'src> Classifier<'src> {
943943
&mut self,
944944
token: TokenKind,
945945
text: &'src str,
946-
sink: &mut dyn FnMut(Span, Highlight<'src>),
946+
mut sink: impl FnMut(Span, Highlight<'src>),
947947
before: u32,
948948
) {
949949
let lookahead = self.peek();
950950
let file_span = self.file_span;
951-
let no_highlight = |sink: &mut dyn FnMut(_, _)| {
952-
sink(new_span(before, text, file_span), Highlight::Token { text, class: None })
953-
};
954-
let whitespace = |sink: &mut dyn FnMut(_, _)| {
951+
let no_highlight =
952+
|| (new_span(before, text, file_span), Highlight::Token { text, class: None });
953+
let mut whitespace = || {
955954
let mut start = 0u32;
956955
for part in text.split('\n').intersperse("\n").filter(|s| !s.is_empty()) {
957956
sink(
@@ -962,7 +961,10 @@ impl<'src> Classifier<'src> {
962961
}
963962
};
964963
let class = match token {
965-
TokenKind::Whitespace => return whitespace(sink),
964+
TokenKind::Whitespace => {
965+
whitespace();
966+
return;
967+
}
966968
TokenKind::LineComment { doc_style } | TokenKind::BlockComment { doc_style, .. } => {
967969
if doc_style.is_some() {
968970
Class::DocComment
@@ -983,7 +985,10 @@ impl<'src> Classifier<'src> {
983985
// or a reference or pointer type. Unless, of course, it looks like
984986
// a logical and or a multiplication operator: `&&` or `* `.
985987
TokenKind::Star => match self.tokens.peek() {
986-
Some((TokenKind::Whitespace, _)) => return whitespace(sink),
988+
Some((TokenKind::Whitespace, _)) => {
989+
whitespace();
990+
return;
991+
}
987992
Some((TokenKind::Ident, "mut")) => {
988993
self.next();
989994
sink(
@@ -1013,7 +1018,10 @@ impl<'src> Classifier<'src> {
10131018
sink(DUMMY_SP, Highlight::Token { text: "&=", class: None });
10141019
return;
10151020
}
1016-
Some((TokenKind::Whitespace, _)) => return whitespace(sink),
1021+
Some((TokenKind::Whitespace, _)) => {
1022+
whitespace();
1023+
return;
1024+
}
10171025
Some((TokenKind::Ident, "mut")) => {
10181026
self.next();
10191027
sink(
@@ -1037,7 +1045,11 @@ impl<'src> Classifier<'src> {
10371045
sink(DUMMY_SP, Highlight::Token { text: "=>", class: None });
10381046
return;
10391047
}
1040-
_ => return no_highlight(sink),
1048+
_ => {
1049+
let (span, highlight) = no_highlight();
1050+
sink(span, highlight);
1051+
return;
1052+
}
10411053
},
10421054
TokenKind::Minus if lookahead == Some(TokenKind::Gt) => {
10431055
self.next();
@@ -1054,7 +1066,11 @@ impl<'src> Classifier<'src> {
10541066
| TokenKind::Percent
10551067
| TokenKind::Bang
10561068
| TokenKind::Lt
1057-
| TokenKind::Gt => return no_highlight(sink),
1069+
| TokenKind::Gt => {
1070+
let (span, highlight) = no_highlight();
1071+
sink(span, highlight);
1072+
return;
1073+
}
10581074

10591075
// Miscellaneous, no highlighting.
10601076
TokenKind::Dot
@@ -1069,7 +1085,11 @@ impl<'src> Classifier<'src> {
10691085
| TokenKind::Tilde
10701086
| TokenKind::Colon
10711087
| TokenKind::Frontmatter { .. }
1072-
| TokenKind::Unknown => return no_highlight(sink),
1088+
| TokenKind::Unknown => {
1089+
let (span, highlight) = no_highlight();
1090+
sink(span, highlight);
1091+
return;
1092+
}
10731093

10741094
TokenKind::Question => Class::QuestionMark,
10751095

@@ -1078,7 +1098,11 @@ impl<'src> Classifier<'src> {
10781098
self.in_macro_nonterminal = true;
10791099
Class::MacroNonTerminal
10801100
}
1081-
_ => return no_highlight(sink),
1101+
_ => {
1102+
let (span, highlight) = no_highlight();
1103+
sink(span, highlight);
1104+
return;
1105+
}
10821106
},
10831107

10841108
// This might be the start of an attribute. We're going to want to
@@ -1109,9 +1133,11 @@ impl<'src> Classifier<'src> {
11091133
Highlight::EnterSpan { class: Class::Attribute },
11101134
);
11111135
}
1112-
_ => (),
1136+
_ => {}
11131137
}
1114-
return no_highlight(sink);
1138+
let (span, highlight) = no_highlight();
1139+
sink(span, highlight);
1140+
return;
11151141
}
11161142
TokenKind::CloseBracket => {
11171143
if self.in_attribute {
@@ -1123,7 +1149,9 @@ impl<'src> Classifier<'src> {
11231149
sink(DUMMY_SP, Highlight::ExitSpan);
11241150
return;
11251151
}
1126-
return no_highlight(sink);
1152+
let (span, highlight) = no_highlight();
1153+
sink(span, highlight);
1154+
return;
11271155
}
11281156
TokenKind::Literal { kind, .. } => match kind {
11291157
// Text literals.
@@ -1138,7 +1166,11 @@ impl<'src> Classifier<'src> {
11381166
// Number literals.
11391167
LiteralKind::Float { .. } | LiteralKind::Int { .. } => Class::Number,
11401168
},
1141-
TokenKind::GuardedStrPrefix => return no_highlight(sink),
1169+
TokenKind::GuardedStrPrefix => {
1170+
let (span, highlight) = no_highlight();
1171+
sink(span, highlight);
1172+
return;
1173+
}
11421174
TokenKind::Ident | TokenKind::RawIdent if lookahead == Some(TokenKind::Bang) => {
11431175
self.in_macro = true;
11441176
let span = new_span(before, text, file_span);

0 commit comments

Comments
 (0)