1
Fork 0

Separates inner attributes from code during doctest parsing.

This commit is contained in:
Wesley Norris 2018-10-20 14:45:44 -04:00 committed by QuietMisdreavus
parent 43b65b51e0
commit cd407dfe74

View file

@ -378,7 +378,7 @@ pub fn make_test(s: &str,
dont_insert_main: bool, dont_insert_main: bool,
opts: &TestOptions) opts: &TestOptions)
-> (String, usize) { -> (String, usize) {
let (crate_attrs, everything_else) = partition_source(s); let (crate_attrs, everything_else, crates) = partition_source(s);
let everything_else = everything_else.trim(); let everything_else = everything_else.trim();
let mut line_offset = 0; let mut line_offset = 0;
let mut prog = String::new(); let mut prog = String::new();
@ -409,7 +409,7 @@ pub fn make_test(s: &str,
use crate::syntax_pos::FileName; use crate::syntax_pos::FileName;
let filename = FileName::Anon; let filename = FileName::Anon;
let source = s.to_owned(); let source = crates + &everything_else;
let sess = ParseSess::new(FilePathMapping::empty()); let sess = ParseSess::new(FilePathMapping::empty());
let mut parser = parse::new_parser_from_source_str(&sess, filename, source); let mut parser = parse::new_parser_from_source_str(&sess, filename, source);
@ -417,31 +417,40 @@ pub fn make_test(s: &str,
let mut found_main = false; let mut found_main = false;
let mut found_extern_crate = cratename.is_none(); let mut found_extern_crate = cratename.is_none();
while let Ok(Some(item)) = parser.parse_item() { loop {
if !found_main { match parser.parse_item() {
if let ast::ItemKind::Fn(..) = item.node { Ok(Some(item)) => {
if item.ident.as_str() == "main" { if !found_main {
found_main = true; if let ast::ItemKind::Fn(..) = item.node {
if item.ident.as_str() == "main" {
found_main = true;
}
}
}
if !found_extern_crate {
if let ast::ItemKind::ExternCrate(original) = item.node {
// This code will never be reached if `cratename` is none because
// `found_extern_crate` is initialized to `true` if it is none.
let cratename = cratename.unwrap();
match original {
Some(name) => found_extern_crate = name.as_str() == cratename,
None => found_extern_crate = item.ident.as_str() == cratename,
}
}
}
if found_main && found_extern_crate {
break;
} }
} }
} Ok(None) => break,
Err(mut e) => {
if !found_extern_crate { e.cancel();
if let ast::ItemKind::ExternCrate(original) = item.node { break;
// This code will never be reached if `cratename` is none because
// `found_extern_crate` is initialized to `true` if it is none.
let cratename = cratename.unwrap();
match original {
Some(name) => found_extern_crate = name.as_str() == cratename,
None => found_extern_crate = item.ident.as_str() == cratename,
}
} }
} }
if found_main && found_extern_crate {
break;
}
} }
(found_main, found_extern_crate) (found_main, found_extern_crate)
@ -474,9 +483,10 @@ pub fn make_test(s: &str,
} }
// FIXME(aburka): use a real parser to deal with multiline attributes // FIXME(aburka): use a real parser to deal with multiline attributes
fn partition_source(s: &str) -> (String, String) { fn partition_source(s: &str) -> (String, String, String) {
let mut after_header = false; let mut after_header = false;
let mut before = String::new(); let mut before = String::new();
let mut crates = String::new();
let mut after = String::new(); let mut after = String::new();
for line in s.lines() { for line in s.lines() {
@ -490,12 +500,16 @@ fn partition_source(s: &str) -> (String, String) {
after.push_str(line); after.push_str(line);
after.push_str("\n"); after.push_str("\n");
} else { } else {
if trimline.starts_with("#[macro_use] extern crate")
|| trimline.starts_with("extern crate") {
crates.push_str(line);
}
before.push_str(line); before.push_str(line);
before.push_str("\n"); before.push_str("\n");
} }
} }
(before, after) (before, after, crates)
} }
pub trait Tester { pub trait Tester {