feat(SymbolProvider): отмена запроса workspace/symbol через CancelChecker#4094
Conversation
…cker BSLWorkspaceService.symbol переведён с CompletableFuture.supplyAsync на CompletableFutures.computeAsync с CancelChecker, что позволяет прерывать устаревшие запросы (клиент шлёт новый запрос на каждое нажатие клавиши). Метод SymbolProvider.getSymbols теперь принимает CancelChecker и проверяет отмену на границе каждого документа через peek; перегрузка без checker-а убрана, все вызовы переведены на новую сигнатуру. Co-Authored-By: Claude Fable 5 <[email protected]>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (5)
📝 WalkthroughWalkthroughThe PR adds cancellation support to the workspace symbol search API. ChangesWorkspace Symbol Search Cancellation Support
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Проблема
Клиент LSP шлёт
workspace/symbolна каждое нажатие клавиши, но сервер выполнял каждый запрос целиком: ранееBSLWorkspaceService.symbolиспользовалCompletableFuture.supplyAsync, у которого нет механизма отмены. Устаревшие запросы продолжали обходить все документы рабочей области, нагружая сервер впустую.Решение
BSLWorkspaceService.symbolпереведён сCompletableFuture.supplyAsyncнаCompletableFutures.computeAsync, который передаётCancelCheckerв задачу.SymbolProvider.getSymbolsтеперь принимаетCancelCheckerи проверяет отмену на границе каждого документа через.peek(documentContext -> cancelChecker.checkCanceled()). При отмене обход прерываетсяCancellationException.getSymbols(WorkspaceSymbolParams)без checker-а убрана; все вызовы (в т.ч. в тестах) переведены на новую сигнатуру.Сопоставление имён остаётся прежним (regex с откатом на литерал при невалидном выражении) — это PR только про отмену.
Тесты
getSymbolsCancelledCheckerInterruptsSearch— отменённый checker прерывает обходCancellationException.getSymbolsNonCancelledCheckerReturnsFullResult— не-отменённый checker не влияет на результат.SymbolProviderTest,SymbolProviderOScriptConstructorTest,SymbolProviderScriptVariantTestпереведены на новую сигнатуру../gradlew test --tests "*SymbolProviderTest"— BUILD SUCCESSFUL.🤖 Generated with Claude Code
Summary by CodeRabbit
Release Notes
Improvements
Tests