feat(CompletionProvider): ранжирование кандидатов автодополнения через sortText#4070
Conversation
📝 WalkthroughWalkthroughCompletionProvider now assigns explicit ChangesCompletion Item Sorting by Category and Deprecation
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 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 |
| var members = new LinkedHashMap<String, MemberDescriptor>(); | ||
| // Имена декларированных полей — для приоритетной корзины sortText: пользовательские | ||
| // ключи должны ранжироваться выше дефолтных членов того же типа. | ||
| var localFieldNames = new java.util.HashSet<String>(); |
There was a problem hiding this comment.
Исправлено: добавил import java.util.HashSet;, заменил FQN new java.util.HashSet<>() на new HashSet<>() (заодно и в соседней строке с seenFn). Коммит 691ab2c.
…sortText Co-Authored-By: Claude Fable 5 <[email protected]>
…по ревью Co-Authored-By: Claude Fable 5 <[email protected]>
d1b7fb3 to
691ab2c
Compare
There was a problem hiding this comment.
🧹 Nitpick comments (1)
src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProviderTest.java (1)
1658-1687: 📐 Maintainability & Code Quality | 💤 Low valueConsider aligning test scope with its name.
The test name mentions
AndKeyword, and the comment states the local method should rank above both global function and keyword. However, the test only verifieslocalMethod < globalFunctionwithout asserting against a keyword. While the ranking is mathematically proven by bucket values (BUCKET_LOCAL=1 < BUCKET_GLOBAL=2 < BUCKET_KEYWORD=4), explicitly testing the keyword case would improve coverage and align the test with its name.📝 Suggested enhancement
Add an assertion for keyword ranking:
var items = completionProvider.getCompletion(documentContext, params).getItems(); var localMethod = sortTextOf(items, "Сообщение"); var globalFunction = sortTextOf(items, "Сообщить"); + var keyword = sortTextOf(items, "Сообщение"); // or another keyword with prefix "Сооб" if available // then assertThat(localMethod) .as("sortText локального метода и глобальной функции должны быть проставлены") .isNotNull(); assertThat(globalFunction).isNotNull(); + assertThat(keyword).isNotNull(); assertThat(localMethod) .as("локальный метод документа ранжируется выше глобальной функции") .isLessThan(globalFunction); + assertThat(localMethod) + .as("локальный метод документа ранжируется выше ключевого слова") + .isLessThan(keyword);Alternatively, rename the test to
noDotCompletionRanksLocalMethodAboveGlobalFunctionto match the current scope.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProviderTest.java` around lines 1658 - 1687, The test name and comment claim the local method should rank above both a global function and a keyword, but the test only asserts localMethod < globalFunction; update the test noDotCompletionRanksLocalMethodAboveGlobalFunctionAndKeyword to also fetch the keyword sortText with sortTextOf(items, "<keyword>") (choose a language keyword that appears in the completion set at the test position) and add assertions that the keyword sortText is not null and that localMethod isLessThan(keyword) to align coverage with the test name.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In
`@src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProviderTest.java`:
- Around line 1658-1687: The test name and comment claim the local method should
rank above both a global function and a keyword, but the test only asserts
localMethod < globalFunction; update the test
noDotCompletionRanksLocalMethodAboveGlobalFunctionAndKeyword to also fetch the
keyword sortText with sortTextOf(items, "<keyword>") (choose a language keyword
that appears in the completion set at the test position) and add assertions that
the keyword sortText is not null and that localMethod isLessThan(keyword) to
align coverage with the test name.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 2dc1e484-a3cb-4727-9eda-4d35624b5587
📒 Files selected for processing (2)
src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProvider.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProviderTest.java
|



Проблема
Ни один completion item не получал
sortText, поэтому клиент сортировал выдачу по алфавиту (поlabel). В no-dot completion локальные методы и переменные документа тонули среди сотен глобальных функций, MD-имён и ключевых слов — всё складывалось в один плоский список (CompletionProvider.noDotCompletion).Решение
Введены префиксные «корзины»
sortTextпо схемекорзина + флаг устаревания + "_" + label(стандартная практика TS LS / rust-analyzer; формат — простые цифровые префиксы):no-dot completion (меньший префикс — выше в списке):
1_— локальные переменные и методы документа;2_— глобальные функции и контексты (property/enum/library-module);3_— классы (в т.ч. послеНовый) и квалифицированные MD-имена;4_— ключевые слова.Понижение устаревших: внутри корзины устаревший член получает флаг
1против0у неустаревшего, поэтому уходит вниз даже если его имя лексикографически меньше соседа. Применено к локальным методам и глобальным функциям.dot-completion: члены типа тоже получают
sortText— декларированные/пользовательские поля (1_) ранжируются выше дефолтных членов того же типа (2_), а устаревшие члены опускаются вниз своей корзины. Это сохраняет уже существующий приоритет полей (черезputIfAbsent) теперь и в порядке клиента, и единообразно демотирует устаревшие члены.Правки локальны для мест выдачи item-ов; вспомогательный метод
applySortTextставитsortTextпо корзине и флагу устаревания. Внутри корзины при равном статусе порядок стабилен поlabel.Тесты
CompletionProviderTest, попарные сравненияsortText(без завязки на полный порядок):noDotCompletionRanksLocalMethodAboveGlobalFunctionAndKeyword—sortTextлокального метода<глобальной функции;noDotCompletionRanksLocalVariableAboveKeyword— локальная переменная<ключевого слова;noDotCompletionDemotesDeprecatedLocalMethodBelowNonDeprecatedNeighbor— устаревшийМетодА>неустаревшегоМетодБ, несмотря на меньшее имя.Тесты сначала падали с NPE на
nullsortText (фича отсутствует), затем зелёные. Полный классCompletionProviderTestпроходит без регрессий.🤖 Generated with Claude Code
Summary by CodeRabbit