11use std:: fs;
22use zed:: lsp:: CompletionKind ;
33use zed:: { CodeLabel , CodeLabelSpan , LanguageServerId } ;
4- use zed_extension_api:: { self as zed, Result } ;
4+ use zed_extension_api:: settings:: LspSettings ;
5+ use zed_extension_api:: { self as zed, Command , Result } ;
56
67struct EmmyLuaExtension {
78 cached_binary_path : Option < String > ,
@@ -13,7 +14,14 @@ impl EmmyLuaExtension {
1314 language_server_id : & LanguageServerId ,
1415 worktree : & zed:: Worktree ,
1516 ) -> Result < String > {
16- // First check if emmylua is in PATH
17+ if let Ok ( lsp_settings) = LspSettings :: for_worktree ( "emmylua" , worktree) {
18+ if let Some ( binary) = lsp_settings. binary {
19+ if let Some ( path) = binary. path {
20+ return Ok ( path) ;
21+ }
22+ }
23+ }
24+
1725 if let Some ( path) = worktree. which ( "emmylua_ls" ) {
1826 return Ok ( path) ;
1927 }
@@ -33,7 +41,7 @@ impl EmmyLuaExtension {
3341 language_server_id,
3442 & zed:: LanguageServerInstallationStatus :: CheckingForUpdate ,
3543 ) ;
36-
44+
3745 let release = zed:: latest_github_release (
3846 "EmmyLuaLs/emmylua-analyzer-rust" ,
3947 zed:: GithubReleaseOptions {
@@ -126,10 +134,24 @@ impl zed::Extension for EmmyLuaExtension {
126134 language_server_id : & LanguageServerId ,
127135 worktree : & zed:: Worktree ,
128136 ) -> Result < zed:: Command > {
137+ let mut env = worktree. shell_env ( ) ;
138+ let mut args = Default :: default ( ) ;
139+
140+ if let Ok ( lsp_settings) = LspSettings :: for_worktree ( "emmylua" , worktree) {
141+ if let Some ( binary) = lsp_settings. binary {
142+ if let Some ( binary_arguments) = binary. arguments {
143+ args = binary_arguments;
144+ }
145+ if let Some ( binary_env) = binary. env {
146+ env. extend ( binary_env) ;
147+ }
148+ }
149+ }
150+
129151 Ok ( zed:: Command {
130152 command : self . language_server_binary_path ( language_server_id, worktree) ?,
131- args : Default :: default ( ) ,
132- env : Default :: default ( ) ,
153+ args,
154+ env,
133155 } )
134156 }
135157
@@ -139,7 +161,7 @@ impl zed::Extension for EmmyLuaExtension {
139161 completion : zed:: lsp:: Completion ,
140162 ) -> Option < CodeLabel > {
141163 let name = & completion. label ;
142-
164+
143165 match completion. kind ? {
144166 CompletionKind :: Method | CompletionKind :: Function => {
145167 let name_len = name. find ( '(' ) . unwrap_or ( name. len ( ) ) ;
@@ -166,26 +188,17 @@ impl zed::Extension for EmmyLuaExtension {
166188 code : Default :: default ( ) ,
167189 } ) ,
168190 CompletionKind :: Class => Some ( CodeLabel {
169- spans : vec ! [ CodeLabelSpan :: literal(
170- name. clone( ) ,
171- Some ( "type" . into( ) ) ,
172- ) ] ,
191+ spans : vec ! [ CodeLabelSpan :: literal( name. clone( ) , Some ( "type" . into( ) ) ) ] ,
173192 filter_range : ( 0 ..name. len ( ) ) . into ( ) ,
174193 code : Default :: default ( ) ,
175194 } ) ,
176195 CompletionKind :: Module => Some ( CodeLabel {
177- spans : vec ! [ CodeLabelSpan :: literal(
178- name. clone( ) ,
179- Some ( "module" . into( ) ) ,
180- ) ] ,
196+ spans : vec ! [ CodeLabelSpan :: literal( name. clone( ) , Some ( "module" . into( ) ) ) ] ,
181197 filter_range : ( 0 ..name. len ( ) ) . into ( ) ,
182198 code : Default :: default ( ) ,
183199 } ) ,
184200 CompletionKind :: Keyword => Some ( CodeLabel {
185- spans : vec ! [ CodeLabelSpan :: literal(
186- name. clone( ) ,
187- Some ( "keyword" . into( ) ) ,
188- ) ] ,
201+ spans : vec ! [ CodeLabelSpan :: literal( name. clone( ) , Some ( "keyword" . into( ) ) ) ] ,
189202 filter_range : ( 0 ..name. len ( ) ) . into ( ) ,
190203 code : Default :: default ( ) ,
191204 } ) ,
@@ -199,7 +212,7 @@ impl zed::Extension for EmmyLuaExtension {
199212 symbol : zed:: lsp:: Symbol ,
200213 ) -> Option < CodeLabel > {
201214 let name = & symbol. name ;
202-
215+
203216 match symbol. kind {
204217 zed:: lsp:: SymbolKind :: Method | zed:: lsp:: SymbolKind :: Function => {
205218 let code = format ! ( "function {}()" , name) ;
@@ -210,33 +223,24 @@ impl zed::Extension for EmmyLuaExtension {
210223 code,
211224 } )
212225 }
213- zed:: lsp:: SymbolKind :: Class | zed:: lsp:: SymbolKind :: Module => {
214- Some ( CodeLabel {
215- spans : vec ! [ CodeLabelSpan :: literal(
216- name. clone( ) ,
217- Some ( "type" . into( ) ) ,
218- ) ] ,
219- filter_range : ( 0 ..name. len ( ) ) . into ( ) ,
220- code : name. clone ( ) ,
221- } )
222- }
223- zed:: lsp:: SymbolKind :: Variable | zed:: lsp:: SymbolKind :: Constant => {
224- Some ( CodeLabel {
225- spans : vec ! [ CodeLabelSpan :: literal(
226- name. clone( ) ,
227- Some ( "variable" . into( ) ) ,
228- ) ] ,
229- filter_range : ( 0 ..name. len ( ) ) . into ( ) ,
230- code : name. clone ( ) ,
231- } )
232- }
233- _ => {
234- Some ( CodeLabel {
235- spans : vec ! [ CodeLabelSpan :: code_range( 0 ..name. len( ) ) ] ,
236- filter_range : ( 0 ..name. len ( ) ) . into ( ) ,
237- code : name. clone ( ) ,
238- } )
239- }
226+ zed:: lsp:: SymbolKind :: Class | zed:: lsp:: SymbolKind :: Module => Some ( CodeLabel {
227+ spans : vec ! [ CodeLabelSpan :: literal( name. clone( ) , Some ( "type" . into( ) ) ) ] ,
228+ filter_range : ( 0 ..name. len ( ) ) . into ( ) ,
229+ code : name. clone ( ) ,
230+ } ) ,
231+ zed:: lsp:: SymbolKind :: Variable | zed:: lsp:: SymbolKind :: Constant => Some ( CodeLabel {
232+ spans : vec ! [ CodeLabelSpan :: literal(
233+ name. clone( ) ,
234+ Some ( "variable" . into( ) ) ,
235+ ) ] ,
236+ filter_range : ( 0 ..name. len ( ) ) . into ( ) ,
237+ code : name. clone ( ) ,
238+ } ) ,
239+ _ => Some ( CodeLabel {
240+ spans : vec ! [ CodeLabelSpan :: code_range( 0 ..name. len( ) ) ] ,
241+ filter_range : ( 0 ..name. len ( ) ) . into ( ) ,
242+ code : name. clone ( ) ,
243+ } ) ,
240244 }
241245 }
242246
0 commit comments