Skip to content

Commit 7831476

Browse files
committed
搭建基础
1 parent 3f9fdeb commit 7831476

File tree

2 files changed

+110
-1
lines changed

2 files changed

+110
-1
lines changed

CodeFormatServer/src/LanguageService.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "CodeFormatServer/Service/CodeFormatService.h"
1111
#include "CodeFormatServer/Service/ModuleService.h"
1212
#include "Util/Url.h"
13+
#include "Util/format.h"
1314

1415
using namespace std::placeholders;
1516

@@ -359,6 +360,47 @@ std::shared_ptr<vscode::Serializable> LanguageService::OnExecuteCommand(
359360
}
360361
else if (param->command == "emmylua.import.me")
361362
{
363+
if (param->arguments.size() < 3)
364+
{
365+
return result;
366+
}
367+
368+
std::string uri = param->arguments[0];
369+
vscode::Range range;
370+
371+
range.Deserialize(param->arguments[1]);
372+
373+
std::string moduleName = param->arguments[2];
374+
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+
}
385+
386+
std::string requireString = format("local {} = require(\"{}\")\n", moduleDefineName, moduleName);
387+
auto parser = LanguageClient::GetInstance().GetFileParser(uri);
388+
389+
auto applyParams = std::make_shared<vscode::ApplyWorkspaceEditParams>();
390+
auto it = applyParams->edit.changes.emplace(uri, std::vector<vscode::TextEdit>());
391+
auto& change = it.first->second;
392+
393+
auto& edit = change.emplace_back();
394+
LuaFormatRange formattedRange(static_cast<int>(range.start.line), static_cast<int>(range.end.line));
395+
396+
edit.newText = requireString;
397+
398+
edit.range = vscode::Range(
399+
vscode::Position(formattedRange.StartLine, formattedRange.StartCharacter),
400+
vscode::Position(formattedRange.EndLine + 1, formattedRange.EndCharacter)
401+
);
402+
403+
LanguageClient::GetInstance().SendRequest("workspace/applyEdit", applyParams);
362404
}
363405
return result;
364406
}

CodeFormatServer/src/Service/ModuleService.cpp

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,10 +228,77 @@ std::vector<ModuleIndex::Module> ModuleService::GetImportModules(std::string_vie
228228
auto& rangeModules = fIt->second;
229229
auto equalRange = rangeModules.equal_range(range);
230230
std::vector<ModuleIndex::Module> result;
231-
for(auto it = equalRange.first; it != equalRange.second; ++it)
231+
for (auto it = equalRange.first; it != equalRange.second; ++it)
232232
{
233233
result.emplace_back(it->second);
234234
}
235235

236236
return result;
237237
}
238+
239+
vscode::Range ModuleService::FindRequireRange(std::shared_ptr<LuaParser> parser)
240+
{
241+
vscode::Range range;
242+
auto chunkAst = parser->GetAst();
243+
if (chunkAst->GetChildren().empty())
244+
{
245+
return range;
246+
}
247+
248+
auto blockNode = chunkAst->GetChildren().front();
249+
250+
std::shared_ptr<LuaAstNode> lastNode = nullptr;
251+
252+
auto& children = blockNode->GetChildren();
253+
for (auto statement : children)
254+
{
255+
auto type = statement->GetType();
256+
257+
switch (type)
258+
{
259+
case LuaAstNodeType::Comment:
260+
{
261+
break;
262+
}
263+
case LuaAstNodeType::LocalStatement:
264+
{
265+
std::shared_ptr<LuaAstNode> expressionList = statement->FindFirstOf(LuaAstNodeType::ExpressionList);
266+
if (expressionList)
267+
{
268+
auto expression = expressionList->FindFirstOf(LuaAstNodeType::Expression);
269+
if (expression)
270+
{
271+
auto callExpression = expression->FindFirstOf(LuaAstNodeType::CallExpression);
272+
if (callExpression)
273+
{
274+
// ½«Ô¼¶¨×ö³É¹æ·¶
275+
auto methodNameNode = callExpression->FindFirstOf(LuaAstNodeType::PrimaryExpression);
276+
if (methodNameNode)
277+
{
278+
if (methodNameNode->GetText() == "require")
279+
{
280+
break;
281+
}
282+
}
283+
}
284+
}
285+
}
286+
goto endLoop;
287+
}
288+
default:
289+
{
290+
break;
291+
}
292+
}
293+
lastNode = statement;
294+
}
295+
endLoop:
296+
if (lastNode)
297+
{
298+
vscode::Position insertPosition(parser->GetLine(lastNode->GetTextRange().EndOffset) + 1, 0);
299+
range.start = insertPosition;
300+
range.end = insertPosition;
301+
}
302+
303+
return range;
304+
}

0 commit comments

Comments
 (0)