mirror of
https://github.com/SpartanJ/eepp.git
synced 2026-08-16 22:15:01 +03:00
ecode: Implemented search document symbols in current document. Fixed a minor bug in log level configuration.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user