ecode: Implemented search document symbols in current document. Fixed a minor bug in log level configuration.

This commit is contained in:
Martín Lucas Golini
2023-03-01 23:04:15 -03:00
parent 202e044f8a
commit 323c3ebc01
15 changed files with 552 additions and 83 deletions

View File

@@ -1,5 +1,7 @@
#include "lspdocumentclient.hpp"
#include "lspclientplugin.hpp"
#include "lspclientserver.hpp"
#include "lspclientservermanager.hpp"
#include <eepp/system/filesystem.hpp>
#include <eepp/system/iostreamstring.hpp>
#include <eepp/system/log.hpp>
@@ -11,10 +13,16 @@ namespace ecode {
LSPDocumentClient::LSPDocumentClient( LSPClientServer* server, TextDocument* doc ) :
mServer( server ), mDoc( doc ) {
refreshTag();
notifyOpen();
requestSymbolsDelayed();
}
LSPDocumentClient::~LSPDocumentClient() {}
LSPDocumentClient::~LSPDocumentClient() {
UISceneNode* sceneNode = getUISceneNode();
if ( nullptr != sceneNode && 0 != mTag )
sceneNode->removeActionsByTag( mTag );
}
void LSPDocumentClient::onDocumentTextChanged( const DocumentContentChange& change ) {
++mVersion;
@@ -22,6 +30,7 @@ void LSPDocumentClient::onDocumentTextChanged( const DocumentContentChange& chan
// executed in FIFO. Se we accumulate the events in a queue and fire them in correct order.
mServer->queueDidChange( mDoc->getURI(), mVersion, "", { change } );
mServer->getThreadPool()->run( [&, change]() { mServer->processDidChangeQueue(); } );
requestSymbolsDelayed();
}
void LSPDocumentClient::onDocumentUndoRedo( const TextDocument::UndoRedo& /*eventType*/ ) {}
@@ -48,7 +57,9 @@ void LSPDocumentClient::onDocumentClosed( TextDocument* ) {
void LSPDocumentClient::onDocumentDirtyOnFileSystem( TextDocument* ) {}
void LSPDocumentClient::onDocumentMoved( TextDocument* ) {}
void LSPDocumentClient::onDocumentMoved( TextDocument* ) {
refreshTag();
}
void LSPDocumentClient::onDocumentReloaded( TextDocument* ) {
URI uri = mDoc->getURI();
@@ -59,6 +70,7 @@ void LSPDocumentClient::onDocumentReloaded( TextDocument* ) {
server->didClose( uri );
server->didOpen( doc, version );
} );
refreshTag();
}
TextDocument* LSPDocumentClient::getDoc() const {
@@ -73,6 +85,26 @@ int LSPDocumentClient::getVersion() const {
return mVersion;
}
void LSPDocumentClient::onServerInitialized() {
requestSymbols();
}
void LSPDocumentClient::refreshTag() {
String::HashType oldTag = mTag;
mTag = String::hash( mDoc->getURI().toString() );
UISceneNode* sceneNode = getUISceneNode();
if ( nullptr != sceneNode && 0 != oldTag )
sceneNode->removeActionsByTag( oldTag );
}
UISceneNode* LSPDocumentClient::getUISceneNode() {
LSPClientServer* server = mServer;
if ( !server || !server->getManager() || !server->getManager()->getPluginManager() ||
!server->getManager()->getPluginManager()->getUISceneNode() )
return nullptr;
return server->getManager()->getPluginManager()->getUISceneNode();
}
void LSPDocumentClient::notifyOpen() {
eeASSERT( mDoc );
if ( Engine::instance()->isMainThread() ) {
@@ -82,4 +114,32 @@ void LSPDocumentClient::notifyOpen() {
}
}
void LSPDocumentClient::requestSymbols() {
eeASSERT( mDoc );
LSPClientServer* server = mServer;
if ( !server->getCapabilities().documentSymbolProvider )
return;
URI uri = mDoc->getURI();
auto handler = [uri, server]( const PluginIDType& id, LSPSymbolInformationList&& res ) {
server->getManager()->getPlugin()->setDocumentSymbolsFromResponse( id, uri,
std::move( res ) );
};
if ( Engine::instance()->isMainThread() ) {
mServer->getThreadPool()->run(
[server, uri, handler]() { server->documentSymbols( uri, handler ); } );
} else {
server->documentSymbols( uri, handler );
}
}
void LSPDocumentClient::requestSymbolsDelayed() {
if ( !mServer || !mServer->getCapabilities().documentSymbolProvider )
return;
UISceneNode* sceneNode = getUISceneNode();
if ( sceneNode ) {
sceneNode->removeActionsByTag( mTag );
sceneNode->runOnMainThread( [this]() { requestSymbols(); }, Seconds( 1.f ), mTag );
}
}
} // namespace ecode