#[derive(Debug, Clone, PartialEq, Eq, Default, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "snake_case", tag = "kind", content = "module")]
pub enum TypeOrigin {
Local,
External(String),
Primitive,
#[default]
Unknown,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum ArmValue {
Str(String),
Int(i64),
Char(char),
Other,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, serde::Serialize, serde::Deserialize)]
pub struct TypeRef {
pub name: String,
pub raw: String,
pub origin: TypeOrigin,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct FunctionInfo {
pub name: String,
pub start_line: usize,
pub end_line: usize,
pub name_col: usize,
pub name_end_col: usize,
pub line_count: usize,
pub complexity: usize,
pub body_hash: Option<u64>,
pub is_exported: bool,
pub parameter_count: usize,
pub external_refs: Vec<String>,
pub chain_depth: usize,
pub switch_arms: usize,
pub switch_arm_values: Vec<ArmValue>,
pub is_delegating: bool,
pub parameter_types: Vec<TypeRef>,
pub parameter_names: Vec<String>,
pub comment_lines: usize,
pub referenced_fields: Vec<String>,
pub null_check_fields: Vec<String>,
pub switch_dispatch_target: Option<String>,
pub optional_param_count: usize,
pub called_functions: Vec<String>,
pub cognitive_complexity: usize,
pub return_type: Option<TypeRef>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ClassInfo {
pub name: String,
pub start_line: usize,
pub end_line: usize,
pub name_col: usize,
pub name_end_col: usize,
pub method_count: usize,
pub line_count: usize,
pub is_exported: bool,
pub delegating_method_count: usize,
pub field_count: usize,
pub field_names: Vec<String>,
pub field_types: Vec<String>,
pub has_behavior: bool,
pub is_interface: bool,
pub parent_name: Option<String>,
pub override_count: usize,
pub self_call_count: usize,
pub has_listener_field: bool,
pub has_notify_method: bool,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ImportInfo {
pub source: String,
pub line: usize,
pub col: usize,
pub is_module_decl: bool,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct CommentInfo {
pub text: String,
pub line: usize,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct SourceModel {
pub language: String,
pub total_lines: usize,
pub functions: Vec<FunctionInfo>,
pub classes: Vec<ClassInfo>,
pub imports: Vec<ImportInfo>,
pub comments: Vec<CommentInfo>,
pub type_aliases: Vec<(String, String)>,
}
#[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)]
pub struct SymbolIndex {
pub language: String,
pub total_lines: usize,
pub imports: Vec<ImportInfo>,
pub classes: Vec<ClassSymbol>,
pub functions: Vec<FunctionSymbol>,
pub type_aliases: Vec<(String, String)>,
}
#[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)]
pub struct ClassSymbol {
pub name: String,
pub parent_name: Option<String>,
pub is_interface: bool,
pub is_exported: bool,
pub method_count: usize,
pub has_behavior: bool,
pub field_names: Vec<String>,
pub field_types: Vec<String>,
pub start_line: usize,
pub end_line: usize,
pub name_col: usize,
pub name_end_col: usize,
}
#[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)]
pub struct FunctionSymbol {
pub name: String,
pub is_exported: bool,
pub parameter_count: usize,
pub called_functions: Vec<String>,
pub start_line: usize,
pub end_line: usize,
pub name_col: usize,
pub name_end_col: usize,
pub parameter_type_names: Vec<String>,
pub parameter_names: Vec<String>,
pub return_type_name: Option<String>,
pub switch_arm_values: Vec<ArmValue>,
}
impl SymbolIndex {
pub fn from_source_model(m: &SourceModel) -> Self {
Self {
language: m.language.clone(),
total_lines: m.total_lines,
imports: m.imports.clone(),
classes: m.classes.iter().map(ClassSymbol::from_class_info).collect(),
functions: m
.functions
.iter()
.map(FunctionSymbol::from_function_info)
.collect(),
type_aliases: m.type_aliases.clone(),
}
}
}
impl ClassSymbol {
pub fn from_class_info(c: &ClassInfo) -> Self {
Self {
name: c.name.clone(),
parent_name: c.parent_name.clone(),
is_interface: c.is_interface,
is_exported: c.is_exported,
method_count: c.method_count,
has_behavior: c.has_behavior,
field_names: c.field_names.clone(),
field_types: c.field_types.clone(),
start_line: c.start_line,
end_line: c.end_line,
name_col: c.name_col,
name_end_col: c.name_end_col,
}
}
}
impl FunctionSymbol {
pub fn from_function_info(f: &FunctionInfo) -> Self {
Self {
name: f.name.clone(),
is_exported: f.is_exported,
parameter_count: f.parameter_count,
called_functions: f.called_functions.clone(),
start_line: f.start_line,
end_line: f.end_line,
name_col: f.name_col,
name_end_col: f.name_end_col,
parameter_type_names: f.parameter_types.iter().map(|t| t.raw.clone()).collect(),
parameter_names: f.parameter_names.clone(),
return_type_name: f.return_type.as_ref().map(|t| t.raw.clone()),
switch_arm_values: f.switch_arm_values.clone(),
}
}
}