Skip to content

Commit d88bbfb

Browse files
committed
搭建语言服务
1 parent 06f8d59 commit d88bbfb

21 files changed

+475
-165
lines changed

CodeFormatServer/CMakeLists.txt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,8 @@ target_sources(CodeFormatServer
3737
#protocol
3838
${CodeFormatServer_SOURCE_DIR}/src/Protocol/ProtocolParser.cpp
3939
${CodeFormatServer_SOURCE_DIR}/src/Protocol/ProtocolBuffer.cpp
40-
# protocol/request
41-
${CodeFormatServer_SOURCE_DIR}/src/Protocol/Request/JsonRequestProtocol.cpp
42-
${CodeFormatServer_SOURCE_DIR}/src/Protocol/Request/RequestProtocolFactory.cpp
43-
${CodeFormatServer_SOURCE_DIR}/src/Protocol/Request/InitializeRequestProtocol.cpp
40+
41+
${CodeFormatServer_SOURCE_DIR}/src/VSCode.cpp
4442
)
4543

4644
target_link_libraries(CodeFormatServer PUBLIC CodeService)

CodeFormatServer/src/CodeFormatServer.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ int main(int argc, char** argv)
1919
LanguageClient::GetInstance().SetSession(std::make_shared<SocketIOSession>(std::move(socket)));
2020
LanguageClient::GetInstance().Run();
2121
}
22-
2322
}
2423
else
2524
{

CodeFormatServer/src/LanguageClient.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ void LanguageClient::SetSession(std::shared_ptr<IOSession> session)
1111
_session = session;
1212
}
1313

