From f98cb6c5d7b7db2be81e0eb7d48541e9ce0530af Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 7 Feb 2023 17:47:20 +0100 Subject: [PATCH 1/5] improvement78 Testcase, plus String arg for Error:DefineNoArgs. --- sv-parser-error/src/lib.rs | 2 +- sv-parser-pp/src/preprocess.rs | 18 +++++++++++++++++- sv-parser-pp/testcases/err_DefineNoArgs.sv | 4 ++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 sv-parser-pp/testcases/err_DefineNoArgs.sv diff --git a/sv-parser-error/src/lib.rs b/sv-parser-error/src/lib.rs index d6f3ccf..f6a7a1a 100644 --- a/sv-parser-error/src/lib.rs +++ b/sv-parser-error/src/lib.rs @@ -34,7 +34,7 @@ pub enum Error { DefineNotFound(String), #[error("Define must have argument")] - DefineNoArgs, + DefineNoArgs(String), // String is the macro identifier. #[error("Exceed recursive limit")] ExceedRecursiveLimit, diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 58b7d34..f512b47 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -942,7 +942,7 @@ fn resolve_text_macro_usage, U: AsRef>( let mut arg_map = HashMap::new(); if !define.arguments.is_empty() && no_args { - return Err(Error::DefineNoArgs); + return Err(Error::DefineNoArgs(define.identifier.clone())); } for (i, (arg, default)) in define.arguments.iter().enumerate() { @@ -1065,6 +1065,22 @@ mod tests { ); } // }}} + #[test] + #[allow(non_snake_case)] + fn err_DefineNoArgs() { // {{{ + match preprocess_usualargs("err_DefineNoArgs.sv").unwrap_err() { + Error::DefineNoArgs(identifier) => { + assert_eq!( + identifier, + String::from("A") + ); + } + _ => { + panic!("Error::DefineNoArgs not raised."); + } + }; + } // }}} + #[test] #[allow(non_snake_case)] fn IEEE18002017_keywords_if2_13642005() { // {{{ diff --git a/sv-parser-pp/testcases/err_DefineNoArgs.sv b/sv-parser-pp/testcases/err_DefineNoArgs.sv new file mode 100644 index 0000000..e6ec824 --- /dev/null +++ b/sv-parser-pp/testcases/err_DefineNoArgs.sv @@ -0,0 +1,4 @@ + +`define A(a) +`A // Macro called without required argument. + From f0aa7c5a5c86eb06584fc109f7be347f8c8bb83b Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 7 Feb 2023 18:04:27 +0100 Subject: [PATCH 2/5] improvement78 Testcase for Error:DefineNotFound. --- sv-parser-pp/src/preprocess.rs | 16 ++++++++++++++++ sv-parser-pp/testcases/err_DefineNotFound.sv | 3 +++ 2 files changed, 19 insertions(+) create mode 100644 sv-parser-pp/testcases/err_DefineNotFound.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index f512b47..062a7b2 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1081,6 +1081,22 @@ mod tests { }; } // }}} + #[test] + #[allow(non_snake_case)] + fn err_DefineNotFound() { // {{{ + match preprocess_usualargs("err_DefineNotFound.sv").unwrap_err() { + Error::DefineNotFound(identifier) => { + assert_eq!( + identifier, + String::from("A") + ); + } + _ => { + panic!("Error::DefineNotFound not raised."); + } + }; + } // }}} + #[test] #[allow(non_snake_case)] fn IEEE18002017_keywords_if2_13642005() { // {{{ diff --git a/sv-parser-pp/testcases/err_DefineNotFound.sv b/sv-parser-pp/testcases/err_DefineNotFound.sv new file mode 100644 index 0000000..1ffd213 --- /dev/null +++ b/sv-parser-pp/testcases/err_DefineNotFound.sv @@ -0,0 +1,3 @@ + +`A // Macro called without definition. + From 1ee6215934535e51f060d98ed27c5b3c179da7bd Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 7 Feb 2023 18:30:59 +0100 Subject: [PATCH 3/5] improvement78 Testcase for Error:DefineArgNotFound. --- sv-parser-pp/src/preprocess.rs | 16 ++++++++++++++++ sv-parser-pp/testcases/err_DefineArgNotFound.sv | 5 +++++ 2 files changed, 21 insertions(+) create mode 100644 sv-parser-pp/testcases/err_DefineArgNotFound.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 062a7b2..91013b1 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1097,6 +1097,22 @@ mod tests { }; } // }}} + #[test] + #[allow(non_snake_case)] + fn err_DefineArgNotFound() { // {{{ + match preprocess_usualargs("err_DefineArgNotFound.sv").unwrap_err() { + Error::DefineArgNotFound(identifier) => { + assert_eq!( + identifier, + String::from("c") + ); + } + _ => { + panic!("Error::DefineArgNotFound not raised."); + } + }; + } // }}} + #[test] #[allow(non_snake_case)] fn IEEE18002017_keywords_if2_13642005() { // {{{ diff --git a/sv-parser-pp/testcases/err_DefineArgNotFound.sv b/sv-parser-pp/testcases/err_DefineArgNotFound.sv new file mode 100644 index 0000000..c2fe5c0 --- /dev/null +++ b/sv-parser-pp/testcases/err_DefineArgNotFound.sv @@ -0,0 +1,5 @@ +/* IEEE1800-2017 Clause 22.5.1 top of page 678 +*/ +`define MACRO1(a=5,b="B",c) $display(a,,b,,c); +`MACRO1(1) // Macro called without required argument `c`. + From ac2d169333cb562fdde734a6c238c440b2f2b7d7 Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 7 Feb 2023 18:57:08 +0100 Subject: [PATCH 4/5] improvement78 Add Error::ReadUtf8 with testcase. There are 6x LATIN1 bytes in a comment. --- sv-parser-error/src/lib.rs | 3 ++ sv-parser-pp/src/preprocess.rs | 44 +++++++++++++++++++------- sv-parser-pp/testcases/err_ReadUtf8.sv | 4 +++ 3 files changed, 40 insertions(+), 11 deletions(-) create mode 100644 sv-parser-pp/testcases/err_ReadUtf8.sv diff --git a/sv-parser-error/src/lib.rs b/sv-parser-error/src/lib.rs index f6a7a1a..3895cc3 100644 --- a/sv-parser-error/src/lib.rs +++ b/sv-parser-error/src/lib.rs @@ -15,6 +15,9 @@ pub enum Error { path: PathBuf, }, + #[error("File could not be read as UTF8: {0:?}")] + ReadUtf8(Option), + #[error("Include error")] Include { #[from] diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 91013b1..0bf18b6 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -149,18 +149,21 @@ fn preprocess_inner, U: AsRef, V: BuildHasher>( })?; let mut reader = BufReader::new(f); let mut s = String::new(); - reader.read_to_string(&mut s)?; - preprocess_str( - &s, - path, - pre_defines, - include_paths, - ignore_include, - strip_comments, - 0, // resolve_depth - include_depth, - ) + if let Err(_) = reader.read_to_string(&mut s) { + Err(Error::ReadUtf8(Some(PathBuf::from(path.as_ref())))) + } else { + preprocess_str( + &s, + path, + pre_defines, + include_paths, + ignore_include, + strip_comments, + 0, // resolve_depth + include_depth, + ) + } } struct SkipNodes<'a> { @@ -1113,6 +1116,25 @@ mod tests { }; } // }}} + #[test] + #[allow(non_snake_case)] + fn err_ReadUtf8() { // {{{ + match preprocess_usualargs("err_ReadUtf8.sv").unwrap_err() { + Error::ReadUtf8(path) => { + assert_eq!( + path, + Some(PathBuf::from(format!( + "{}/testcases/err_ReadUtf8.sv", + env::var("CARGO_MANIFEST_DIR").unwrap(), + ))) + ); + } + _ => { + panic!("Error::ReadUtf8 not raised."); + } + }; + } // }}} + #[test] #[allow(non_snake_case)] fn IEEE18002017_keywords_if2_13642005() { // {{{ diff --git a/sv-parser-pp/testcases/err_ReadUtf8.sv b/sv-parser-pp/testcases/err_ReadUtf8.sv new file mode 100644 index 0000000..f47cf3c --- /dev/null +++ b/sv-parser-pp/testcases/err_ReadUtf8.sv @@ -0,0 +1,4 @@ +// In the next comment, there are non-UTF8 bytes. +module M; +// Non-UTF8:XñòóôõöX +endmodule From a5d0c48b35cd80787928d466d0287e6c85d432ac Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 7 Feb 2023 19:17:57 +0100 Subject: [PATCH 5/5] improvement78 Remove `Option<>` wrapper from ReadUtf8 arg. There's no immediate usecase for distinguishing `Some`/`None`. --- sv-parser-error/src/lib.rs | 2 +- sv-parser-pp/src/preprocess.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sv-parser-error/src/lib.rs b/sv-parser-error/src/lib.rs index 3895cc3..56fd305 100644 --- a/sv-parser-error/src/lib.rs +++ b/sv-parser-error/src/lib.rs @@ -16,7 +16,7 @@ pub enum Error { }, #[error("File could not be read as UTF8: {0:?}")] - ReadUtf8(Option), + ReadUtf8(PathBuf), #[error("Include error")] Include { diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 0bf18b6..9a01eff 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -151,7 +151,7 @@ fn preprocess_inner, U: AsRef, V: BuildHasher>( let mut s = String::new(); if let Err(_) = reader.read_to_string(&mut s) { - Err(Error::ReadUtf8(Some(PathBuf::from(path.as_ref())))) + Err(Error::ReadUtf8(PathBuf::from(path.as_ref()))) } else { preprocess_str( &s, @@ -1123,10 +1123,10 @@ mod tests { Error::ReadUtf8(path) => { assert_eq!( path, - Some(PathBuf::from(format!( + PathBuf::from(format!( "{}/testcases/err_ReadUtf8.sv", env::var("CARGO_MANIFEST_DIR").unwrap(), - ))) + )) ); } _ => {