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