use serde::Deserialize;
use serde::Serialize;
use super::visibility_constraint::StoredVisibilityConstraint;
use crate::config::DiagnosticCode;
use crate::reporting::AllFeaturesCoverage;
use crate::reporting::CompilerWarningFacts;
use crate::reporting::ExactBoundarySpelling;
use crate::reporting::FixSupport;
use crate::reporting::Severity;
#[derive(Debug, Serialize, Deserialize)]
pub(in crate::compiler) struct StoredReport {
pub version: u32,
#[serde(default)]
pub analysis_fingerprint: String,
#[serde(default)]
pub scope_fingerprint: String,
pub package_root: String,
#[serde(default)]
pub crate_root_file: String,
pub config_fingerprint: String,
#[serde(default)]
pub source_files: Vec<String>,
pub findings: Vec<StoredFinding>,
#[serde(default)]
pub visibility_constraints: Vec<StoredVisibilityConstraint>,
#[serde(default)]
pub pub_use_fix_facts: Vec<StoredPubUseFixFact>,
#[serde(default)]
pub all_features_coverage: AllFeaturesCoverage,
#[serde(default, rename = "compiler_warnings")]
pub compiler_warning_facts: CompilerWarningFacts,
#[serde(default)]
pub use_sites: Vec<UseSite>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub(in crate::compiler) enum UseSiteReference {
Named,
ThroughSignature,
PrivateImport,
RestrictedImport,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub(in crate::compiler) struct UseSite {
pub target_def_path: String,
pub caller_module_def_path: String,
pub reference: UseSiteReference,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(in crate::compiler) struct StoredFinding {
pub severity: Severity,
pub diagnostic_code: DiagnosticCode,
pub path: String,
pub line: usize,
pub column: usize,
pub highlight_len: usize,
pub source_line: String,
pub item: Option<String>,
pub message: String,
pub suggestion: Option<String>,
#[serde(default, rename = "fixability")]
pub fix_support: FixSupport,
#[serde(default)]
pub related: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub visibility_annotation: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub item_def_path: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub narrower_scope_def_path: Option<String>,
#[serde(default)]
pub exact_boundary_spelling: ExactBoundarySpelling,
}
impl StoredFinding {
pub(in crate::compiler) fn render_item(kind_label: &str, name: &str) -> String {
format!("{kind_label} {name}")
}
pub(in crate::compiler) fn item_name(item: &str) -> &str {
item.rsplit_once(' ').map_or(item, |(_, name)| name)
}
}
#[derive(Debug, Serialize, Deserialize)]
pub(in crate::compiler) struct StoredPubUseFixFact {
pub child_path: String,
pub child_line: usize,
pub child_item_name: String,
pub parent_path: String,
pub parent_line: usize,
pub child_module: String,
}