a3s_code_core/code_intelligence/
service.rs1use super::{
2 CodeDiagnostic, CodeIntelligenceResult, CodeIntelligenceStatus, CodeLocation, CodePosition,
3 CodeQueryResult, DocumentSymbol, NavigationKind, SymbolInformation,
4};
5use crate::workspace::WorkspacePath;
6use async_trait::async_trait;
7use tokio::sync::watch;
8use tokio_util::sync::CancellationToken;
9
10#[async_trait]
16pub trait WorkspaceCodeIntelligence: Send + Sync {
17 fn subscribe_status(&self) -> watch::Receiver<CodeIntelligenceStatus>;
19
20 fn status(&self) -> CodeIntelligenceStatus {
22 let receiver = self.subscribe_status();
23 let status = receiver.borrow().clone();
24 status
25 }
26
27 async fn document_symbols(
29 &self,
30 path: &WorkspacePath,
31 cancellation: CancellationToken,
32 ) -> CodeIntelligenceResult<CodeQueryResult<DocumentSymbol>>;
33
34 async fn search_symbols(
36 &self,
37 query: &str,
38 limit: usize,
39 cancellation: CancellationToken,
40 ) -> CodeIntelligenceResult<CodeQueryResult<SymbolInformation>>;
41
42 async fn navigate(
44 &self,
45 kind: NavigationKind,
46 path: &WorkspacePath,
47 position: CodePosition,
48 cancellation: CancellationToken,
49 ) -> CodeIntelligenceResult<CodeQueryResult<CodeLocation>>;
50
51 async fn diagnostics(
54 &self,
55 path: Option<&WorkspacePath>,
56 cancellation: CancellationToken,
57 ) -> CodeIntelligenceResult<CodeQueryResult<CodeDiagnostic>>;
58}
59
60#[cfg(test)]
61mod tests {
62 use super::*;
63
64 fn assert_send_sync<T: Send + Sync + ?Sized>() {}
65
66 #[test]
67 fn service_trait_is_object_safe_send_and_sync() {
68 assert_send_sync::<dyn WorkspaceCodeIntelligence>();
69 }
70}