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]
17impl LspAdapter for DartLanguageServer {
18 fn name(&self) -> LanguageServerName {
19 LanguageServerName("dart".into())
20 }
21
22 fn short_name(&self) -> &'static str {
23 "dart"
24 }
25
26 async fn fetch_latest_server_version(
27 &self,
28 _: &dyn LspAdapterDelegate,
29 ) -> Result<Box<dyn 'static + Send + Any>> {
30 Ok(Box::new(()))
31 }
32
33 async fn fetch_server_binary(
34 &self,
35 _: Box<dyn 'static + Send + Any>,
36 _: PathBuf,
37 _: &dyn LspAdapterDelegate,
38 ) -> Result<LanguageServerBinary> {
39 Err(anyhow!("dart must me installed from dart.dev/get-dart"))
40 }
41
42 async fn cached_server_binary(
43 &self,
44 _: PathBuf,
45 _: &dyn LspAdapterDelegate,
46 ) -> Option<LanguageServerBinary> {
47 Some(LanguageServerBinary {
48 path: "dart".into(),
49 env: None,
50 arguments: vec!["language-server".into(), "--protocol=lsp".into()],
51 })
52 }
53
54 fn can_be_reinstalled(&self) -> bool {
55 false
56 }
57
58 async fn installation_test_binary(&self, _: PathBuf) -> Option<LanguageServerBinary> {
59 None
60 }
61
62 fn workspace_configuration(&self, _workspace_root: &Path, cx: &mut AppContext) -> Value {
63 let settings = ProjectSettings::get_global(cx)
64 .lsp
65 .get("dart")
66 .and_then(|s| s.settings.clone())
67 .unwrap_or_default();
68
69 serde_json::json!({
70 "dart": settings
71 })
72 }
73}