Skip to content

Commit cd35377

Browse files
committed
修改
1 parent 0015839 commit cd35377

File tree

9 files changed

+169
-46
lines changed

9 files changed

+169
-46
lines changed

3rd/uriparser/src/config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343

4444
#define PACKAGE_VERSION "0.9.5"
4545

46-
#define HAVE_WPRINTF
46+
/* #undef HAVE_WPRINTF */
4747
/* #undef HAVE_REALLOCARRAY */
4848

4949

CodeFormatServer/src/LanguageClient.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ void LanguageClient::UpdateAllDiagnosis()
219219
finder.AddIgnoreDirectory(".vscode");
220220

221221
finder.AddFindExtension(".lua");
222+
finder.AddFindExtension(".lua.txt");
222223

223224
GetService<ModuleService>()->RebuildIndexs(finder.FindFiles());
224225

CodeFormatServer/src/LanguageService.cpp

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ std::shared_ptr<vscode::InitializeResult> LanguageService::OnInitialize(std::sha
107107
}
108108

109109
LanguageClient::GetInstance().SetRoot(param->rootPath);
110-
111110
return result;
112111
}
113112

@@ -305,11 +304,12 @@ std::shared_ptr<vscode::CodeActionResult> LanguageService::OnCodeAction(std::sha
305304
auto object = nlohmann::json::object();
306305
object["moduleName"] = module.ModuleName;
307306
object["path"] = module.FilePath;
307+
object["name"] = module.Name;
308308
action.command.arguments.push_back(object);
309309
}
310310

311311
action.kind = vscode::CodeActionKind::QuickFix;
312-
}
312+
}
313313
return codeActionResult;
314314
}
315315

