From 6fdc341ed7d587596f3f3519b0bf9088deffe5df Mon Sep 17 00:00:00 2001 From: dalance Date: Thu, 12 Dec 2019 18:49:01 +0900 Subject: [PATCH] Add include line check --- CHANGELOG.md | 2 ++ sv-parser-error/src/lib.rs | 2 ++ sv-parser-pp/src/preprocess.rs | 59 ++++++++++++++++++++++++++++++++ sv-parser-pp/testcases/test10.sv | 2 ++ sv-parser-pp/testcases/test9.sv | 3 ++ 5 files changed, 68 insertions(+) create mode 100644 sv-parser-pp/testcases/test10.sv create mode 100644 sv-parser-pp/testcases/test9.sv diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c1b812..9c77b64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased](https://github.com/dalance/sv-parser/compare/v0.4.18...Unreleased) - ReleaseDate +* [Added] include line check + ## [v0.4.18](https://github.com/dalance/sv-parser/compare/v0.4.17...v0.4.18) - 2019-12-12 ## [v0.4.17](https://github.com/dalance/sv-parser/compare/v0.4.16...v0.4.17) - 2019-12-12 diff --git a/sv-parser-error/src/lib.rs b/sv-parser-error/src/lib.rs index 22f3d65..f6e7372 100644 --- a/sv-parser-error/src/lib.rs +++ b/sv-parser-error/src/lib.rs @@ -26,6 +26,8 @@ pub enum ErrorKind { DefineNoArgs, #[fail(display = "Exceed recursive limit")] ExceedRecursiveLimit, + #[fail(display = "Include line can't have other items")] + IncludeLine, } // ----------------------------------------------------------------------------- diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index fac6543..add611b 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -140,6 +140,9 @@ pub fn preprocess_str, U: AsRef>( let mut skip_nodes = vec![]; let mut defines = HashMap::new(); + let mut last_item_line = None; + let mut last_include_line = None; + for (k, v) in pre_defines { defines.insert(k.clone(), (*v).clone()); } @@ -178,6 +181,33 @@ pub fn preprocess_str, U: AsRef>( } } } + match n.clone() { + NodeEvent::Enter(RefNode::SourceDescriptionNotDirective(x)) => { + let locate: Locate = x.try_into().unwrap(); + if let Some(last_include_line) = last_include_line { + if last_include_line == locate.line { + return Err(ErrorKind::IncludeLine.into()); + } + } + } + NodeEvent::Enter(RefNode::CompilerDirective(x)) => { + let locate: Locate = x.try_into().unwrap(); + if let Some(last_include_line) = last_include_line { + if last_include_line == locate.line { + return Err(ErrorKind::IncludeLine.into()); + } + } + } + NodeEvent::Leave(RefNode::SourceDescriptionNotDirective(x)) => { + let locate: Locate = x.try_into().unwrap(); + last_item_line = Some(locate.line); + } + NodeEvent::Leave(RefNode::CompilerDirective(x)) => { + let locate: Locate = x.try_into().unwrap(); + last_item_line = Some(locate.line); + } + _ => (), + } match n { NodeEvent::Enter(RefNode::ResetallCompilerDirective(_)) if !skip => {} NodeEvent::Enter(RefNode::UndefineCompilerDirective(x)) if !skip => { @@ -315,6 +345,15 @@ pub fn preprocess_str, U: AsRef>( defines.insert(id, Some(define)); } NodeEvent::Enter(RefNode::IncludeCompilerDirective(x)) if !skip => { + let locate: Locate = x.try_into().unwrap(); + last_include_line = Some(locate.line); + + if let Some(last_item_line) = last_item_line { + if last_item_line == locate.line { + return Err(ErrorKind::IncludeLine.into()); + } + } + let mut path = match x { IncludeCompilerDirective::DoubleQuote(x) => { let (_, _, ref literal) = x.nodes; @@ -722,4 +761,24 @@ endmodule "Err(Error { inner: \n\nExceed recursive limit })" ); } + + #[test] + fn test9() { + let include_paths = [get_testcase("")]; + let ret = preprocess(get_testcase("test9.sv"), &HashMap::new(), &include_paths); + assert_eq!( + format!("{:?}", ret), + "Err(Error { inner: \n\nInclude line can\'t have other items })" + ); + } + + #[test] + fn test10() { + let include_paths = [get_testcase("")]; + let ret = preprocess(get_testcase("test10.sv"), &HashMap::new(), &include_paths); + assert_eq!( + format!("{:?}", ret), + "Err(Error { inner: \n\nInclude line can\'t have other items })" + ); + } } diff --git a/sv-parser-pp/testcases/test10.sv b/sv-parser-pp/testcases/test10.sv new file mode 100644 index 0000000..8c2a37c --- /dev/null +++ b/sv-parser-pp/testcases/test10.sv @@ -0,0 +1,2 @@ +module and_op (a, b, c); +`include "test2.svh" endmodule diff --git a/sv-parser-pp/testcases/test9.sv b/sv-parser-pp/testcases/test9.sv new file mode 100644 index 0000000..ad10dda --- /dev/null +++ b/sv-parser-pp/testcases/test9.sv @@ -0,0 +1,3 @@ +module and_op (a, b, c); +`include "test2.svh" `include "test2.svh" +endmodule