code_moniker_workspace/linkage/
mod.rs1mod 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}