sv-parser: Split preprocessing from parse_sv_str

This commit is contained in:
Florian Zaruba 2020-04-02 14:24:56 +02:00
parent c7c79dbcdb
commit 1189f2d1c9

View File

@ -99,6 +99,13 @@ pub fn parse_sv<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>(
ignore_include: bool, ignore_include: bool,
) -> Result<(SyntaxTree, Defines), Error> { ) -> Result<(SyntaxTree, Defines), Error> {
let (text, defines) = preprocess(path, pre_defines, include_paths, false, ignore_include)?; let (text, defines) = preprocess(path, pre_defines, include_paths, false, ignore_include)?;
parse_sv_pp(text, defines)
}
pub fn parse_sv_pp(
text: PreprocessedText,
defines: Defines,
) -> Result<(SyntaxTree, Defines), Error> {
let span = Span::new_extra(text.text(), SpanInfo::default()); let span = Span::new_extra(text.text(), SpanInfo::default());
let result = all_consuming(sv_parser)(span); let result = all_consuming(sv_parser)(span);
match result { match result {
@ -145,78 +152,17 @@ pub fn parse_sv_str<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>(
false, false,
0, 0,
)?; )?;
let span = Span::new_extra(text.text(), SpanInfo::default()); parse_sv_pp(text, defines)
let result = all_consuming(sv_parser)(span);
match result {
Ok((_, x)) => Ok((
SyntaxTree {
node: x.into(),
text,
},
defines,
)),
Err(x) => {
let pos = match x {
nom::Err::Incomplete(_) => None,
nom::Err::Error(e) => error_position(&e),
nom::Err::Failure(e) => error_position(&e),
};
let origin = if let Some(pos) = pos {
if let Some(origin) = text.origin(pos) {
Some((origin.0.clone(), origin.1))
} else {
None
}
} else {
None
};
Err(Error::Parse(origin))
}
}
} }
pub fn parse_lib<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>( pub fn parse_lib<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>(
path: T, path: T,
pre_defines: &HashMap<String, Option<Define>, V>, pre_defines: &HashMap<String, Option<Define>, V>,
include_paths: &[U], include_paths: &[U],
strip_comments: bool,
ignore_include: bool, ignore_include: bool,
) -> Result<(SyntaxTree, Defines), Error> { ) -> Result<(SyntaxTree, Defines), Error> {
let (text, defines) = preprocess( let (text, defines) = preprocess(path, pre_defines, include_paths, false, ignore_include)?;
path, parse_lib_pp(text, defines)
pre_defines,
include_paths,
strip_comments,
ignore_include,
)?;
let span = Span::new_extra(text.text(), SpanInfo::default());
let result = all_consuming(lib_parser)(span);
match result {
Ok((_, x)) => Ok((
SyntaxTree {
node: x.into(),
text,
},
defines,
)),
Err(x) => {
let pos = match x {
nom::Err::Incomplete(_) => None,
nom::Err::Error(e) => error_position(&e),
nom::Err::Failure(e) => error_position(&e),
};
let origin = if let Some(pos) = pos {
if let Some(origin) = text.origin(pos) {
Some((origin.0.clone(), origin.1))
} else {
None
}
} else {
None
};
Err(Error::Parse(origin))
}
}
} }
pub fn parse_lib_str<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>( pub fn parse_lib_str<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>(
@ -235,6 +181,13 @@ pub fn parse_lib_str<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>(
false, false,
0, 0,
)?; )?;
parse_lib_pp(text, defines)
}
pub fn parse_lib_pp(
text: PreprocessedText,
defines: Defines,
) -> Result<(SyntaxTree, Defines), Error> {
let span = Span::new_extra(text.text(), SpanInfo::default()); let span = Span::new_extra(text.text(), SpanInfo::default());
let result = all_consuming(lib_parser)(span); let result = all_consuming(lib_parser)(span);
match result { match result {