refactor(xatu): unify scope graph occurrence storage

This commit is contained in:
2026-09-26 15:11:26 -04:00
parent 4b388264ee
commit 3f6f7d33bc

View File

@@ -1,8 +1,7 @@
#[derive(Debug)] #[derive(Debug)]
pub struct ScopeGraph { pub struct ScopeGraph {
scopes: Vec<Scope>, scopes: Vec<Scope>,
declarations: Vec<Declaration>, occurrences: Vec<Occurrence>,
references: Vec<Reference>,
} }
impl Default for ScopeGraph { impl Default for ScopeGraph {
@@ -15,8 +14,7 @@ impl ScopeGraph {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
scopes: vec![Scope::new(None)], scopes: vec![Scope::new(None)],
declarations: Vec::new(), occurrences: Vec::new(),
references: Vec::new(),
} }
} }
@@ -34,22 +32,22 @@ impl ScopeGraph {
} }
pub fn add_declaration(&mut self, scope: ScopeId, name: impl Into<String>) -> DeclarationId { pub fn add_declaration(&mut self, scope: ScopeId, name: impl Into<String>) -> DeclarationId {
let declaration_id = DeclarationId(self.declarations.len()); let declaration_id = DeclarationId(self.occurrences.len());
self.declarations.push(Declaration { self.occurrences.push(Occurrence::Declaration(Declaration {
scope, scope,
name: name.into(), name: name.into(),
}); }));
self.scope_mut(scope).declarations.push(declaration_id); self.scope_mut(scope).declarations.push(declaration_id);
declaration_id declaration_id
} }
pub fn add_reference(&mut self, scope: ScopeId, name: impl Into<String>) -> ReferenceId { pub fn add_reference(&mut self, scope: ScopeId, name: impl Into<String>) -> ReferenceId {
let reference_id = ReferenceId(self.references.len()); let reference_id = ReferenceId(self.occurrences.len());
self.references.push(Reference { self.occurrences.push(Occurrence::Reference(Reference {
scope, scope,
name: name.into(), name: name.into(),
}); }));
self.scope_mut(scope).references.push(reference_id); self.scope_mut(scope).references.push(reference_id);
reference_id reference_id
@@ -108,11 +106,19 @@ impl ScopeGraph {
} }
fn declaration(&self, declaration: DeclarationId) -> &Declaration { fn declaration(&self, declaration: DeclarationId) -> &Declaration {
&self.declarations[declaration.0] let Occurrence::Declaration(declaration) = &self.occurrences[declaration.0] else {
unreachable!("declaration IDs point to declarations")
};
declaration
} }
fn reference(&self, reference: ReferenceId) -> &Reference { fn reference(&self, reference: ReferenceId) -> &Reference {
&self.references[reference.0] let Occurrence::Reference(reference) = &self.occurrences[reference.0] else {
unreachable!("reference IDs point to references")
};
reference
} }
} }
@@ -159,6 +165,12 @@ impl Scope {
} }
} }
#[derive(Debug)]
enum Occurrence {
Declaration(Declaration),
Reference(Reference),
}
#[derive(Debug)] #[derive(Debug)]
struct Declaration { struct Declaration {
scope: ScopeId, scope: ScopeId,