7
7
use std:: { env, fs} ;
8
8
9
9
use zed:: settings:: LspSettings ;
10
- use zed_extension_api:: { self as zed, LanguageServerId , Result } ;
10
+ use zed_extension_api:: { self as zed, Command , ContextServerId , LanguageServerId , Project , Result } ;
11
11
12
- const NPM_PKG_NAME : & str = "vscode-gem-languageservice" ;
12
+ const LS_PKG_NAME : & str = "vscode-gem-languageservice" ;
13
13
const LS_BIN_PATH : & str = "node_modules/.bin/vscode-gem-languageservice" ;
14
14
15
+ const MC_PKG_NAME : & str = "gem-context-server" ;
16
+ const MC_BIN_PATH : & str = "node_modules/.bin/gem-context-server" ;
17
+
15
18
#[ derive( Default ) ]
16
19
struct GemExtension {
17
- did_find_server : bool ,
20
+ ls_server_find : bool ,
18
21
}
19
22
20
23
impl GemExtension {
21
- fn server_exists ( & self ) -> bool {
24
+ fn ls_exists ( & self ) -> bool {
22
25
fs:: metadata ( LS_BIN_PATH ) . is_ok_and ( |stat| stat. is_file ( ) )
23
26
}
24
27
25
- fn server_script_path ( & mut self , language_server_id : & zed :: LanguageServerId ) -> Result < String > {
26
- let server_exists = self . server_exists ( ) ;
27
- if self . did_find_server && server_exists {
28
+ fn ls_path ( & mut self , language_server_id : & LanguageServerId ) -> Result < String > {
29
+ let server_exists = self . ls_exists ( ) ;
30
+ if self . ls_server_find && server_exists {
28
31
return Ok ( LS_BIN_PATH . to_string ( ) ) ;
29
32
}
30
33
31
34
zed:: set_language_server_installation_status (
32
35
language_server_id,
33
36
& zed:: LanguageServerInstallationStatus :: CheckingForUpdate ,
34
37
) ;
35
- let version = zed:: npm_package_latest_version ( NPM_PKG_NAME ) ?;
38
+ let version = zed:: npm_package_latest_version ( LS_PKG_NAME ) ?;
36
39
37
40
if !server_exists
38
- || zed:: npm_package_installed_version ( NPM_PKG_NAME ) ?. as_ref ( ) != Some ( & version)
41
+ || zed:: npm_package_installed_version ( LS_PKG_NAME ) ?. as_ref ( ) != Some ( & version)
39
42
{
40
43
zed:: set_language_server_installation_status (
41
44
language_server_id,
42
45
& zed:: LanguageServerInstallationStatus :: Downloading ,
43
46
) ;
44
- let result = zed:: npm_install_package ( NPM_PKG_NAME , & version) ;
47
+ let result = zed:: npm_install_package ( LS_PKG_NAME , & version) ;
45
48
match result {
46
49
Ok ( ( ) ) => {
47
- if !self . server_exists ( ) {
50
+ if !self . ls_exists ( ) {
48
51
Err ( format ! (
49
- "installed package '{NPM_PKG_NAME }' did not contain expected path \
52
+ "installed package '{LS_PKG_NAME }' did not contain expected path \
50
53
'{LS_BIN_PATH}'",
51
54
) ) ?;
52
55
}
53
56
}
54
57
Err ( error) => {
55
- if !self . server_exists ( ) {
58
+ if !self . ls_exists ( ) {
56
59
Err ( error) ?;
57
60
}
58
61
}
59
62
}
60
63
}
61
64
62
- self . did_find_server = true ;
65
+ self . ls_server_find = true ;
63
66
Ok ( LS_BIN_PATH . to_string ( ) )
64
67
}
65
68
}
@@ -69,12 +72,33 @@ impl zed::Extension for GemExtension {
69
72
Self :: default ( )
70
73
}
71
74
75
+ fn context_server_command (
76
+ & mut self ,
77
+ _context_server_id : & ContextServerId ,
78
+ _project : & Project ,
79
+ ) -> Result < Command > {
80
+ let version = zed:: npm_package_latest_version ( MC_PKG_NAME ) ?;
81
+ if zed:: npm_package_installed_version ( MC_PKG_NAME ) ?. as_ref ( ) != Some ( & version) {
82
+ zed:: npm_install_package ( MC_PKG_NAME , & version) ?;
83
+ }
84
+
85
+ Ok ( Command {
86
+ command : zed:: node_binary_path ( ) ?,
87
+ args : vec ! [ env:: current_dir( )
88
+ . unwrap( )
89
+ . join( MC_BIN_PATH )
90
+ . to_string_lossy( )
91
+ . to_string( ) ] ,
92
+ env : Default :: default ( ) ,
93
+ } )
94
+ }
95
+
72
96
fn language_server_command (
73
97
& mut self ,
74
98
language_server_id : & LanguageServerId ,
75
99
_worktree : & zed:: Worktree ,
76
100
) -> Result < zed:: Command > {
77
- let server_path = self . server_script_path ( language_server_id) ?;
101
+ let server_path = self . ls_path ( language_server_id) ?;
78
102
Ok ( zed:: Command {
79
103
command : zed:: node_binary_path ( ) ?,
80
104
args : vec ! [
0 commit comments