1use anyhow::{anyhow, Result};
2use async_trait::async_trait;
3use gpui::AppContext;
4use language::{LanguageServerName, LspAdapter, LspAdapterDelegate};
5use lsp::LanguageServerBinary;
6use project::project_settings::ProjectSettings;
7use serde_json::Value;
8use settings::Settings;
9use std::{
10 any::Any,
11 path::{Path, PathBuf},
12};
13
14pub struct DartLanguageServer;
15
16#[async_trait(?Send)]
17impl LspAdapter for DartLanguageServer {
18 fn name(&self) -> LanguageServerName {
19 LanguageServerName("dart".into())
20 }
21
22 async fn fetch_latest_server_version(
23 &self,
24 _: &dyn LspAdapterDelegate,
25 ) -> Result<Box<dyn 'static + Send + Any>> {
26 Ok(Box::new(()))
27 }
28
29 async fn fetch_server_binary(
30 &self,
31 _: Box<dyn 'static + Send + Any>,
32 _: PathBuf,
33 _: &dyn LspAdapterDelegate,
34 ) -> Result<LanguageServerBinary> {
35 Err(anyhow!("dart must me installed from dart.dev/get-dart"))
36 }
37
38 async fn cached_server_binary(
39 &self,
40 _: PathBuf,
41 _: &dyn LspAdapterDelegate,
42 ) -> Option<LanguageServerBinary> {
43 Some(LanguageServerBinary {
44 path: "dart".into(),
45 env: None,
46 arguments: vec!["language-server".into(), "--protocol=lsp".into()],
47 })
48 }
49
50 fn can_be_reinstalled(&self) -> bool {
51 false
52 }
53
54 async fn installation_test_binary(&self, _: PathBuf) -> Option<LanguageServerBinary> {
55 None
56 }
57
58 fn workspace_configuration(&self, _workspace_root: &Path, cx: &mut AppContext) -> Value {
59 let settings = ProjectSettings::get_global(cx)
60 .lsp
61 .get("dart")
62 .and_then(|s| s.settings.clone())
63 .unwrap_or_default();
64
65 serde_json::json!({
66 "dart": settings
67 })
68 }
69}