| // Copyright 2023 Google LLC | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // https://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| //! PDL parser and analyzer. | |
| pub mod analyzer; | |
| pub mod ast; | |
| pub mod backends; | |
| pub mod parser; | |
| #[cfg(test)] | |
| pub mod test_utils; | |
| #[cfg(test)] | |
| mod test { | |
| use super::*; | |
| #[test] | |
| fn rust_no_allocation_output_is_deterministic() { | |
| // The generated code should be deterministic, to avoid unnecessary rebuilds during | |
| // incremental builds. | |
| let src = r#" | |
| little_endian_packets | |
| enum Enum1 : 8 { | |
| ENUM_VARIANT_ONE = 0x01, | |
| ENUM_VARIANT_TWO = 0x02, | |
| } | |
| packet Packet1 { | |
| opcode : Enum1, | |
| _payload_, | |
| } | |
| struct Struct1 { | |
| handle : 16, | |
| } | |
| struct Struct2 { | |
| _payload_ | |
| } | |
| struct Struct3 { | |
| handle : Struct1, | |
| value : Struct2, | |
| } | |
| packet Packet2 : Packet1(opcode = ENUM_VARIANT_ONE) { | |
| handle : Struct1, | |
| value : Struct2, | |
| } | |
| "# | |
| .to_owned(); | |
| let mut sources1 = ast::SourceDatabase::new(); | |
| let mut sources2 = ast::SourceDatabase::new(); | |
| let mut sources3 = ast::SourceDatabase::new(); | |
| let file1 = parser::parse_inline(&mut sources1, "foo", src.clone()).unwrap(); | |
| let file2 = parser::parse_inline(&mut sources2, "foo", src.clone()).unwrap(); | |
| let file3 = parser::parse_inline(&mut sources3, "foo", src).unwrap(); | |
| let schema1 = backends::intermediate::generate(&file1).unwrap(); | |
| let schema2 = backends::intermediate::generate(&file2).unwrap(); | |
| let schema3 = backends::intermediate::generate(&file3).unwrap(); | |
| let result1 = backends::rust_no_allocation::generate(&file1, &schema1).unwrap(); | |
| let result2 = backends::rust_no_allocation::generate(&file2, &schema2).unwrap(); | |
| let result3 = backends::rust_no_allocation::generate(&file3, &schema3).unwrap(); | |
| assert_eq!(result1, result2); | |
| assert_eq!(result2, result3); | |
| } | |
| } |