ppWhitespace Skip whitespace nodes attached to compiler directives.

This commit is contained in:
damc 2022-07-04 21:04:35 +02:00
parent 04b64992b9
commit e149c28445
2 changed files with 80 additions and 9 deletions

View File

@ -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
"## "##
); );
} }

View File

@ -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