use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) enum DeclKind {
Function,
Type,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct SpanFact {
pub line: u32,
pub col: u32,
pub end_line: u32,
pub end_col: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct DeclFact {
pub name: String,
pub kind: DeclKind,
pub span: SpanFact,
pub parent: Option<usize>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) enum CalleeFact {
Bare(String),
Attr { obj: String, name: String },
Method { class_decl: usize, name: String },
Opaque,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct CallFact {
pub callee: CalleeFact,
pub enclosing: Option<usize>,
pub span: SpanFact,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) enum ImportFact {
Whole { module: String, alias: String },
Named {
module: String,
name: String,
alias: String,
},
}
impl ImportFact {
pub(crate) fn module(&self) -> &str {
match self {
ImportFact::Whole { module, .. } | ImportFact::Named { module, .. } => module,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct TouchFact {
pub state: usize,
pub write: bool,
pub enclosing: Option<usize>,
pub via_import: Option<usize>,
pub span: SpanFact,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct ModFact {
pub name: String,
pub inline: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub(crate) struct FileFacts {
pub decls: Vec<DeclFact>,
pub calls: Vec<CallFact>,
pub imports: Vec<ImportFact>,
pub touches: Vec<TouchFact>,
#[serde(default)]
pub mods: Vec<ModFact>,
}