fix(completion): не дублировать скобку — убрать commit character "(" у вызываемых#4127
Conversation
…у вызываемых
Метод/функция/конструктор получали commitCharacters ["("] одновременно со
вставкой открывающей скобки в insertText (`Имя($0)` со snippetSupport либо
`Имя(` без него). По спецификации LSP commit character вставляется ПОСЛЕ
текста пункта, поэтому ввод "(" при открытом автокомплите давал двойную
скобку (`Имя((`) и ломал signatureHelp.
Скобку (и подъём подсказки через triggerParameterHints) обеспечивает
insertText, поэтому commit character "(" вызываемым больше не задаётся;
"." у свойств, переменных и модулей сохранён.
Co-Authored-By: Claude Opus 4.8 (1M context) <[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 (2)
📝 WalkthroughWalkthrough
ChangesCallable completion commit characters fix
Estimated code review effort🎯 1 (Trivial) | ⏱️ ~5 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 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 |
|
ВОПРОС - а нет ли смысла переделать snippet с вставкой скобок с $0 на commit characters? Будет ли, например, vscode вставлять закрывающую скобку?что вообще в протоколе по поводу commit characters написано, когда их надо использовать? |
|
Хороший вопрос. Коротко: commit characters — это не замена сниппету, это другой механизм, и построить вызов со скобками он не умеет. Что говорит спецификация
То есть commit-символ сначала применяет пункт (вставляет его Будет ли VS Code вставлять закрывающую скобку?От механизма commit characters — нет,
Почему для вызова лучше сниппет
Когда commit characters уместныИх смысл — «принять пункт нажатием символа и продолжить ввод этим символом», когда Итого: сниппет и commit characters решают разные задачи. Правильное сочетание — сниппет |
|



Проблема
При обычном наборе вызова метода (
Список.Добавить(,Сложить(и т.п.) в редакторе появлялась двойная открывающая скобка (Добавить(()), а подсказка по параметрам (signatureHelp) не всплывала.Причина
Пункту автодополнения метода/функции/конструктора одновременно проставлялись:
insertText, который сам вставляет открывающую скобку —Имя($0)(соsnippetSupport) либоИмя((без него), см.applyCallableInsertText;commitCharacters = ["("](фича из feat(CompletionProvider): commitCharacters для членов и вызываемых #4091).По спецификации LSP commit character вставляется после текста выбранного пункта. Поскольку автокомплит открыт во время набора, ввод
(фиксировал пункт (вставив его текст со скобкой) и затем добавлял ещё одну(→Имя((. Курсор оказывался в рассогласованных скобках, иsignatureHelpне поднимался.Конфликт двух свежих фич: commit-символ
(× авто-вставка скобки вinsertText.Исправление
Вызываемым (
Method/Function/Constructor) commit character"("больше не задаётся — открывающую скобку и подъём подсказки уже обеспечиваетinsertText(+triggerParameterHints). Это совпадает с поведением эталонных LSP-серверов (TypeScript LS, gopls, rust-analyzer), которые не объявляют(commit-символом при авто-вставке скобок.Commit character
"."для свойств, переменных и модулей сохранён (ихinsertText— голое имя, дублирования нет).Тест
methodMemberGetsNoCommitCharacterBecauseInsertTextAddsParen(бывш.methodMemberGetsOpenParenCommitCharacter) теперь проверяет, что метод не получает commit character, а егоinsertTextуже несёт скобку.🤖 Generated with Claude Code
Summary by CodeRabbit
Release Notes