use std::collections::HashMap;
use brink_format::{DefinitionId, DefinitionTag};
use rowan::TextRange;
use crate::FileId;
#[derive(Debug, Clone, Default)]
pub struct SymbolIndex {
pub symbols: HashMap<DefinitionId, SymbolInfo>,
pub by_name: HashMap<String, Vec<DefinitionId>>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SymbolInfo {
pub kind: SymbolKind,
pub file: FileId,
pub range: TextRange,
pub id: DefinitionId,
pub name: String,
pub params: Vec<ParamInfo>,
pub detail: Option<String>,
pub scope: Option<Scope>,
pub param_detail: Option<ParamInfo>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ParamInfo {
pub name: String,
pub is_ref: bool,
pub is_divert: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SymbolKind {
Knot,
Stitch,
Variable,
Constant,
List,
ListItem,
External,
Label,
Param,
Temp,
}
impl SymbolKind {
pub fn definition_tag(self) -> DefinitionTag {
match self {
Self::Knot | Self::Stitch | Self::Label => DefinitionTag::Address,
Self::Variable | Self::Constant => DefinitionTag::GlobalVar,
Self::List => DefinitionTag::ListDef,
Self::ListItem => DefinitionTag::ListItem,
Self::External => DefinitionTag::ExternalFn,
Self::Param | Self::Temp => DefinitionTag::LocalVar,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ResolvedRef {
pub file: FileId,
pub range: TextRange,
pub target: DefinitionId,
}
pub type ResolutionMap = Vec<ResolvedRef>;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct Scope {
pub knot: Option<String>,
pub stitch: Option<String>,
}