fix(inlayhints): показывать значения по умолчанию пропущенных аргументов#4077
fix(inlayhints): показывать значения по умолчанию пропущенных аргументов#4077nixel2007 wants to merge 4 commits into
Conversation
|
Warning Review limit reached
More reviews will be available in 14 minutes and 6 seconds. Learn how PR review limits work. Your organization has run out of usage credits. Purchase more credits in the billing tab to continue. ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
📝 WalkthroughWalkthroughInlay-hint suppliers add nuanced argument handling: platform calls distinguish truly absent from skipped arguments to conditionally display default-value hints, while source-defined calls replace per-reference AST scans with pre-computed lookup maps for performance. ChangesInlay Hint Generation Refinements
Sequence Diagram(s)sequenceDiagram
participant Client as getInlayHints
participant Collector as collectDoCallsByMethodNameRange
participant Map as HashMap_methodName->doCall
participant Generator as toInlayHints
Client->>Collector: traverse AST and collect doCall nodes
Collector->>Map: insert doCall keyed by method-name Range
Client->>Map: lookup doCall for each reference via rangeKey
Map-->>Generator: resolved doCall context
Generator-->>Client: InlayHint list
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
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 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 |
В PlatformMethodCallInlayHintSupplier любой пустой callParam отбрасывался целиком (защита от `Новый Тип()` с единственным пустым аргументом), из-за чего ветка showDefaultValues в buildLabel была недостижима для ПРОПУЩЕННЫХ аргументов (`Метод(а,,б)` и опущенных хвостовых). Теперь пустой довод трактуется как пропущенный аргумент только при наличии нескольких callParam'ов (есть запятая). Для такого аргумента при включённом showDefaultValues показывается hint со значением по умолчанию из сигнатуры. Единственный пустой callParam (`Метод()` / `Новый Тип()` — ноль аргументов) по-прежнему хинтов не даёт. Co-Authored-By: Claude Fable 5 <[email protected]>
…CallInlayHintSupplier Co-Authored-By: Claude Fable 5 <[email protected]>
- S6411/S6485: ключ карты вызовов заменён на String (Comparable), HashMap создаётся через HashMap.newHashMap - S2583: удалён мёртвый null-guard для getAst() (@NullMarked -> non-null) - S2589/S2637: methodNameRange теперь возвращает Optional<Range> вместо null; вызов через ifPresent вместо проверки != null - S4449: nullable methodName() передаётся в Ranges.create только после проверки на null - S126: добавлен завершающий else в methodNameRange и appendHint - S1941: объявление parameters перенесено ближе к использованию - S125/S1612: тест — убрана код-подобная строка из комментария, лямбда заменена на Either::getLeft - покрытие: добавлены тесты на значения по умолчанию, нехватку аргументов и пустой диапазон Co-Authored-By: Claude Fable 5 <[email protected]>
5f4550a to
985700e
Compare
…анить замечания Sonar Co-Authored-By: Claude Fable 5 <[email protected]>
|
|
Раздели на два PR |



Проблема
Две связанные проблемы в inlay-подсказках вызовов методов:
Пропущенные значения по умолчанию. В
PlatformMethodCallInlayHintSupplierлюбой пустойcallParamотбрасывался целиком (защита отНовый Тип()с единственным пустым аргументом). Из-за этого веткаshowDefaultValuesвbuildLabelбыла недостижима для ПРОПУЩЕННЫХ аргументов (Метод(а,,б)и опущенных хвостовых) — подсказка со значением по умолчанию не показывалась.Квадратичный обход AST.
SourceDefinedMethodCallInlayHintSupplierна КАЖДУЮ ссылку метода вызывалTrees.findAllRuleNodesпо всему AST документа (O(ссылки × узлы)). На файлах с множеством вызовов это давало заметную деградацию.Решение
Часть 1 — значения по умолчанию (commit
cfa9f3f).Пустой довод трактуется как пропущенный аргумент только при наличии нескольких
callParam'ов (есть запятая). Для такого аргумента при включённомshowDefaultValuesпоказывается hint со значением по умолчанию из сигнатуры. Единственный пустойcallParam(Метод()/Новый Тип()— ноль аргументов) по-прежнему хинтов не даёт.Часть 2 — перформанс (commit
5f4550a).Все
doCall-узлы документа собираются за ОДИН обход AST вMap<Range, DoCallContext>по диапазону имени вызываемого метода (для конструктора — по диапазону имени типа). Этот диапазон совпадает сReference#selectionRange(), поэтому вызов резолвится по ссылке за O(1)-лукап вместо обхода AST на каждую ссылку. Поведение не изменено.Тесты
PlatformMethodCallInlayHintSupplierUnitTest(часть 1): пропущенный аргумент со значением по умолчанию, отсутствие хинтов дляМетод()/Новый Тип().testHintsAreEmittedForEveryCallSiteOfSameMethodвSourceDefinedMethodCallInlayHintSupplierTest(часть 2): подтверждает, что подсказки эмитятся для каждого из 8 вызовов одного метода (16 хинтов) и позиции не схлопываются — гарантия, что O(1)-лукап не теряет вызовы. Дополнение, не ослабление существующих ассертов.SourceDefinedMethodCallInlayHintSupplierTest,PlatformMethodCallInlayHintSupplierTest,PlatformMethodCallInlayHintSupplierUnitTest,InlayHintProviderTest.🤖 Generated with Claude Code
Summary by CodeRabbit
Bug Fixes
Performance
Tests