Skip to content

Commit 28f5aec

Browse files
committed
优化语言服务
1 parent 11af2b5 commit 28f5aec

27 files changed

+407
-279
lines changed

CodeFormatLib/src/CodeFormatLib.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ int spell_analysis(lua_State* L)
442442
std::string filename = lua_tostring(L, 1);
443443
std::string text = lua_tostring(L, 2);
444444

445-
std::set<std::string> tempDict;
445+
CodeSpellChecker::CustomDictionary tempDict;
446446

447447
if (top == 3 && lua_istable(L, 3))
448448
{

CodeFormatLib/src/LuaCodeFormat.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,8 @@ std::pair<bool, std::vector<LuaDiagnosisInfo>> LuaCodeFormat::Diagnose(const std
133133
return std::make_pair(true, ctx.GetDiagnosisInfos());
134134
}
135135

136-
std::vector<LuaDiagnosisInfo> LuaCodeFormat::SpellCheck(const std::string& uri, std::string&& text, std::set<std::string>& tempDict)
136+
std::vector<LuaDiagnosisInfo> LuaCodeFormat::SpellCheck(const std::string& uri, std::string&& text,
137+
const CodeSpellChecker::CustomDictionary& tempDict)
137138
{
138139
auto parser = LuaParser::LoadFromBuffer(std::move(text));
139140

@@ -142,7 +143,7 @@ std::vector<LuaDiagnosisInfo> LuaCodeFormat::SpellCheck(const std::string& uri,
142143
DiagnosisContext ctx(parser, *options);
143144

144145
_codeSpellChecker->Analysis(ctx, tempDict);
145-
146+
146147
return ctx.GetDiagnosisInfos();
147148
}
148149

CodeFormatLib/src/LuaCodeFormat.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,14 @@ class LuaCodeFormat
2626

2727
void LoadSpellDictionaryFromBuffer(const std::string& buffer);
2828

29-
std::string Reformat(const std::string& uri, std::string&& text,ConfigMap& configMap);
29+
std::string Reformat(const std::string& uri, std::string&& text, ConfigMap& configMap);
3030

3131
std::string RangeFormat(const std::string& uri, LuaFormatRange& range, std::string&& text, ConfigMap& configMap);
3232

3333
std::pair<bool, std::vector<LuaDiagnosisInfo>> Diagnose(const std::string& uri, std::string&& text);
3434

35-
std::vector<LuaDiagnosisInfo> SpellCheck(const std::string& uri, std::string&& text, std::set<std::string>& tempDict);
35+
std::vector<LuaDiagnosisInfo> SpellCheck(const std::string& uri, std::string&& text,
36+
const CodeSpellChecker::CustomDictionary& tempDict);
3637

3738
std::vector<SuggestItem> SpellCorrect(const std::string& word);
3839

CodeFormatServer/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ target_sources(CodeFormatServer
5757
${CodeFormatServer_SOURCE_DIR}/src/Service/ModuleService.cpp
5858
${CodeFormatServer_SOURCE_DIR}/src/Service/CodeFormatService.cpp
5959
${CodeFormatServer_SOURCE_DIR}/src/Service/CompletionService.cpp
60+
${CodeFormatServer_SOURCE_DIR}/src/Service/CommandService.cpp
6061

6162
# mimalloc
6263
${LuaCodeStyle_SOURCE_DIR}/3rd/mimalloc-2.0.3/src/static.c

CodeFormatServer/src/LanguageClient.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include "CodeFormatServer/Service/ModuleService.h"
1111
#include "CodeFormatServer/Service/CodeFormatService.h"
1212
#include "CodeFormatServer/Service/CompletionService.h"
13-
13+
#include "CodeFormatServer/Service/CommandService.h"
1414

1515
LanguageClient& LanguageClient::GetInstance()
1616
{
@@ -30,6 +30,7 @@ void LanguageClient::InitializeService()
3030
AddService<CodeFormatService>();
3131
AddService<ModuleService>();
3232
AddService<CompletionService>();
33+
AddService<CommandService>();
3334

3435
for (auto service : _services)
3536
{

CodeFormatServer/src/LanguageService.cpp

Lines changed: 26 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "CodeFormatServer/LanguageService.h"
1+
#include "CodeFormatServer/LanguageService.h"
22
#include <fstream>
33
#include <iostream>
44
#include <sstream>
@@ -9,6 +9,7 @@
99
#include "CodeService/LuaFormatter.h"
1010
#include "CodeFormatServer/LanguageClient.h"
1111
#include "CodeFormatServer/Service/CodeFormatService.h"
12+
#include "CodeFormatServer/Service/CommandService.h"
1213
#include "CodeFormatServer/Service/ModuleService.h"
1314
#include "CodeFormatServer/Service/CompletionService.h"
1415
#include "Util/Url.h"
@@ -76,15 +77,14 @@ std::shared_ptr<vscode::InitializeResult> LanguageService::OnInitialize(std::sha
7677
LanguageClient::GetInstance().SetVscodeSettings(param->initializationOptions.vscodeConfig);
7778

7879
result->capabilities.codeActionProvider = true;
79-
result->capabilities.executeCommandProvider.commands = {
80-
"emmylua.reformat.me",
81-
"emmylua.import.me",
82-
"emmylua.spell.correct"
83-
};
80+
result->capabilities.executeCommandProvider.commands =
81+
LanguageClient::GetInstance().GetService<CommandService>()->GetCommands();
8482

85-
result->capabilities.completionProvider.resolveProvider = false;
86-
result->capabilities.completionProvider.triggerCharacters = {};
87-
result->capabilities.completionProvider.completionItem.labelDetailsSupport = true;
83+
// result->capabilities.completionProvider.resolveProvider = false;
84+
// result->capabilities.completionProvider.triggerCharacters = {};
85+
// result->capabilities.completionProvider.completionItem.labelDetailsSupport = true;
86+
// 砍掉代码补全
87+
result->capabilities.completionProvider.supportCompletion = false;
8888

8989
auto& editorConfigFiles = param->initializationOptions.editorConfigFiles;
9090
for (auto& configFile : editorConfigFiles)
@@ -344,6 +344,7 @@ std::shared_ptr<vscode::Serializable> LanguageService::OnTypeFormatting(
344344

345345
std::shared_ptr<vscode::CodeActionResult> LanguageService::OnCodeAction(std::shared_ptr<vscode::CodeActionParams> param)
346346
{
347+
// TODO refactor move to CodeActionService
347348
auto range = param->range;
348349
auto uri = param->textDocument.uri;
349350
auto filePath = url::UrlToFilePath(uri);
@@ -354,27 +355,34 @@ std::shared_ptr<vscode::CodeActionResult> LanguageService::OnCodeAction(std::sha
354355
if (LanguageClient::GetInstance().GetService<CodeFormatService>()->IsCodeFormatDiagnostic(diagnostic))
355356
{
356357
auto& action = codeActionResult->actions.emplace_back();
357-
std::string title = "reformat";
358+
std::string title = "reformat current line";
358359
action.title = title;
359360
action.command.title = title;
360-
action.command.command = "emmylua.reformat.me";
361+
action.command.command = LanguageClient::GetInstance().
362+
GetService<CommandService>()->GetCommand(CommandService::Command::Reformat);
361363
action.command.arguments.push_back(param->textDocument.uri);
362364
action.command.arguments.push_back(param->range.Serialize());
363365

364366
action.kind = vscode::CodeActionKind::QuickFix;
365367
}
366368
else if (LanguageClient::GetInstance().GetService<CodeFormatService>()->IsSpellDiagnostic(diagnostic))
367369
{
368-
LanguageClient::GetInstance().GetService<CodeFormatService>()->MakeSpellActions(codeActionResult, diagnostic, param->textDocument.uri);
370+
LanguageClient::GetInstance().GetService<CodeFormatService>()->MakeSpellActions(
371+
codeActionResult, diagnostic, param->textDocument.uri);
369372
}
370-
else if (LanguageClient::GetInstance().GetService<ModuleService>()->IsDiagnosticRange(filePath, range))
373+
else if (LanguageClient::GetInstance().GetService<ModuleService>()->IsModuleDiagnostic(diagnostic))
371374
{
372375
auto modules = LanguageClient::GetInstance().GetService<ModuleService>()->GetImportModules(filePath, range);
373376
auto& action = codeActionResult->actions.emplace_back();
374-
std::string title = "import me";
377+
std::string title = "import multi choice";
378+
if (modules.size() == 1)
379+
{
380+
title = Util::format("import '{}'", modules.front().ModuleName);
381+
}
375382
action.title = title;
376383
action.command.title = title;
377-
action.command.command = "emmylua.import.me";
384+
action.command.command = LanguageClient::GetInstance().
385+
GetService<CommandService>()->GetCommand(CommandService::Command::Import);
378386
action.command.arguments.push_back(param->textDocument.uri);
379387
action.command.arguments.push_back(param->range.Serialize());
380388
for (auto& module : modules)
@@ -395,108 +403,8 @@ std::shared_ptr<vscode::CodeActionResult> LanguageService::OnCodeAction(std::sha
395403
std::shared_ptr<vscode::Serializable> LanguageService::OnExecuteCommand(
396404
std::shared_ptr<vscode::ExecuteCommandParams> param)
397405
{
398-
auto result = std::make_shared<vscode::Serializable>();
399-
if (param->command == "emmylua.reformat.me")
400-
{
401-
if (param->arguments.size() < 2)
402-
{
403-
return result;
404-
}
405-
406-
std::string uri = param->arguments[0];
407-
vscode::Range range;
408-
409-
range.Deserialize(param->arguments[1]);
410-
411-
auto parser = LanguageClient::GetInstance().GetFileParser(uri);
412-
413-
auto applyParams = std::make_shared<vscode::ApplyWorkspaceEditParams>();
414-
415-
auto options = LanguageClient::GetInstance().GetOptions(uri);
416-
417-
if (parser->HasError())
418-
{
419-
return result;
420-
}
421-
422-
auto it = applyParams->edit.changes.emplace(uri, std::vector<vscode::TextEdit>());
423-
auto& change = it.first->second;
424-
425-
auto& edit = change.emplace_back();
426-
LuaFormatRange formattedRange(static_cast<int>(range.start.line), static_cast<int>(range.end.line));
427-
428-
auto formatResult = LanguageClient::GetInstance().GetService<CodeFormatService>()->RangeFormat(
429-
formattedRange, parser, options);
430-
431-
edit.newText = std::move(formatResult);
432-
433-
edit.range = vscode::Range(
434-
vscode::Position(formattedRange.StartLine, formattedRange.StartCharacter),
435-
vscode::Position(formattedRange.EndLine + 1, formattedRange.EndCharacter)
436-
);
437-
438-
LanguageClient::GetInstance().SendRequest("workspace/applyEdit", applyParams);
439-
}
440-
else if (param->command == "emmylua.import.me")
441-
{
442-
if (param->arguments.size() < 4)
443-
{
444-
return result;
445-
}
446-
447-
std::string uri = param->arguments[0];
448-
std::string filePath = url::UrlToFilePath(uri);
449-
auto config = LanguageClient::GetInstance().GetService<ModuleService>()->GetIndex().GetConfig(filePath);
450-
if (!config)
451-
{
452-
return nullptr;
453-
}
454-
vscode::Range range;
455-
456-
range.Deserialize(param->arguments[1]);
457-
458-
std::string moduleName = param->arguments[2];
459-
460-
std::string moduleDefineName = param->arguments[3];
461-
462-
std::string requireString = Util::format("local {} = {}(\"{}\")\n", moduleDefineName, config->import_function,
463-
moduleName);
464-
auto parser = LanguageClient::GetInstance().GetFileParser(uri);
465-
auto applyParams = std::make_shared<vscode::ApplyWorkspaceEditParams>();
466-
auto it = applyParams->edit.changes.emplace(uri, std::vector<vscode::TextEdit>());
467-
auto& change = it.first->second;
468-
469-
auto& edit = change.emplace_back();
470-
471-
edit.newText = requireString;
472-
473-
edit.range = LanguageClient::GetInstance().GetService<ModuleService>()->FindRequireRange(parser, config);
474-
475-
LanguageClient::GetInstance().SendRequest("workspace/applyEdit", applyParams);
476-
}
477-
else if(param->command == "emmylua.spell.correct")
478-
{
479-
std::string uri = param->arguments[0];
480-
vscode::Range range;
481-
482-
range.Deserialize(param->arguments[1]);
483-
484-
std::string newText = param->arguments[2];
485-
486-
auto applyParams = std::make_shared<vscode::ApplyWorkspaceEditParams>();
487-
auto it = applyParams->edit.changes.emplace(uri, std::vector<vscode::TextEdit>());
488-
auto& change = it.first->second;
489-
490-
auto& edit = change.emplace_back();
491-
492-
edit.newText = newText;
493-
494-
edit.range = range;
495-
496-
LanguageClient::GetInstance().SendRequest("workspace/applyEdit", applyParams);
497-
}
498-
499-
return result;
406+
LanguageClient::GetInstance().GetService<CommandService>()->Dispatch(param->command, param);
407+
return nullptr;
500408
}
501409

502410
std::shared_ptr<vscode::Serializable> LanguageService::OnDidChangeWatchedFiles(
@@ -528,6 +436,7 @@ std::shared_ptr<vscode::Serializable> LanguageService::OnDidChangeWatchedFiles(
528436
return nullptr;
529437
}
530438

439+
//@depreacated
531440
std::shared_ptr<vscode::CompletionList> LanguageService::OnCompletion(std::shared_ptr<vscode::CompletionParams> param)
532441
{
533442
auto list = std::make_shared<vscode::CompletionList>();

CodeFormatServer/src/Service/AstUtil/ModuleFinder.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ std::set<std::string> ModuleFinder::GetDefinedName(std::shared_ptr<LuaAstNode> u
4141
return definedName;
4242
}
4343

44-
4544
void ModuleFinder::VisitParamList(const std::shared_ptr<LuaAstNode>& paramList)
4645
{
4746
for (auto param : paramList->GetChildren())

CodeFormatServer/src/Service/CodeFormatService.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#include "CodeFormatServer/Service/CodeFormatService.h"
2+
3+
#include "CodeFormatServer/Service/CommandService.h"
24
#include "CodeService/LuaFormatter.h"
35
#include "CodeService/FormatElement/DiagnosisContext.h"
46
#include "CodeService/NameStyle/NameStyleChecker.h"
@@ -49,13 +51,14 @@ std::vector<vscode::Diagnostic> CodeFormatService::Diagnose(std::string_view fil
4951
case DiagnosisType::Blank:
5052
case DiagnosisType::Align:
5153
{
52-
diagnosis.data = "emmylua.format";
54+
diagnosis.code = "Emmylua style-check";
5355
break;
5456
}
5557
case DiagnosisType::Spell:
5658
{
5759
diagnosis.severity = vscode::DiagnosticSeverity::Information;
58-
diagnosis.data = "emmylua.spell|" + diagnosisInfo.Data;
60+
diagnosis.code = "Emmylua spell-check";
61+
diagnosis.data = diagnosisInfo.Data;
5962
break;
6063
}
6164
default:
@@ -88,13 +91,8 @@ std::string CodeFormatService::RangeFormat(LuaFormatRange& range,
8891
void CodeFormatService::MakeSpellActions(std::shared_ptr<vscode::CodeActionResult> result,
8992
vscode::Diagnostic& diagnostic, std::string_view uri)
9093
{
91-
auto pos = diagnostic.data.find_first_of("|");
92-
if (pos == std::string::npos)
93-
{
94-
return;
95-
}
9694

97-
auto originText = diagnostic.data.substr(pos + 1);
95+
auto& originText = diagnostic.data;
9896
if (originText.empty())
9997
{
10098
return;
@@ -103,13 +101,14 @@ void CodeFormatService::MakeSpellActions(std::shared_ptr<vscode::CodeActionResul
103101
auto suggests = _spellChecker->GetSuggests(originText);
104102
for (auto& suggest : suggests)
105103
{
106-
if (!suggest.Term.empty()) {
104+
if (!suggest.Term.empty())
105+
{
107106
auto& action = result->actions.emplace_back();
108107
auto& term = suggest.Term;
109108

110109
action.title = term;
111110
action.command.title = term;
112-
action.command.command = "emmylua.spell.correct";
111+
action.command.command = GetService<CommandService>()->GetCommand(CommandService::Command::SpellCorrect);
113112
action.command.arguments.push_back(uri);
114113
action.command.arguments.push_back(diagnostic.range.Serialize());
115114
action.command.arguments.push_back(term);
@@ -126,10 +125,10 @@ void CodeFormatService::LoadDictionary(std::string_view path)
126125

127126
bool CodeFormatService::IsCodeFormatDiagnostic(vscode::Diagnostic& diagnostic)
128127
{
129-
return diagnostic.data == "emmylua.format";
128+
return diagnostic.code == "Emmylua style-check";
130129
}
131130

132131
bool CodeFormatService::IsSpellDiagnostic(vscode::Diagnostic& diagnostic)
133132
{
134-
return diagnostic.data.starts_with("emmylua.spell");
133+
return diagnostic.code == "Emmylua spell-check";
135134
}

0 commit comments

Comments
 (0)