@@ -360,7 +360,7 @@ std::shared_ptr<vscode::Serializable> LanguageService::OnExecuteCommand(
360360
}
361361
else if (param->command == "emmylua.import.me")
362362
{
363-
if (param->arguments.size() < 3)
363+
if (param->arguments.size() < 4)
364364
{
365365
return result;
366366
}
@@ -372,16 +372,7 @@ std::shared_ptr<vscode::Serializable> LanguageService::OnExecuteCommand(
372372

373373
std::string moduleName = param->arguments[2];
374374
auto pos = moduleName.find_last_of('.');
375-
std::string moduleDefineName;
376-
377-
if (pos == std::string_view::npos)
378-
{
379-
moduleDefineName = moduleName;
380-
}
381-
else
382-
{
383-
moduleDefineName = moduleName.substr(pos + 1);
384-
}
375+
std::string moduleDefineName = param->arguments[3];
385376

386377
std::string requireString = format("local {} = require(\"{}\")\n", moduleDefineName, moduleName);
387378
auto parser = LanguageClient::GetInstance().GetFileParser(uri);
@@ -391,14 +382,10 @@ std::shared_ptr<vscode::Serializable> LanguageService::OnExecuteCommand(
391382
auto& change = it.first->second;
392383

393384
auto& edit = change.emplace_back();
394-
LuaFormatRange formattedRange(static_cast<int>(range.start.line), static_cast<int>(range.end.line));
395385

396386
edit.newText = requireString;
397387

398-
edit.range = vscode::Range(
399-
vscode::Position(formattedRange.StartLine, formattedRange.StartCharacter),
400-
vscode::Position(formattedRange.EndLine + 1, formattedRange.EndCharacter)
401-
);
388+
edit.range = LanguageClient::GetInstance().GetService<ModuleService>()->FindRequireRange(parser);
402389

403390
LanguageClient::GetInstance().SendRequest("workspace/applyEdit", applyParams);
404391
}

CodeFormatServer/src/Service/CodeFormatService.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,21 @@ bool CodeFormatService::IsDiagnosticRange(std::string_view filePath, vscode::Ran
6262
}
6363

6464
auto& diagnosticSet = it->second;
65-
66-
return diagnosticSet.count(range) > 0;
65+
if(range.start == range.end)
66+
{
67+
for(auto& validRange: diagnosticSet)
68+
{
69+
if(validRange.start <= range.start && validRange.end >= range.end)
70+
{
71+
return true;
72+
}
73+
}
74+
return false;
75+
}
76+
else
77+
{
78+
return diagnosticSet.count(range) > 0;
79+
}
6780
}
6881

6982
std::string CodeFormatService::RangeFormat(LuaFormatRange& range,

CodeFormatServer/src/Service/ModuleService.cpp

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
#include "CodeFormatServer/Service/ModuleService.h"
1+
#include "CodeFormatServer/Service/ModuleService.h"
22
#include "LuaParser/LuaAstVisitor.h"
3+
#include "Util/StringUtil.h"
34

45
class UnResolveModuleFinder : public LuaAstVisitor
56
{
@@ -153,7 +154,7 @@ std::vector<vscode::Diagnostic> ModuleService::Diagnose(std::string_view filePat
153154
auto& undefinedModules = finder.GetUndefinedModule(parser);
154155
auto& luaModules = _moduleIndex.GetModules(options);
155156

156-
std::multimap<vscode::Range, ModuleIndex::Module> rangeModule;
157+
std::multimap<vscode::Range, LuaModule> rangeModule;
157158
for (auto& undefinedModule : undefinedModules)
158159
{
159160
auto undefinedModuleName = undefinedModule->GetText();
@@ -171,10 +172,10 @@ std::vector<vscode::Diagnostic> ModuleService::Diagnose(std::string_view filePat
171172
name = luaModule.ModuleName.substr(dotPosition + 1);
172173
}
173174

174-
if (undefinedModuleName == name)
175+
if (StringUtil::IsStringEqualIgnoreCase(undefinedModuleName, name))
175176
{
176177
auto& diagnostic = result.emplace_back();
177-
diagnostic.message = "not import module";
178+
diagnostic.message = "need import module";
178179
auto textRange = undefinedModule->GetTextRange();
179180
auto range = vscode::Range(
180181
vscode::Position(
@@ -186,9 +187,17 @@ std::vector<vscode::Diagnostic> ModuleService::Diagnose(std::string_view filePat
186187
parser->GetColumn(textRange.EndOffset)
187188
)
188189
);
189-
rangeModule.insert({range, luaModule});
190+
191+
rangeModule.insert({
192+
range, LuaModule{
193+
.ModuleName = luaModule.ModuleName,
194+
.FilePath = luaModule.FilePath,
195+
.Name = std::string(undefinedModuleName)
196+
}
197+
});
198+
190199
diagnostic.range = range;
191-
diagnostic.severity = vscode::DiagnosticSeverity::Information;
200+
diagnostic.severity = vscode::DiagnosticSeverity::Hint;
192201
}
193202
}
194203
}
@@ -214,25 +223,53 @@ bool ModuleService::IsDiagnosticRange(std::string_view filePath, vscode::Range r
214223
return false;
215224
}
216225

217-
return it->second.count(range) > 0;
226+
if (range.start == range.end)
227+
{
228+
for (auto& pair : it->second)
229+
{
230+
if (pair.first.start <= range.start && pair.first.end >= range.end)
231+
{
232+
return true;
233+
}
234+
}
235+
return false;
236+
}
237+
else
238+
{
239+
return it->second.count(range) > 0;
240+
}
218241
}
219242

220-
std::vector<ModuleIndex::Module> ModuleService::GetImportModules(std::string_view filePath, vscode::Range range)
243+
std::vector<ModuleService::LuaModule> ModuleService::GetImportModules(std::string_view filePath, vscode::Range range)
221244
{
222245
auto fIt = _diagnosticCaches.find(filePath);
223246
if (fIt == _diagnosticCaches.end())
224247
{
225248
return {};
226249
}
227250

251+
std::vector<LuaModule> result;
228252
auto& rangeModules = fIt->second;
229-
auto equalRange = rangeModules.equal_range(range);
230-
std::vector<ModuleIndex::Module> result;
231-
for (auto it = equalRange.first; it != equalRange.second; ++it)
253+
254+
if (range.start == range.end)
232255
{
233-
result.emplace_back(it->second);
256+
for (auto& pair : rangeModules)
257+
{
258+
if (pair.first.start <= range.start && pair.first.end >= range.end)
259+
{
260+
result.push_back(pair.second);
261+
}
262+
}
234263
}
264+
else
265+
{
266+
auto itPair = rangeModules.equal_range(range);
235267

268+
for (auto it = itPair.first; it != itPair.second; it++)
269+
{
270+
result.push_back(it->second);
271+
}
272+
}
236273
return result;
237274
}
238275

@@ -271,7 +308,7 @@ vscode::Range ModuleService::FindRequireRange(std::shared_ptr<LuaParser> parser)
271308
auto callExpression = expression->FindFirstOf(LuaAstNodeType::CallExpression);
272309
if (callExpression)
273310
{
274-
// ½«Ô¼¶¨×ö³É¹æ·¶
311+
// 将约定做成规范
275312
auto methodNameNode = callExpression->FindFirstOf(LuaAstNodeType::PrimaryExpression);
276313
if (methodNameNode)
277314
{
@@ -287,7 +324,7 @@ vscode::Range ModuleService::FindRequireRange(std::shared_ptr<LuaParser> parser)
287324
}
288325
default:
289326
{
290-
break;
327+
goto endLoop;
291328
}
292329
}
293330
lastNode = statement;

Util/src/StringUtil.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "Util/StringUtil.h"
2+
#include <cstdlib>
23

34
std::vector<std::string_view> StringUtil::Split(std::string_view source, std::string_view separator)
45
{
@@ -86,3 +87,19 @@ std::string StringUtil::Replace(std::string_view source, std::string_view oldStr
8687

8788
return result;
8889
}
90+
91+
bool StringUtil::IsStringEqualIgnoreCase(std::string_view lhs, std::string_view rhs)
92+
{
93+
if(lhs.size() != rhs.size())
94+
{
95+
return false;
96+
}
97+
for(std::size_t i = 0;i!=lhs.size();i++)
98+
{
99+
if(::tolower(lhs[i]) != ::tolower(rhs[i]))
100+
{
101+
return false;
102+
}
103+
}
104+
return true;
105+
}

include/CodeFormatServer/Service/ModuleService.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@ class ModuleService : public Service
1616
public:
1717
LANGUAGE_SERVICE(ModuleService);
1818

19+
class LuaModule
20+
{
21+
public:
22+
std::string ModuleName;
23+
std::string FilePath;
24+
std::string Name;
25+
};
26+
1927
explicit ModuleService(std::shared_ptr<LanguageClient> owner);
2028

2129
std::vector<vscode::Diagnostic> Diagnose(std::string_view filePath, std::shared_ptr<LuaParser> parser,
@@ -24,11 +32,11 @@ class ModuleService : public Service
2432

2533
void RebuildIndexs(std::vector<std::string> files);
2634
bool IsDiagnosticRange(std::string_view filePath, vscode::Range range);
27-
std::vector<ModuleIndex::Module> GetImportModules(std::string_view filePath, vscode::Range range);
35+
std::vector<LuaModule> GetImportModules(std::string_view filePath, vscode::Range range);
2836

2937
vscode::Range FindRequireRange(std::shared_ptr<LuaParser> parser);
3038

3139
private:
3240
ModuleIndex _moduleIndex;
33-
std::map<std::string, std::multimap<vscode::Range, ModuleIndex::Module>, std::less<>> _diagnosticCaches;
41+
std::map<std::string, std::multimap<vscode::Range, LuaModule>, std::less<>> _diagnosticCaches;
3442
};

0 commit comments

Comments
 (0)