diff --git a/src/eepp/ui/doc/foldrangeservice.cpp b/src/eepp/ui/doc/foldrangeservice.cpp index 2c809fa03..34d1bb38d 100644 --- a/src/eepp/ui/doc/foldrangeservice.cpp +++ b/src/eepp/ui/doc/foldrangeservice.cpp @@ -281,14 +281,14 @@ bool FoldRangeService::isFoldingRegionInLine( Int64 docIdx ) { void FoldRangeService::shiftFoldingRegions( Int64 fromLine, Int64 numLines ) { Lock l( mMutex ); FoldingRegions foldingRegions; - + if ( numLines < 0 ) { Int64 removedLines = -numLines; Int64 toLine = fromLine + removedLines; for ( auto& foldingRegion : mFoldingRegions ) { auto& range = foldingRegion.second; - + if ( range.start().line() >= toLine ) { range.start().setLine( range.start().line() + numLines ); range.end().setLine( range.end().line() + numLines ); diff --git a/src/eepp/ui/doc/textdocument.cpp b/src/eepp/ui/doc/textdocument.cpp index 48f3a61ba..51f4d9ba0 100644 --- a/src/eepp/ui/doc/textdocument.cpp +++ b/src/eepp/ui/doc/textdocument.cpp @@ -4165,8 +4165,14 @@ void TextDocument::notifyDocumentSaved() { } void TextDocument::notifyDocumentClosed() { - Lock l( mClientsMutex ); - for ( auto& client : mClients ) { + std::vector clientsCopy; + { + Lock l( mClientsMutex ); + clientsCopy.reserve( mClients.size() ); + for ( auto& client : mClients ) + clientsCopy.push_back( client ); + } + for ( auto& client : clientsCopy ) { client->onDocumentClosed( this ); } } diff --git a/src/eepp/ui/uicodeeditor.cpp b/src/eepp/ui/uicodeeditor.cpp index 6f56918bd..45979eb60 100644 --- a/src/eepp/ui/uicodeeditor.cpp +++ b/src/eepp/ui/uicodeeditor.cpp @@ -5391,20 +5391,31 @@ bool UICodeEditor::stopMinimapDragging( const Vector2f& mousePos ) { return false; } +static void debounceFindRegions( UISceneNode* sceneNode, std::weak_ptr weakDoc, + Time refreshTime, String::HashType tag ) { + sceneNode->debounce( + [sceneNode, weakDoc, refreshTime, tag]() { + auto doc = weakDoc.lock(); + if ( doc ) { + if ( doc->getHighlighter()->isTokenizingAsync() ) { + debounceFindRegions( sceneNode, weakDoc, refreshTime, tag ); + } else { + doc->getFoldRangeService().findRegions(); + } + } + }, + refreshTime, tag ); +} + void UICodeEditor::findRegionsDelayed() { if ( !mDoc->getFoldRangeService().canFold() ) return; UISceneNode* sceneNode = getUISceneNode(); if ( sceneNode ) { - TextDocument* doc = mDoc.get(); - sceneNode->debounce( - [this, doc]() { - if ( doc->getHighlighter()->isTokenizingAsync() ) - findRegionsDelayed(); - else - doc->getFoldRangeService().findRegions(); - }, - mFoldsIsFirst ? Milliseconds( 100 ) : mFoldsRefreshTime, mTagFoldRange ); + std::weak_ptr weakDoc = mDoc; + debounceFindRegions( sceneNode, weakDoc, + mFoldsIsFirst ? Milliseconds( 100 ) : mFoldsRefreshTime, + mTagFoldRange ); mFoldsIsFirst = false; } diff --git a/src/tools/ecode/plugins/lsp/lspdocumentclient.cpp b/src/tools/ecode/plugins/lsp/lspdocumentclient.cpp index af1deabfe..0e99f9240 100644 --- a/src/tools/ecode/plugins/lsp/lspdocumentclient.cpp +++ b/src/tools/ecode/plugins/lsp/lspdocumentclient.cpp @@ -41,6 +41,7 @@ void LSPDocumentClient::setupFoldRangeService() { LSPDocumentClient::~LSPDocumentClient() { mDoc->getFoldRangeService().setProvider( nullptr ); + mDoc->unregisterClient( this ); mDoc = nullptr; UISceneNode* sceneNode = getUISceneNode(); if ( nullptr != sceneNode && 0 != mTag )