Skip to content

Commit ba1363f

Browse files
committed
Auto merge of #50924 - petrochenkov:spanover, r=alexcrichton
lexer: Fix span override for the first token in a string Previously due to peculiarities of `StringReader` construction something like `"a b c d".parse::<TokenStream>()` gave you one non-overridden span for `a` and then three correctly overridden spans for `b`, `c` and `d`. Now all the spans are overridden.
2 parents 1e508c4 + b4714cd commit ba1363f

File tree

4 files changed

+15
-13
lines changed

4 files changed

+15
-13
lines changed

src/librustdoc/html/highlight.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ pub fn render_with_highlighting(src: &str, class: Option<&str>, id: Option<&str>
4848
}
4949
write_header(class, id, &mut out).unwrap();
5050

51-
let mut classifier = Classifier::new(lexer::StringReader::new(&sess, fm), sess.codemap());
51+
let mut classifier = Classifier::new(lexer::StringReader::new(&sess, fm, None), sess.codemap());
5252
if let Err(_) = classifier.write_source(&mut out) {
5353
return format!("<pre>{}</pre>", src);
5454
}
@@ -68,7 +68,7 @@ pub fn render_inner_with_highlighting(src: &str) -> io::Result<String> {
6868
let fm = sess.codemap().new_filemap(FileName::Custom("stdin".to_string()), src.to_string());
6969

7070
let mut out = Vec::new();
71-
let mut classifier = Classifier::new(lexer::StringReader::new(&sess, fm), sess.codemap());
71+
let mut classifier = Classifier::new(lexer::StringReader::new(&sess, fm, None), sess.codemap());
7272
classifier.write_source(&mut out)?;
7373

7474
Ok(String::from_utf8_lossy(&out).into_owned())

src/libsyntax/parse/lexer/comments.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ pub fn gather_comments_and_literals(sess: &ParseSess, path: FileName, srdr: &mut
362362
let src = String::from_utf8(src).unwrap();
363363
let cm = CodeMap::new(sess.codemap().path_mapping().clone());
364364
let filemap = cm.new_filemap(path, src);
365-
let mut rdr = lexer::StringReader::new_raw(sess, filemap);
365+
let mut rdr = lexer::StringReader::new_raw(sess, filemap, None);
366366

367367
let mut comments: Vec<Comment> = Vec::new();
368368
let mut literals: Vec<Literal> = Vec::new();

src/libsyntax/parse/lexer/mod.rs

+11-8
Original file line numberDiff line numberDiff line change
@@ -155,13 +155,15 @@ impl<'a> StringReader<'a> {
155155

156156
impl<'a> StringReader<'a> {
157157
/// For comments.rs, which hackily pokes into next_pos and ch
158-
pub fn new_raw(sess: &'a ParseSess, filemap: Lrc<syntax_pos::FileMap>) -> Self {
159-
let mut sr = StringReader::new_raw_internal(sess, filemap);
158+
pub fn new_raw(sess: &'a ParseSess, filemap: Lrc<syntax_pos::FileMap>,
159+
override_span: Option<Span>) -> Self {
160+
let mut sr = StringReader::new_raw_internal(sess, filemap, override_span);
160161
sr.bump();
161162
sr
162163
}
163164

164-
fn new_raw_internal(sess: &'a ParseSess, filemap: Lrc<syntax_pos::FileMap>) -> Self {
165+
fn new_raw_internal(sess: &'a ParseSess, filemap: Lrc<syntax_pos::FileMap>,
166+
override_span: Option<Span>) -> Self {
165167
if filemap.src.is_none() {
166168
sess.span_diagnostic.bug(&format!("Cannot lex filemap without source: {}",
167169
filemap.name));
@@ -185,12 +187,13 @@ impl<'a> StringReader<'a> {
185187
token: token::Eof,
186188
span: syntax_pos::DUMMY_SP,
187189
open_braces: Vec::new(),
188-
override_span: None,
190+
override_span,
189191
}
190192
}
191193

192-
pub fn new(sess: &'a ParseSess, filemap: Lrc<syntax_pos::FileMap>) -> Self {
193-
let mut sr = StringReader::new_raw(sess, filemap);
194+
pub fn new(sess: &'a ParseSess, filemap: Lrc<syntax_pos::FileMap>, override_span: Option<Span>)
195+
-> Self {
196+
let mut sr = StringReader::new_raw(sess, filemap, override_span);
194197
if sr.advance_token().is_err() {
195198
sr.emit_fatal_errors();
196199
FatalError.raise();
@@ -207,7 +210,7 @@ impl<'a> StringReader<'a> {
207210
span = span.shrink_to_lo();
208211
}
209212

210-
let mut sr = StringReader::new_raw_internal(sess, begin.fm);
213+
let mut sr = StringReader::new_raw_internal(sess, begin.fm, None);
211214

212215
// Seek the lexer to the right byte range.
213216
sr.save_new_lines_and_multibyte = false;
@@ -1795,7 +1798,7 @@ mod tests {
17951798
teststr: String)
17961799
-> StringReader<'a> {
17971800
let fm = cm.new_filemap(PathBuf::from("zebra.rs").into(), teststr);
1798-
StringReader::new(sess, fm)
1801+
StringReader::new(sess, fm, None)
17991802
}
18001803

18011804
#[test]

src/libsyntax/parse/mod.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,7 @@ fn file_to_filemap(sess: &ParseSess, path: &Path, spanopt: Option<Span>)
229229
/// Given a filemap, produce a sequence of token-trees
230230
pub fn filemap_to_stream(sess: &ParseSess, filemap: Lrc<FileMap>, override_span: Option<Span>)
231231
-> TokenStream {
232-
let mut srdr = lexer::StringReader::new(sess, filemap);
233-
srdr.override_span = override_span;
232+
let mut srdr = lexer::StringReader::new(sess, filemap, override_span);
234233
srdr.real_token();
235234
panictry!(srdr.parse_all_token_trees())
236235
}

0 commit comments

Comments
 (0)