Separates inner attributes from code during doctest parsing.
This commit is contained in:
parent
43b65b51e0
commit
cd407dfe74
1 changed files with 39 additions and 25 deletions
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue