use serde::{Deserialize, Serialize};
use std::path::PathBuf;
pub use crate::dataflow::available::Confidence;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct UncertainDef {
pub var: String,
pub line: u32,
pub reason: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DefUseChain {
pub definition: Definition,
pub uses: Vec<Use>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Definition {
pub var: String,
pub line: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub column: Option<u32>,
pub block: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_text: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Use {
pub line: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub column: Option<u32>,
pub block: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub context: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UseDefChain {
pub use_site: Use,
pub var: String,
pub reaching_defs: Vec<Definition>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UninitializedUse {
pub var: String,
pub line: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub column: Option<u32>,
pub block: usize,
pub reason: String,
pub severity: UninitSeverity,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum UninitSeverity {
Definite,
Possible,
}
impl std::fmt::Display for UninitSeverity {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
UninitSeverity::Definite => write!(f, "error"),
UninitSeverity::Possible => write!(f, "warning"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReachingDefsReport {
pub function: String,
pub file: PathBuf,
pub blocks: Vec<BlockReachingDefs>,
pub def_use_chains: Vec<DefUseChain>,
pub use_def_chains: Vec<UseDefChain>,
pub uninitialized: Vec<UninitializedUse>,
pub stats: ReachingDefsStats,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub uncertain_defs: Vec<UncertainDef>,
#[serde(default)]
pub confidence: Confidence,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BlockReachingDefs {
pub id: usize,
pub lines: (u32, u32),
pub gen: Vec<Definition>,
pub kill: Vec<Definition>,
#[serde(rename = "in")]
pub in_set: Vec<Definition>,
pub out: Vec<Definition>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ReachingDefsStats {
pub definitions: usize,
pub uses: usize,
pub blocks: usize,
pub iterations: usize,
pub uninitialized_count: usize,
}
impl Default for ReachingDefsReport {
fn default() -> Self {
ReachingDefsReport {
function: String::new(),
file: PathBuf::new(),
blocks: Vec::new(),
def_use_chains: Vec::new(),
use_def_chains: Vec::new(),
uninitialized: Vec::new(),
stats: ReachingDefsStats::default(),
uncertain_defs: Vec::new(),
confidence: Confidence::default(),
}
}
}