Skip to main content

code_moniker_workspace/linkage/
mod.rs

1mod binding;
2mod catalog;
3mod change;
4mod language;
5mod resolve;
6mod source_groups;
7
8use std::sync::Arc;
9use std::time::Duration;
10
11use crate::linkage::binding::LinkageStore;
12use crate::linkage::catalog::CandidateCatalog;
13use crate::linkage::change::run_refresh_linkage_with_timings;
14use crate::linkage::resolve::{MethodIndexer, run_full_linkage_with_timings};
15use crate::snapshot::{
16	CodeIndex, LinkageSnapshot, WorkspaceFailure, WorkspaceResource, WorkspaceResult,
17};
18use crate::source::{CodeIndexMaterial, LocalResourceCache};
19
20pub use binding::LinkageMemoryMetrics;
21pub use change::{LinkageGraphDelta, LinkageRefreshImpact};
22
23pub trait LinkagePort {
24	fn resolve_linkage(&mut self, index: &CodeIndex) -> WorkspaceResult<LinkageSnapshot>;
25	fn refresh_linkage(
26		&mut self,
27		current: &LinkageSnapshot,
28		index: &CodeIndex,
29		impact: LinkageRefreshImpact,
30	) -> WorkspaceResult<LinkageSnapshot>;
31}
32
33#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
34pub struct LinkageTimings {
35	pub candidate_index: Duration,
36	pub manifest_policy: Duration,
37	pub resolve_references: Duration,
38	pub semantic_enhance: Duration,
39	pub store_index: Duration,
40	pub project_snapshot: Duration,
41	pub total: Duration,
42}
43
44pub struct TimedLinkageSnapshot {
45	pub snapshot: LinkageSnapshot,
46	pub timings: LinkageTimings,
47	pub memory: LinkageMemoryMetrics,
48}
49
50#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
51pub struct LinkageRefreshTimings {
52	pub candidate_index: Duration,
53	pub plan_invalidation: Duration,
54	pub resolve_references: Duration,
55	pub apply_store: Duration,
56	pub semantic_enhance: Duration,
57	pub rebuild_indexes: Duration,
58	pub project_snapshot: Duration,
59	pub total: Duration,
60	pub stale_refs: usize,
61	pub changed_refs: usize,
62}
63
64pub struct TimedLinkageRefresh {
65	pub snapshot: LinkageSnapshot,
66	pub timings: LinkageRefreshTimings,
67	pub memory: LinkageMemoryMetrics,
68}
69
70pub struct LocalLinkage {
71	pub(in crate::linkage) cache: LocalResourceCache,
72	pub(in crate::linkage) store: Option<LinkageStore>,
73	pub(in crate::linkage) candidates: Option<CandidateCatalog>,
74	pub(in crate::linkage) method_indexer: Option<MethodIndexer>,
75	pub(in crate::linkage) memory: LinkageMemoryMetrics,
76}
77
78impl LocalLinkage {
79	pub fn new(cache: LocalResourceCache) -> Self {
80		Self {
81			cache,
82			store: None,
83			candidates: None,
84			method_indexer: None,
85			memory: LinkageMemoryMetrics::default(),
86		}
87	}
88
89	pub(in crate::linkage) fn linkage_material(
90		&self,
91		index: &CodeIndex,
92	) -> WorkspaceResult<Arc<CodeIndexMaterial>> {
93		self.cache.index_material(index.generation).ok_or_else(|| {
94			WorkspaceFailure::new(
95				WorkspaceResource::LinkageSnapshot,
96				"code index material is unavailable",
97			)
98		})
99	}
100
101	pub fn refresh_linkage_with_timings(
102		&mut self,
103		previous: &LinkageSnapshot,
104		code_index: &CodeIndex,
105		refresh_impact: LinkageRefreshImpact,
106	) -> WorkspaceResult<TimedLinkageRefresh> {
107		run_refresh_linkage_with_timings(self, previous, code_index, refresh_impact)
108	}
109
110	pub fn resolve_linkage_with_timings(
111		&mut self,
112		index: &CodeIndex,
113	) -> WorkspaceResult<TimedLinkageSnapshot> {
114		run_full_linkage_with_timings(self, index)
115	}
116}
117
118impl LinkagePort for LocalLinkage {
119	fn resolve_linkage(&mut self, index: &CodeIndex) -> WorkspaceResult<LinkageSnapshot> {
120		Ok(self.resolve_linkage_with_timings(index)?.snapshot)
121	}
122
123	fn refresh_linkage(
124		&mut self,
125		snapshot: &LinkageSnapshot,
126		indexed: &CodeIndex,
127		change: LinkageRefreshImpact,
128	) -> WorkspaceResult<LinkageSnapshot> {
129		Ok(self
130			.refresh_linkage_with_timings(snapshot, indexed, change)?
131			.snapshot)
132	}
133}