@@ -364,6 +364,11 @@ void Server::operator()(InitializeRequest request) {
364364 capabilities.textDocumentSync (TextDocumentSyncKind::kIncremental );
365365 capabilities.documentSymbolProvider (true );
366366
367+ auto completionOptions =
368+ capabilities.completionProvider <CompletionOptions>();
369+
370+ completionOptions.triggerCharacters ({" :" , " ." , " >" });
371+
367372 sendToClient (response);
368373 });
369374}
@@ -478,6 +483,37 @@ void Server::operator()(DocumentSymbolRequest request) {
478483 });
479484}
480485
486+ void Server::operator ()(CompletionRequest request) {
487+ logTrace (std::format (" Did receive CompletionRequest" ));
488+
489+ auto textDocument = request.params ().textDocument ();
490+ auto uri = textDocument.uri ();
491+ auto id = request.id ();
492+ auto line = request.params ().position ().line ();
493+ auto column = request.params ().position ().character ();
494+
495+ const auto & text = documentContents_.at (uri);
496+ auto value = text.value ;
497+
498+ run ([=, this , fileName = pathFromUri (uri)] {
499+ withUnsafeJson ([&](json storage) {
500+ // the version is not relevant for code completion requests as we don't
501+ // need to store the document in the cache.
502+ auto cxxDocument = std::make_shared<CxxDocument>(cli, std::move (fileName),
503+ /* version=*/ 0 );
504+
505+ // cxx expects 1-based line and column numbers
506+ cxxDocument->requestCodeCompletion (line + 1 , column + 1 );
507+ cxxDocument->parse (std::move (value));
508+
509+ CompletionResponse response (storage);
510+ response.id (request.id ());
511+ auto completionItems = response.result <Vector<CompletionItem>>();
512+ sendToClient (response);
513+ });
514+ });
515+ }
516+
481517void Server::operator ()(CancelNotification notification) {
482518 const auto id = notification.params ().id ();
483519
0 commit comments