14+
std::shared_ptr<IOSession> LanguageClient::GetSession()
15+
{
16+
return _session;
17+
}
18+
1419
void LanguageClient::Run()
1520
{
1621
if (_session)
Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
#include "CodeFormatServer/LanguageService.h"
2+
#include "CodeFormatServer/VSCode.h"
3+
#include "CodeService/LuaFormatOptions.h"
4+
#include "CodeService/LuaFormatter.h"
25

36
using namespace std::placeholders;
47

@@ -12,28 +15,49 @@ LanguageService::~LanguageService()
1215

1316
bool LanguageService::Initialize()
1417
{
15-
#define DynamicBind(Method, ProtocolClass)\
16-
[this](auto request){ return Method(std::dynamic_pointer_cast<ProtocolClass>(request)); }
18+
#define DynamicBind(Method, ParamClass)\
19+
[this](auto param) { auto inputParam = std::dynamic_pointer_cast<ParamClass>(param); return Method(inputParam);}
1720

18-
_handles["initialize"] = DynamicBind(OnInitialize, InitializeRequestProtocol);
19-
21+
_handles["initialize"] = DynamicBind(OnInitialize, vscode::InitializeParams);
22+
_handles["textDocument/didChange"] = DynamicBind(OnDidChange, vscode::DidChangeTextDocumentParams);
2023

2124
return true;
2225
}
2326

24-
std::shared_ptr<JsonResponseProtocol> LanguageService::Dispatch(std::string_view method,
25-
std::shared_ptr<JsonRequestProtocol> request)
27+
std::shared_ptr<vscode::Serializable> LanguageService::Dispatch(std::string_view method,
28+
std::shared_ptr<vscode::Serializable> param)
2629
{
2730
auto it = _handles.find(method);
28-
if(it != _handles.end())
31+
if (it != _handles.end())
2932
{
30-
return it->second(request);
33+
return it->second(param);
3134
}
3235
return nullptr;
3336
}
3437

38+
std::shared_ptr<vscode::InitializeResult> LanguageService::OnInitialize(std::shared_ptr<vscode::InitializeParams> param)
39+
{
40+
auto result = std::make_shared<vscode::InitializeResult>();
41+
42+
result->capabilities.documentFormattingProvider = true;
43+
result->capabilities.textDocumentSync.change = vscode::TextDocumentSyncKind::Full;
44+
result->capabilities.textDocumentSync.openClose = true;
45+
return result;
46+
}
3547

36-
std::shared_ptr<JsonResponseProtocol> LanguageService::OnInitialize(std::shared_ptr<InitializeRequestProtocol> request)
48+
std::shared_ptr<vscode::Serializable> LanguageService::OnDidChange(
49+
std::shared_ptr<vscode::DidChangeTextDocumentParams> param)
3750
{
38-
return nullptr;
51+
LuaFormatOptions options;
52+
53+
std::shared_ptr<LuaParser> parser = LuaParser::LoadFromBuffer(std::move(param->contentChanges[0].text));
54+
parser->BuildAstWithComment();
55+
56+
LuaFormatter formatter(parser, options);
57+
formatter.BuildFormattedElement();
58+
59+
auto diagnosis = formatter.GetDiagnosisInfos();
60+
61+
62+
3963
}

CodeFormatServer/src/Protocol/JsonResponseProtocol.cpp

Whitespace-only changes.

CodeFormatServer/src/Protocol/ProtocolParser.cpp

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,55 @@
22

33
#include <iostream>
44
#include <nlohmann/json.hpp>
5-
5+
#include "Util/format.h"
66
#include "CodeFormatServer/LanguageService.h"
7-
#include "CodeFormatServer/Protocol/Request/RequestProtocolFactory.h"
87

98
ProtocolParser::ProtocolParser()
10-
: _id(0),
11-
_method(),
12-
_request(nullptr)
9+
: _id(-1)
1310
{
1411
}
1512

1613
void ProtocolParser::Parse(std::string_view msg)
1714
{
1815
std::cout << msg << std::endl;
1916
auto jsonMessage = nlohmann::json::parse(msg);
20-
21-
_id = jsonMessage["id"].get<int>();
22-
_method = jsonMessage["method"].get<std::string>();
23-
auto params = jsonMessage["params"];
24-
25-
_request = RequestProtocolFactory::GetInstance().MakeProtocol(_method, params);
17+
if (jsonMessage["id"].is_number())
18+
{
19+
_id = jsonMessage["id"].get<int>();
20+
}
21+
if (jsonMessage["method"].is_string())
22+
{
23+
_method = jsonMessage["method"].get<std::string>();
24+
}
25+
if (jsonMessage["params"].is_object())
26+
{
27+
auto params = jsonMessage["params"];
28+
_param = vscode::MakeFromRequest(_method, params);
29+
}
2630
}
2731

28-
std::shared_ptr<JsonRequestProtocol> ProtocolParser::GetRequest()
32+
std::shared_ptr<vscode::Serializable> ProtocolParser::GetParam()
2933
{
30-
return _request;
34+
return _param;
3135
}
3236

3337
std::string_view ProtocolParser::GetMethod()
3438
{
3539
return _method;
3640
}
3741

38-
std::string ProtocolParser::SerializeProtocol(std::shared_ptr<JsonResponseProtocol> response)
42+
std::string ProtocolParser::SerializeProtocol(std::shared_ptr<vscode::Serializable> result)
3943
{
40-
return "";
44+
45+
nlohmann::json json;
46+
if (_id != -1) {
47+
json["id"] = _id;
48+
}
49+
json["result"] = result->Serialize();
50+
json["jsonrpc"] = "2.0";
51+
auto dumpResult = json.dump();
52+
std::string message = format("Content-Length:{}\r\n\r\n", dumpResult.size());
53+
54+
message.append(dumpResult);
55+
return std::move(message);
4156
}

CodeFormatServer/src/Protocol/Request/InitializeRequestProtocol.cpp

Lines changed: 0 additions & 11 deletions
This file was deleted.

CodeFormatServer/src/Protocol/Request/JsonRequestProtocol.cpp

Lines changed: 0 additions & 9 deletions
This file was deleted.

CodeFormatServer/src/Protocol/Request/RequestProtocolFactory.cpp

Lines changed: 0 additions & 40 deletions
This file was deleted.

CodeFormatServer/src/Session/IOSession.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ std::string IOSession::Handle(std::string_view msg)
1818

1919
parser.Parse(msg);
2020

21-
auto request = parser.GetRequest();
21+
auto param = parser.GetParam();
2222

23-
if (request)
23+
if (param)
2424
{
25-
auto response = _service.Dispatch(parser.GetMethod(), request);
26-
if (response) {
27-
return parser.SerializeProtocol(response);
25+
auto result = _service.Dispatch(parser.GetMethod(), param);
26+
if (result) {
27+
return parser.SerializeProtocol(result);
2828
}
2929
}
3030

0 commit comments

Comments
 (0)