77#include " CodeService/LuaCodeStyleOptions.h"
88#include " CodeService/LuaFormatter.h"
99#include " CodeFormatServer/LanguageClient.h"
10+ #include " CodeFormatServer/Service/CodeFormatService.h"
1011#include " Util/Url.h"
1112
1213using namespace std ::placeholders;
@@ -48,6 +49,8 @@ std::shared_ptr<vscode::Serializable> LanguageService::Dispatch(std::string_view
4849
4950std::shared_ptr<vscode::InitializeResult> LanguageService::OnInitialize (std::shared_ptr<vscode::InitializeParams> param)
5051{
52+ LanguageClient::GetInstance ().InitializeService ();
53+
5154 auto result = std::make_shared<vscode::InitializeResult>();
5255
5356 result->capabilities .documentFormattingProvider = true ;
@@ -160,11 +163,10 @@ std::shared_ptr<vscode::Serializable> LanguageService::OnFormatting(
160163 return result;
161164 }
162165
163- LuaFormatter formatter (parser, *options);
164- formatter.BuildFormattedElement ();
166+ auto newText = LanguageClient::GetInstance ().GetService <CodeFormatService>()->Format (parser, options);
165167
166168 auto & edit = result->edits .emplace_back ();
167- edit.newText = formatter. GetFormattedText ( );
169+ edit.newText = std::move (newText );
168170 edit.range = vscode::Range (
169171 vscode::Position (0 , 0 ),
170172 vscode::Position (totalLine + 1 , 0 )
@@ -218,16 +220,15 @@ std::shared_ptr<vscode::Serializable> LanguageService::OnRangeFormatting(
218220 return result;
219221 }
220222
221- auto & edit = result->edits .emplace_back ();
222- LuaFormatRange formattedRange (static_cast <int >(param->range .start .line ), static_cast <int >(param->range .end .line ));
223-
224- LuaFormatter formatter (parser, *options);
225- formatter.BuildRangeFormattedElement (formattedRange);
223+ LuaFormatRange formatRange (static_cast <int >(param->range .start .line ), static_cast <int >(param->range .end .line ));
224+ auto formatResult = LanguageClient::GetInstance ().GetService <CodeFormatService>()->RangeFormat (
225+ formatRange, parser, options);
226226
227- edit.newText = formatter.GetRangeFormattedText (formattedRange);
227+ auto & edit = result->edits .emplace_back ();
228+ edit.newText = std::move (formatResult);
228229 edit.range = vscode::Range (
229- vscode::Position (formattedRange .StartLine , formattedRange .StartCharacter ),
230- vscode::Position (formattedRange .EndLine + 1 , formattedRange .EndCharacter )
230+ vscode::Position (formatRange .StartLine , formatRange .StartCharacter ),
231+ vscode::Position (formatRange .EndLine + 1 , formatRange .EndCharacter )
231232 );
232233 return result;
233234}
@@ -253,13 +254,14 @@ std::shared_ptr<vscode::Serializable> LanguageService::OnTypeFormatting(
253254 return result;
254255 }
255256
256- auto & edit = result-> edits . emplace_back ();
257+
257258 LuaFormatRange formattedRange (static_cast <int >(position.line ) - 1 , static_cast <int >(position.line ) - 1 );
258259
259- LuaFormatter formatter (parser, *options);
260- formatter. BuildRangeFormattedElement ( formattedRange);
260+ auto formatResult = LanguageClient::GetInstance (). GetService <CodeFormatService>()-> RangeFormat (
261+ formattedRange, parser, options );
261262
262- edit.newText = formatter.GetRangeFormattedText (formattedRange);
263+ auto & edit = result->edits .emplace_back ();
264+ edit.newText = std::move (formatResult);
263265 edit.range = vscode::Range (
264266 vscode::Position (formattedRange.StartLine , formattedRange.StartCharacter ),
265267 vscode::Position (formattedRange.EndLine + 1 , formattedRange.EndCharacter )
@@ -269,17 +271,24 @@ std::shared_ptr<vscode::Serializable> LanguageService::OnTypeFormatting(
269271
270272std::shared_ptr<vscode::CodeActionResult> LanguageService::OnCodeAction (std::shared_ptr<vscode::CodeActionParams> param)
271273{
274+ auto range = param->range ;
275+ auto uri = param->textDocument .uri ;
276+ auto filePath = url::UrlToFilePath (uri);
272277 auto codeActionResult = std::make_shared<vscode::CodeActionResult>();
273278
274- auto & action = codeActionResult->actions .emplace_back ();
275- std::string title = " reformat me" ;
276- action.title = title;
277- action.command .title = title;
278- action.command .command = " emmylua.reformat.me" ;
279- action.command .arguments .push_back (param->textDocument .uri );
280- action.command .arguments .push_back (param->range .Serialize ());
279+ if (LanguageClient::GetInstance ().GetService <CodeFormatService>()->IsDiagnosticRange (filePath, range))
280+ {
281+ auto & action = codeActionResult->actions .emplace_back ();
282+ std::string title = " reformat me" ;
283+ action.title = title;
284+ action.command .title = title;
285+ action.command .command = " emmylua.reformat.me" ;
286+ action.command .arguments .push_back (param->textDocument .uri );
287+ action.command .arguments .push_back (param->range .Serialize ());
288+
289+ action.kind = vscode::CodeActionKind::QuickFix;
290+ }
281291
282- action.kind = vscode::CodeActionKind::QuickFix;
283292 return codeActionResult;
284293}
285294
@@ -316,10 +325,10 @@ std::shared_ptr<vscode::Serializable> LanguageService::OnExecuteCommand(
316325 auto & edit = change.emplace_back ();
317326 LuaFormatRange formattedRange (static_cast <int >(range.start .line ), static_cast <int >(range.end .line ));
318327
319- LuaFormatter formatter (parser, *options);
320- formatter.BuildRangeFormattedElement (formattedRange);
328+ auto formatResult = LanguageClient::GetInstance ().GetService <CodeFormatService>()->RangeFormat (formattedRange, parser, options);
329+
330+ edit.newText = std::move (formatResult);
321331
322- edit.newText = formatter.GetRangeFormattedText (formattedRange);
323332 edit.range = vscode::Range (
324333 vscode::Position (formattedRange.StartLine , formattedRange.StartCharacter ),
325334 vscode::Position (formattedRange.EndLine + 1 , formattedRange.EndCharacter )
0 commit comments