@@ -21,7 +21,8 @@ bool LanguageService::Initialize()
2121
2222 _handles[" initialize" ] = DynamicBind (OnInitialize, vscode::InitializeParams);
2323 _handles[" textDocument/didChange" ] = DynamicBind (OnDidChange, vscode::DidChangeTextDocumentParams);
24-
24+ _handles[" textDocument/didOpen" ] = DynamicBind (OnDidOpen, vscode::DidOpenTextDocumentParam);
25+ _handles[" textDocument/formatting" ] = DynamicBind (OnFormatting, vscode::DocumentFormattingParams);
2526 return true ;
2627}
2728
@@ -49,36 +50,52 @@ std::shared_ptr<vscode::InitializeResult> LanguageService::OnInitialize(std::sha
4950std::shared_ptr<vscode::Serializable> LanguageService::OnDidChange (
5051 std::shared_ptr<vscode::DidChangeTextDocumentParams> param)
5152{
52- LuaFormatOptions options;
53+ for (auto & content : param->contentChanges )
54+ {
55+ LanguageClient::GetInstance ().CacheFile (param->textDocument .uri , content.text );
5356
54- std::shared_ptr<LuaParser> parser = LuaParser::LoadFromBuffer (std::move (param->contentChanges [0 ].text ));
55- parser->BuildAstWithComment ();
57+ LanguageClient::GetInstance ().DiagnosticFile (param->textDocument .uri );
58+ }
59+ return nullptr ;
60+ }
5661
57- LuaFormatter formatter (parser, options);
58- formatter.BuildFormattedElement ();
62+ std::shared_ptr<vscode::Serializable> LanguageService::OnDidOpen (
63+ std::shared_ptr<vscode::DidOpenTextDocumentParam> param)
64+ {
65+ LanguageClient::GetInstance ().CacheFile (param->textDocument .uri , param->textDocument .text );
66+ LanguageClient::GetInstance ().DiagnosticFile (param->textDocument .uri );
5967
60- auto diagnosisInfos = formatter.GetDiagnosisInfos ();
68+ return nullptr ;
69+ }
6170
62- auto vscodeDiagnosis = std::make_shared<vscode::PublishDiagnosticsParams>();
63- vscodeDiagnosis->uri = param->textDocument .uri ;
71+ std::shared_ptr<vscode::Serializable> LanguageService::OnFormatting (
72+ std::shared_ptr<vscode::DocumentFormattingParams> param)
73+ {
74+ auto text = LanguageClient::GetInstance ().GetFile (param->textDocument .uri );
75+
76+ auto lastOffset = text.size ();
77+
78+ auto result = std::make_shared<vscode::DocumentFormattingResult>();
6479
65- for ( auto diagnosisInfo : diagnosisInfos )
80+ if (text. empty () )
6681 {
67- auto & diagnosis = vscodeDiagnosis->diagnostics .emplace_back ();
68- diagnosis.message = diagnosisInfo.Message ;
69- diagnosis.range = vscode::Range (
70- vscode::Position (
71- diagnosisInfo.Range .Start .Line ,
72- diagnosisInfo.Range .Start .Character
73- ),
74- vscode::Position (
75- diagnosisInfo.Range .End .Line ,
76- diagnosisInfo.Range .End .Character
77- ));
78- diagnosis.severity = vscode::DiagnosticSeverity::Warning;
82+ result->hasError = true ;
83+ return result;
7984 }
8085
81- LanguageClient::GetInstance ().SendNotification ( " textDocument/publishDiagnostics " , vscodeDiagnosis );
86+ auto & options = LanguageClient::GetInstance ().GetOptions ( );
8287
83- return nullptr ;
88+ std::shared_ptr<LuaParser> parser = LuaParser::LoadFromBuffer (std::move (text));
89+ parser->BuildAstWithComment ();
90+
91+ LuaFormatter formatter (parser, options);
92+ formatter.BuildFormattedElement ();
93+
94+ auto & edit = result->edits .emplace_back ();
95+ edit.newText = formatter.GetFormattedText ();
96+ edit.range = vscode::Range (
97+ vscode::Position (0 , 0 ),
98+ vscode::Position (parser->GetLine (lastOffset), parser->GetColumn (lastOffset))
99+ );
100+ return result;
84101}
0 commit comments