ppWhitespace Skip whitespace nodes attached to compiler directives.
This commit is contained in:
parent
04b64992b9
commit
e149c28445
@ -181,6 +181,7 @@ pub fn preprocess_str<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>(
|
|||||||
resolve_depth: usize,
|
resolve_depth: usize,
|
||||||
) -> Result<(PreprocessedText, Defines), Error> {
|
) -> Result<(PreprocessedText, Defines), Error> {
|
||||||
let mut skip = false;
|
let mut skip = false;
|
||||||
|
let mut skip_whitespace = false;
|
||||||
let mut skip_nodes = SkipNodes::new();
|
let mut skip_nodes = SkipNodes::new();
|
||||||
let mut defines = HashMap::new();
|
let mut defines = HashMap::new();
|
||||||
|
|
||||||
@ -281,56 +282,100 @@ pub fn preprocess_str<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>(
|
|||||||
let locate: Locate = x.try_into().unwrap();
|
let locate: Locate = x.try_into().unwrap();
|
||||||
let range = Range::new(locate.offset, locate.offset + locate.len);
|
let range = Range::new(locate.offset, locate.offset + locate.len);
|
||||||
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
||||||
|
skip_whitespace = true;
|
||||||
|
}
|
||||||
|
NodeEvent::Leave(RefNode::ResetallCompilerDirective(_)) => {
|
||||||
|
skip_whitespace = false;
|
||||||
}
|
}
|
||||||
NodeEvent::Enter(RefNode::TimescaleCompilerDirective(x)) => {
|
NodeEvent::Enter(RefNode::TimescaleCompilerDirective(x)) => {
|
||||||
let locate: Locate = x.try_into().unwrap();
|
let locate: Locate = x.try_into().unwrap();
|
||||||
let range = Range::new(locate.offset, locate.offset + locate.len);
|
let range = Range::new(locate.offset, locate.offset + locate.len);
|
||||||
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
||||||
|
skip_whitespace = true;
|
||||||
|
}
|
||||||
|
NodeEvent::Leave(RefNode::TimescaleCompilerDirective(_)) => {
|
||||||
|
skip_whitespace = false;
|
||||||
}
|
}
|
||||||
NodeEvent::Enter(RefNode::DefaultNettypeCompilerDirective(x)) => {
|
NodeEvent::Enter(RefNode::DefaultNettypeCompilerDirective(x)) => {
|
||||||
let locate: Locate = x.try_into().unwrap();
|
let locate: Locate = x.try_into().unwrap();
|
||||||
let range = Range::new(locate.offset, locate.offset + locate.len);
|
let range = Range::new(locate.offset, locate.offset + locate.len);
|
||||||
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
||||||
|
skip_whitespace = true;
|
||||||
|
}
|
||||||
|
NodeEvent::Leave(RefNode::DefaultNettypeCompilerDirective(_)) => {
|
||||||
|
skip_whitespace = false;
|
||||||
}
|
}
|
||||||
NodeEvent::Enter(RefNode::UnconnectedDriveCompilerDirective(x)) => {
|
NodeEvent::Enter(RefNode::UnconnectedDriveCompilerDirective(x)) => {
|
||||||
let locate: Locate = x.try_into().unwrap();
|
let locate: Locate = x.try_into().unwrap();
|
||||||
let range = Range::new(locate.offset, locate.offset + locate.len);
|
let range = Range::new(locate.offset, locate.offset + locate.len);
|
||||||
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
||||||
|
skip_whitespace = true;
|
||||||
|
}
|
||||||
|
NodeEvent::Leave(RefNode::UnconnectedDriveCompilerDirective(_)) => {
|
||||||
|
skip_whitespace = false;
|
||||||
}
|
}
|
||||||
NodeEvent::Enter(RefNode::NounconnectedDriveCompilerDirective(x)) => {
|
NodeEvent::Enter(RefNode::NounconnectedDriveCompilerDirective(x)) => {
|
||||||
let locate: Locate = x.try_into().unwrap();
|
let locate: Locate = x.try_into().unwrap();
|
||||||
let range = Range::new(locate.offset, locate.offset + locate.len);
|
let range = Range::new(locate.offset, locate.offset + locate.len);
|
||||||
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
||||||
|
skip_whitespace = true;
|
||||||
|
}
|
||||||
|
NodeEvent::Leave(RefNode::NounconnectedDriveCompilerDirective(_)) => {
|
||||||
|
skip_whitespace = false;
|
||||||
}
|
}
|
||||||
NodeEvent::Enter(RefNode::CelldefineDriveCompilerDirective(x)) => {
|
NodeEvent::Enter(RefNode::CelldefineDriveCompilerDirective(x)) => {
|
||||||
let locate: Locate = x.try_into().unwrap();
|
let locate: Locate = x.try_into().unwrap();
|
||||||
let range = Range::new(locate.offset, locate.offset + locate.len);
|
let range = Range::new(locate.offset, locate.offset + locate.len);
|
||||||
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
||||||
|
skip_whitespace = true;
|
||||||
|
}
|
||||||
|
NodeEvent::Leave(RefNode::CelldefineDriveCompilerDirective(_)) => {
|
||||||
|
skip_whitespace = false;
|
||||||
}
|
}
|
||||||
NodeEvent::Enter(RefNode::EndcelldefineDriveCompilerDirective(x)) => {
|
NodeEvent::Enter(RefNode::EndcelldefineDriveCompilerDirective(x)) => {
|
||||||
let locate: Locate = x.try_into().unwrap();
|
let locate: Locate = x.try_into().unwrap();
|
||||||
let range = Range::new(locate.offset, locate.offset + locate.len);
|
let range = Range::new(locate.offset, locate.offset + locate.len);
|
||||||
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
||||||
|
skip_whitespace = true;
|
||||||
|
}
|
||||||
|
NodeEvent::Leave(RefNode::EndcelldefineDriveCompilerDirective(_)) => {
|
||||||
|
skip_whitespace = false;
|
||||||
}
|
}
|
||||||
NodeEvent::Enter(RefNode::Pragma(x)) => {
|
NodeEvent::Enter(RefNode::Pragma(x)) => {
|
||||||
let locate: Locate = x.try_into().unwrap();
|
let locate: Locate = x.try_into().unwrap();
|
||||||
let range = Range::new(locate.offset, locate.offset + locate.len);
|
let range = Range::new(locate.offset, locate.offset + locate.len);
|
||||||
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
||||||
|
skip_whitespace = true;
|
||||||
|
}
|
||||||
|
NodeEvent::Leave(RefNode::Pragma(_)) => {
|
||||||
|
skip_whitespace = false;
|
||||||
}
|
}
|
||||||
NodeEvent::Enter(RefNode::LineCompilerDirective(x)) => {
|
NodeEvent::Enter(RefNode::LineCompilerDirective(x)) => {
|
||||||
let locate: Locate = x.try_into().unwrap();
|
let locate: Locate = x.try_into().unwrap();
|
||||||
let range = Range::new(locate.offset, locate.offset + locate.len);
|
let range = Range::new(locate.offset, locate.offset + locate.len);
|
||||||
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
||||||
|
skip_whitespace = true;
|
||||||
|
}
|
||||||
|
NodeEvent::Leave(RefNode::LineCompilerDirective(_)) => {
|
||||||
|
skip_whitespace = false;
|
||||||
}
|
}
|
||||||
NodeEvent::Enter(RefNode::KeywordsDirective(x)) => {
|
NodeEvent::Enter(RefNode::KeywordsDirective(x)) => {
|
||||||
let locate: Locate = x.try_into().unwrap();
|
let locate: Locate = x.try_into().unwrap();
|
||||||
let range = Range::new(locate.offset, locate.offset + locate.len);
|
let range = Range::new(locate.offset, locate.offset + locate.len);
|
||||||
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
||||||
|
skip_whitespace = true;
|
||||||
|
}
|
||||||
|
NodeEvent::Leave(RefNode::KeywordsDirective(_)) => {
|
||||||
|
skip_whitespace = false;
|
||||||
}
|
}
|
||||||
NodeEvent::Enter(RefNode::EndkeywordsDirective(x)) => {
|
NodeEvent::Enter(RefNode::EndkeywordsDirective(x)) => {
|
||||||
let locate: Locate = x.try_into().unwrap();
|
let locate: Locate = x.try_into().unwrap();
|
||||||
let range = Range::new(locate.offset, locate.offset + locate.len);
|
let range = Range::new(locate.offset, locate.offset + locate.len);
|
||||||
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
ret.push(locate.str(&s), Some((path.as_ref(), range)));
|
||||||
|
skip_whitespace = true;
|
||||||
|
}
|
||||||
|
NodeEvent::Leave(RefNode::EndkeywordsDirective(_)) => {
|
||||||
|
skip_whitespace = false;
|
||||||
}
|
}
|
||||||
NodeEvent::Enter(RefNode::UndefineCompilerDirective(x)) => {
|
NodeEvent::Enter(RefNode::UndefineCompilerDirective(x)) => {
|
||||||
skip_nodes.push(x.into());
|
skip_nodes.push(x.into());
|
||||||
@ -382,7 +427,7 @@ pub fn preprocess_str<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NodeEvent::Enter(RefNode::WhiteSpace(x)) if !strip_comments => {
|
NodeEvent::Enter(RefNode::WhiteSpace(x)) if !skip_whitespace && !strip_comments => {
|
||||||
if let WhiteSpace::Space(_) = x {
|
if let WhiteSpace::Space(_) = x {
|
||||||
let locate: Locate = x.try_into().unwrap();
|
let locate: Locate = x.try_into().unwrap();
|
||||||
let range = Range::new(locate.offset + locate.len, locate.offset + locate.len);
|
let range = Range::new(locate.offset + locate.len, locate.offset + locate.len);
|
||||||
@ -1340,6 +1385,8 @@ endmodule
|
|||||||
assert_eq!(ret.origin(80).unwrap().1, 60);
|
assert_eq!(ret.origin(80).unwrap().1, 60);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check that preprocess() doesn't introduce extra whitespace within and
|
||||||
|
// around compiler directives.
|
||||||
#[test]
|
#[test]
|
||||||
fn test21() {
|
fn test21() {
|
||||||
let include_paths = [get_testcase("")];
|
let include_paths = [get_testcase("")];
|
||||||
@ -1353,11 +1400,23 @@ endmodule
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
ret.text(),
|
ret.text(),
|
||||||
r##"// First comment
|
r##"//top
|
||||||
`default_nettype none
|
|
||||||
// Middle comment
|
|
||||||
`resetall
|
`resetall
|
||||||
// Last comment
|
`timescale 10 us / 100 ns
|
||||||
|
`default_nettype wire
|
||||||
|
//first
|
||||||
|
`default_nettype none//middle
|
||||||
|
//last
|
||||||
|
`unconnected_drive pull0
|
||||||
|
`unconnected_drive pull1
|
||||||
|
`nounconnected_drive
|
||||||
|
`celldefine
|
||||||
|
`endcelldefine
|
||||||
|
`pragma foo
|
||||||
|
`pragma foo bar
|
||||||
|
`line 5 "foo" 0
|
||||||
|
`begin_keywords "1800-2017"
|
||||||
|
`end_keywords
|
||||||
"##
|
"##
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,17 @@
|
|||||||
// First comment
|
//top
|
||||||
`default_nettype none
|
|
||||||
// Middle comment
|
|
||||||
`resetall
|
`resetall
|
||||||
// Last comment
|
`timescale 10 us / 100 ns
|
||||||
|
`default_nettype wire
|
||||||
|
//first
|
||||||
|
`default_nettype none//middle
|
||||||
|
//last
|
||||||
|
`unconnected_drive pull0
|
||||||
|
`unconnected_drive pull1
|
||||||
|
`nounconnected_drive
|
||||||
|
`celldefine
|
||||||
|
`endcelldefine
|
||||||
|
`pragma foo
|
||||||
|
`pragma foo bar
|
||||||
|
`line 5 "foo" 0
|
||||||
|
`begin_keywords "1800-2017"
|
||||||
|
`end_keywords
|
||||||
|
Loading…
x
Reference in New Issue
Block a user