//! Metadata from source code coverage analysis and instrumentation. use rustc_macros::HashStable; use rustc_span::Symbol; use std::cmp::Ord; use std::fmt::{self, Debug, Formatter}; rustc_index::newtype_index! { pub struct ExpressionOperandId { derive [HashStable] DEBUG_FORMAT = "ExpressionOperandId({})", MAX = 0xFFFF_FFFF, } } rustc_index::newtype_index! { pub struct CounterValueReference { derive [HashStable] DEBUG_FORMAT = "CounterValueReference({})", MAX = 0xFFFF_FFFF, } } rustc_index::newtype_index! { pub struct InjectedExpressionIndex { derive [HashStable] DEBUG_FORMAT = "InjectedExpressionIndex({})", MAX = 0xFFFF_FFFF, } } rustc_index::newtype_index! { pub struct MappedExpressionIndex { derive [HashStable] DEBUG_FORMAT = "MappedExpressionIndex({})", MAX = 0xFFFF_FFFF, } } impl From for ExpressionOperandId { #[inline] fn from(v: CounterValueReference) -> ExpressionOperandId { ExpressionOperandId::from(v.as_u32()) } } impl From for ExpressionOperandId { #[inline] fn from(v: InjectedExpressionIndex) -> ExpressionOperandId { ExpressionOperandId::from(v.as_u32()) } } #[derive(Clone, Debug, PartialEq, TyEncodable, TyDecodable, HashStable, TypeFoldable)] pub enum CoverageKind { Counter { function_source_hash: u64, id: CounterValueReference, }, Expression { id: InjectedExpressionIndex, lhs: ExpressionOperandId, op: Op, rhs: ExpressionOperandId, }, Unreachable, } impl CoverageKind { pub fn as_operand_id(&self) -> ExpressionOperandId { match *self { CoverageKind::Counter { id, .. } => ExpressionOperandId::from(id), CoverageKind::Expression { id, .. } => ExpressionOperandId::from(id), CoverageKind::Unreachable => { bug!("Unreachable coverage cannot be part of an expression") } } } } #[derive(Clone, TyEncodable, TyDecodable, HashStable, TypeFoldable, PartialEq, Eq, PartialOrd, Ord)] pub struct CodeRegion { pub file_name: Symbol, pub start_line: u32, pub start_col: u32, pub end_line: u32, pub end_col: u32, } impl Debug for CodeRegion { fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result { write!( fmt, "{}:{}:{} - {}:{}", self.file_name, self.start_line, self.start_col, self.end_line, self.end_col ) } } #[derive(Copy, Clone, Debug, PartialEq, TyEncodable, TyDecodable, HashStable, TypeFoldable)] pub enum Op { Subtract, Add, }