From a836f6335e6ed5b96937988e8987798fd8d16a9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Thu, 11 Jul 2024 20:04:47 -0300 Subject: [PATCH] FoldRangeProvider is now an interface. Fix rare crash in linter plugin. --- include/eepp/ui/doc/foldrangeservice.hpp | 16 ++++++++++------ src/eepp/ui/doc/foldrangeservice.cpp | 10 ++++++---- src/tools/ecode/plugins/linter/linterplugin.cpp | 1 + .../ecode/plugins/lsp/lspdocumentclient.cpp | 8 +++++--- .../ecode/plugins/lsp/lspdocumentclient.hpp | 4 +++- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/include/eepp/ui/doc/foldrangeservice.hpp b/include/eepp/ui/doc/foldrangeservice.hpp index f8d7962fb..3cf214f70 100644 --- a/include/eepp/ui/doc/foldrangeservice.hpp +++ b/include/eepp/ui/doc/foldrangeservice.hpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include @@ -14,10 +13,15 @@ namespace EE { namespace UI { namespace Doc { class TextDocument; +class FoldRangeProvider { + public: + virtual bool foldingRangeProvider() const = 0; + + virtual void requestFoldRange() = 0; +}; + class EE_API FoldRangeServive { public: - using FoldRangeProvider = std::function; - FoldRangeServive( TextDocument* doc ); bool canFold() const; @@ -40,11 +44,11 @@ class EE_API FoldRangeServive { void setFoldingRegions( std::vector regions ); - const FoldRangeProvider& getProvider() const; + FoldRangeProvider* getProvider() const; bool hasProvider() const; - void setProvider( const FoldRangeProvider& provider ); + void setProvider( FoldRangeProvider* provider ); bool isEnabled() const; @@ -53,7 +57,7 @@ class EE_API FoldRangeServive { protected: TextDocument* mDoc; std::unordered_map mFoldingRegions; - FoldRangeProvider mProvider{ nullptr }; + FoldRangeProvider* mProvider{ nullptr }; Mutex mMutex; bool mEnabled{ true }; }; diff --git a/src/eepp/ui/doc/foldrangeservice.cpp b/src/eepp/ui/doc/foldrangeservice.cpp index a49069a84..d433270c7 100644 --- a/src/eepp/ui/doc/foldrangeservice.cpp +++ b/src/eepp/ui/doc/foldrangeservice.cpp @@ -104,7 +104,7 @@ FoldRangeServive::FoldRangeServive( TextDocument* doc ) : mDoc( doc ) {} bool FoldRangeServive::canFold() const { if ( !mEnabled ) return false; - if ( mProvider && mProvider( mDoc, false ) ) + if ( mProvider && mProvider->foldingRangeProvider() ) return true; auto type = mDoc->getSyntaxDefinition().getFoldRangeType(); return type == FoldRangeType::Braces || type == FoldRangeType::Indentation; @@ -114,8 +114,10 @@ void FoldRangeServive::findRegions() { if ( !mEnabled || mDoc == nullptr || !canFold() ) return; - if ( mProvider && mProvider( mDoc, true ) ) + if ( mProvider && mProvider->foldingRangeProvider() ){ + mProvider->requestFoldRange(); return; + } switch ( mDoc->getSyntaxDefinition().getFoldRangeType() ) { case FoldRangeType::Braces: @@ -190,7 +192,7 @@ void FoldRangeServive::setFoldingRegions( std::vector regions ) { mDoc->notifyFoldRegionsUpdated( oldCount, newCount ); } -const FoldRangeServive::FoldRangeProvider& FoldRangeServive::getProvider() const { +FoldRangeProvider* FoldRangeServive::getProvider() const { return mProvider; } @@ -198,7 +200,7 @@ bool FoldRangeServive::hasProvider() const { return mProvider != nullptr; } -void FoldRangeServive::setProvider( const FoldRangeProvider& provider ) { +void FoldRangeServive::setProvider( FoldRangeProvider* provider ) { mProvider = provider; if ( provider == nullptr ) { mFoldingRegions.clear(); diff --git a/src/tools/ecode/plugins/linter/linterplugin.cpp b/src/tools/ecode/plugins/linter/linterplugin.cpp index d84131ed0..1d4dcd141 100644 --- a/src/tools/ecode/plugins/linter/linterplugin.cpp +++ b/src/tools/ecode/plugins/linter/linterplugin.cpp @@ -565,6 +565,7 @@ PluginRequestHandle LinterPlugin::processMessage( const PluginMessage& notificat } TextDocument* LinterPlugin::getDocumentFromURI( const URI& uri ) { + Lock l( mDocMutex ); for ( TextDocument* doc : mDocs ) { if ( doc->getURI() == uri ) return doc; diff --git a/src/tools/ecode/plugins/lsp/lspdocumentclient.cpp b/src/tools/ecode/plugins/lsp/lspdocumentclient.cpp index 8b5fbe000..46ff1d31f 100644 --- a/src/tools/ecode/plugins/lsp/lspdocumentclient.cpp +++ b/src/tools/ecode/plugins/lsp/lspdocumentclient.cpp @@ -30,9 +30,7 @@ void LSPDocumentClient::onServerInitialized() { } void LSPDocumentClient::setupFoldRangeService() { - mDoc->getFoldRangeService().setProvider( [this]( auto, bool requestFolds ) -> bool { - return tryRequestFoldRanges( requestFolds ); - } ); + mDoc->getFoldRangeService().setProvider( this ); if ( mDoc->getFoldRangeService().isEnabled() ) tryRequestFoldRanges( true ); } @@ -57,6 +55,10 @@ bool LSPDocumentClient::tryRequestFoldRanges( bool requestFolds ) { return ret; } +bool LSPDocumentClient::foldingRangeProvider() const { + return mServer->getCapabilities().foldingRangeProvider; +} + void LSPDocumentClient::onDocumentLoaded( TextDocument* ) { refreshTag(); requestSemanticHighlightingDelayed(); diff --git a/src/tools/ecode/plugins/lsp/lspdocumentclient.hpp b/src/tools/ecode/plugins/lsp/lspdocumentclient.hpp index da8ad2c76..af796c7d3 100644 --- a/src/tools/ecode/plugins/lsp/lspdocumentclient.hpp +++ b/src/tools/ecode/plugins/lsp/lspdocumentclient.hpp @@ -20,7 +20,7 @@ namespace ecode { class LSPClientServer; class LSPClientServerManager; -class LSPDocumentClient : public TextDocument::Client { +class LSPDocumentClient : public TextDocument::Client, public FoldRangeProvider { public: LSPDocumentClient( LSPClientServer* server, TextDocument* doc ); @@ -60,6 +60,8 @@ class LSPDocumentClient : public TextDocument::Client { void requestFoldRange(); + bool foldingRangeProvider() const; + bool isRunningSemanticTokens() const; bool isWaitingSemanticTokensResponse() const;