1 //! Data structures representing a parsed test file.
2 //!
3 //! A test file is a `.clif` file which contains test commands and settings for running a
4 //! file-based test case.
5 //!
6 
7 use crate::error::Location;
8 use crate::isaspec::IsaSpec;
9 use crate::sourcemap::SourceMap;
10 use crate::testcommand::TestCommand;
11 use cranelift_codegen::ir::Function;
12 use cranelift_codegen::ir::entities::AnyEntity;
13 
14 /// A parsed test case.
15 ///
16 /// This is the result of parsing a `.clif` file which contains a number of test commands and ISA
17 /// specs followed by the functions that should be tested.
18 pub struct TestFile<'a> {
19     /// `test foo ...` lines.
20     pub commands: Vec<TestCommand<'a>>,
21     /// `isa bar ...` lines.
22     pub isa_spec: IsaSpec,
23     /// `feature ...` lines
24     pub features: Vec<Feature<'a>>,
25     /// Comments appearing before the first function.
26     /// These are all tagged as 'Function' scope for lack of a better entity.
27     pub preamble_comments: Vec<Comment<'a>>,
28     /// Parsed functions and additional details about each function.
29     pub functions: Vec<(Function, Details<'a>)>,
30 }
31 
32 /// Additional details about a function parsed from a text string.
33 /// These are useful for detecting test commands embedded in comments etc.
34 /// The details to not affect the semantics of the function.
35 #[derive(Debug)]
36 pub struct Details<'a> {
37     /// Location of the `function` keyword that begins this function.
38     pub location: Location,
39     /// Annotation comments that appeared inside or after the function.
40     pub comments: Vec<Comment<'a>>,
41     /// Mapping of entity numbers to source locations.
42     pub map: SourceMap,
43 }
44 
45 /// A comment in a parsed function.
46 ///
47 /// The comment belongs to the immediately preceding entity, whether that is a block header, and
48 /// instruction, or one of the preamble declarations.
49 ///
50 /// Comments appearing inside the function but before the preamble, as well as comments appearing
51 /// after the function are tagged as `AnyEntity::Function`.
52 #[derive(Clone, PartialEq, Eq, Debug)]
53 pub struct Comment<'a> {
54     /// The entity this comment is attached to.
55     /// Comments always follow their entity.
56     pub entity: AnyEntity,
57     /// Text of the comment, including the leading `;`.
58     pub text: &'a str,
59 }
60 
61 /// A cranelift feature in a test file preamble.
62 ///
63 /// This represents the expectation of the test case. Before running any of the
64 /// functions of the test file, the feature set should be compared with the
65 /// feature set used to compile Cranelift. If there is any differences, then the
66 /// test file should be skipped.
67 #[derive(PartialEq, Eq, Debug)]
68 pub enum Feature<'a> {
69     /// `feature "..."` lines
70     With(&'a str),
71     /// `feature ! "..."` lines.
72     Without(&'a str),
73 }
74