-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Hover для методов, переменных, свойств, конструкторов и констант #18
Conversation
WalkthroughОбновления охватывают несколько модулей, связанных с анализом и обработкой AST, разрешением типов, функциональностью автодополнения, hover и подсказками сигнатур. Внесены изменения для передачи контекста (scope) в методы разрешения типов, добавлена новая функция для вычисления позиций узлов, удалён устаревший файл, обновлены локализация и сигнатуры функций, а также переработаны функции и методы, связанные с scope. Changes
Sequence Diagram(s)sequenceDiagram
participant E as Editor
participant HP as HoverProvider
participant SD as symbolDescription
participant CD as constructorDescription
participant MD as methodDescription
participant FD as fieldDescription
E->>HP: Запрос hover (model, position)
HP->>SD: symbolDescription(symbol, model)
alt Если символ — конструктор
SD->>CD: constructorDescription(typeId)
CD-->>SD: Описание конструктора
else Если символ — метод
SD->>MD: methodDescription(symbol, model)
MD-->>SD: Описание метода
else Если символ — поле
SD->>FD: fieldDescription(symbol, model)
FD-->>SD: Описание поля
end
SD-->>HP: Hover content
HP-->>E: Результат hover
sequenceDiagram
participant P as BslParser
participant E as EditorScope
participant S as Symbol
P->>E: Получение scope через геттер
P->>S: calculateType(expression) с передачей scope
S-->>P: Возврат типа с учетом scope
Possibly related PRs
Poem
✨ Finishing Touches
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (15)
src/bsl/scope/platform/loader.ts (1)
66-66
: Проверьте корректность передачи описания типа.Убедитесь, что
t.description
неundefined
илиnull
при созданииPredefinedType
. При необходимости добавьте обработку отсутствующего значения.src/bsl-tree-sitter/bslAst.ts (4)
246-246
: Учитывайте влияние методаgetMissings
на производительность.Вызов
this.getMissings()
может быть дорогим при больших файлах. Если требуется часто вызывать этот метод, рассмотрите кэширование результатов.
248-248
: Избегайтеconsole.log
в конечной сборке.Логи с пропущенными узлами могут быть полезны при отладке, но в продакшене лучше использовать специализированный логгер или снимать логи во время разработки.
250-250
: Учтите стоимость вызоваgetErrors
при больших входных данных.Проверку на ошибки лучше выполнять выборочно или хранить результат при необходимости повторного использования.
252-252
: Рассмотрите удаление отладочныхconsole.log
вызовов.Как и в предыдущем случае, для продакшена лучше использовать централизованный логгер, а не прямой вывод в консоль.
src/bsl/features/hoverProvider.ts (2)
9-22
: Реализована асинхронная функцияprovideHover
.Логика выглядит ясной: определяется символ, загружается описание, затем формируется массив Markdown. Если в будущем планируется крупноштабное логгирование, рассмотрите выделение отладочных сообщений в отдельную систему логирования.
46-58
: ФункцияconstructorDescription
для описания конструктора.Перенос логики в отдельную функцию способствует модульности. Кроме того, в строке 49 статический анализ рекомендует использовать optional chain:
const ctor = await GlobalScope.getConstructor?.(typeId);Это поможет избежать ошибок при отсутствии метода или при недоступности
GlobalScope
.🧰 Tools
🪛 Biome (1.9.4)
[error] 49-49: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
src/bsl-tree-sitter/symbols/factory.ts (2)
39-39
: Название функцииfindParenNode
может ввести в заблуждение.Уточните смысл, ведь метод неявно ищет не только скобки, но и поднимается вверх по AST. Возможно, стоит переименовать для большей ясности.
183-183
: ПрисвоениеlastNode = node
.Можно отнести это присвоение в код цикла, чтобы явнее подчеркнуть обновление
lastNode
после обработки каждого шага.src/bsl/scopeProvider.ts (3)
17-26
: Рассмотрите удаление отладочныхconsole.debug
в продакшене.Также логика выглядит понятной: при наличии
symbol.path
пытаемся сначала вычислить тип для пути, а затем ищем участника в полученном скоупе.🧰 Tools
🪛 Biome (1.9.4)
[error] 21-21: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
21-21
: Используйте optional chaining для массива.Статический анализ предлагает заменить:
if (symbol.path && symbol.path.length) { ... }на
if (symbol.path?.length) { ... }Читать будет лаконичнее и безопаснее, если
path
может быть не задан.🧰 Tools
🪛 Biome (1.9.4)
[error] 21-21: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
60-93
: Дублирование логики поиска скоупа.Функция
objectScope
во многом повторяет идею разрешения типа через цепочку. Возможно, есть смысл объединить сresolveExpressionTypeId
в один метод или извлечь общий код.🧰 Tools
🪛 Biome (1.9.4)
[error] 79-79: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
src/bsl-tree-sitter/symbols/expressions.ts (3)
49-50
: Возможные уточнения дляvalueType
.Поле
valueType
может быть расширено с учётом специфики типов (например,literalType
). Но текущий вариант тоже рабочий.
105-105
: Небольшая опечатка вtoString()
: "Filed" вместо "Field".Рекомендуется поправить для единообразия.
Примените патч:
- return 'Filed ' + this.name + (this.path.length ? ' of ' + this.path.join('.') : ' global') + return 'Field ' + this.name + (this.path.length ? ' of ' + this.path.join('.') : ' global')
145-145
: Частичная локализация строки дляMethodCall
.Сейчас возвращается
'Call ' + this.name
. Для единообразия лучше использовать русский: напр. «Вызов <...>».- return 'Call ' + this.name + (this.path.length ? ' of ' + this.path.join('.') : ' global') + return 'Вызов ' + this.name + (this.path.length ? ' из ' + this.path.join('.') : ' (глобальный контекст)')
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (12)
src/bsl-tree-sitter/bslAst.ts
(6 hunks)src/bsl-tree-sitter/expression.ts
(0 hunks)src/bsl-tree-sitter/symbols/expressions.ts
(8 hunks)src/bsl-tree-sitter/symbols/factory.ts
(5 hunks)src/bsl/features/completionItemProvider.ts
(2 hunks)src/bsl/features/hoverProvider.ts
(1 hunks)src/bsl/features/signatureHelpProvider.ts
(3 hunks)src/bsl/scope/methodScope.ts
(1 hunks)src/bsl/scope/platform/loader.ts
(2 hunks)src/bsl/scopeProvider.ts
(4 hunks)src/scope/symbols.ts
(2 hunks)src/scope/types.ts
(1 hunks)
💤 Files with no reviewable changes (1)
- src/bsl-tree-sitter/expression.ts
🧰 Additional context used
🪛 Biome (1.9.4)
src/bsl/features/hoverProvider.ts
[error] 49-49: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
src/bsl/scopeProvider.ts
[error] 21-21: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
🔇 Additional comments (45)
src/scope/symbols.ts (2)
5-6
: Добавление типа символа для переменных.Расширение перечисления
SymbolType
с помощью нового типаvariable
- хорошее решение для разделения свойств и переменных, что позволяет более точно определять тип символа в системе.
30-30
: Явное указание свойства name в интерфейсе MethodSignature.Добавление обязательного свойства
name
в интерфейс методически правильно, так как это гарантирует, что у каждой сигнатуры метода будет имя, что важно для корректной работы hover-подсказок.src/bsl/scope/methodScope.ts (2)
21-25
: Корректное использование типа символа для переменных метода.Изменение типа символа с
SymbolType.property
наSymbolType.variable
для переменных метода соответствует семантике данных элементов и правильно использует добавленный тип символа.
26-29
: Корректное использование типа символа для параметров метода.Изменение типа символа с
SymbolType.property
наSymbolType.variable
для параметров метода соответствует семантике данных элементов и корректно классифицирует их как переменные.src/scope/types.ts (2)
10-10
: Добавление описания для предопределенных типов.Добавление свойства
description
в классPredefinedType
позволяет хранить дополнительную информацию о типе, что будет полезно для отображения в hover-подсказках.
12-16
: Расширение конструктора для поддержки описания.Обновление конструктора для принятия и сохранения параметра
description
- логичное дополнение к добавленному свойству. Опциональность параметра обеспечивает обратную совместимость.src/bsl/features/completionItemProvider.ts (4)
18-18
: Оптимизация получения области видимости редактора.Введение переменной
editorScope
для хранения результата вызоваEditorScope.getScope(model)
повышает производительность за счет устранения повторных вызовов одной и той же функции.
21-21
: Использование закешированной области видимости.Использование предварительно полученной области видимости
editorScope
вместо повторного вызова функции - хорошая оптимизация.
23-23
: Оптимизация при разрешении типа выражения.Использование предварительно полученной области видимости
editorScope
при разрешении типа выражения для символа - правильное применение оптимизации.
108-109
: Добавление поддержки типа переменной в элементах автодополнения.Добавление обработки
SymbolType.variable
в функцииcompletionItemKind
обеспечивает правильное отображение переменных в списке автодополнения, что улучшает UX редактора.src/bsl/scope/platform/loader.ts (1)
110-110
: Проверьте наличие и корректность имени конструктора.Новая строка
name: s.name
важна для идентификации конструктора. Убедитесь, чтоs.name
не пустое и содержит корректное название.src/bsl-tree-sitter/bslAst.ts (4)
8-8
: Импорт в правильном месте.Добавление
EditorScope
иScope
выглядит корректным и согласуется с остальным кодом.
42-44
: Добавлен геттер для scope.Метод чтения
scope
изmodel
улучшает доступ к глобальному окружению. Убедитесь, что при отсутствииmodel
любая логика, полагающаяся наscope
, корректно обрабатываетundefined
.
205-205
: Убедитесь в обработкеundefined
значенияthis.scope
.При вызове
symbol.getResultTypeId(this.scope)
проверьте, чтоthis.scope
не равноundefined
, чтобы избежать потенциальных ошибок.
288-295
: ФункцияsymbolPosition
добавлена корректно.Этот метод упрощает доступ к позициям узла и повышает читаемость кода. При этом также можно предусмотреть проверку на
node.isNamed
для более точной фильтрации.src/bsl/features/signatureHelpProvider.ts (3)
33-33
: Дополнен вызовcreateConstructorSignatures
с параметромmodel
.Это согласуется с обновлённой сигнатурой. Убедитесь, что передаваемая модель всегда актуальна.
58-59
: Обновление сигнатурыcreateConstructorSignatures
.Добавление
model: editor.ITextModel
улучшает доступ кscope
. Проследите, чтобы функция корректно обрабатывала отсутствиеscope
.
87-87
: ИспользованиеscopeProvider.resolveSymbolMember
.Переход к централизованному способу разрешения символов увеличивает гибкость. Убедитесь, что метод не вернёт
undefined
в критический момент.src/bsl/features/hoverProvider.ts (5)
1-2
: Импорт поддержки hover с учётом новых сущностей.Подключение
Constructor
,Expression
и других типов согласуется с общим подходом к AST-символам.
5-6
: ИмпортGlobalScope
иscopeProvider
.Добавление этих зависимостей выглядит обоснованным, учитывая логику hover. Убедитесь, что циклических зависимостей не возникает.
26-44
: Вынесена генерация контента вsymbolDescription
.Разделение ответственности упрощает чтение кода. Убедитесь, что для неизвестных типов символов при необходимости возвращается подходящее сообщение, чтобы избежать пустого hover.
60-76
: ДобавленаmethodDescription
для предоставления информации о методах.Использование
scopeProvider.resolveSymbolMember
согласуется с остальными обновлениями. При возвратеundefined
стоит явно указывать, что метод не найден.
78-117
: ФункцияfieldDescription
предоставляет информацию о полях.Реализация охватывает типы
variable
,property
,function
,procedure
и т.д. Текст описаний выглядит информативно. Убедитесь, что все случаи корректно обрабатывают пустое полеdescription
и неизвестныйmemberType
.src/bsl-tree-sitter/symbols/factory.ts (7)
16-16
: Включениеassignment_statement
кажется логичным.Добавление ещё одного типа узла для разрешения символов расширяет покрытие и может улучшить обработку. Посмотрите, достаточно ли тестов учитывают сценарии с присваиванием.
36-36
: Назначение символа напрямую выглядит корректно.Убедитесь, что
symbol
корректно обрабатывается в местах, где вызываетсяcreateSymbolForSuitableNode
.
41-46
: Проверьте логику определения символа приassignment_statement
.Условие выглядит узкоспециализированным. Нужно убедиться, что для других возможных типов узлов инициализация
symbol
происходит корректно. Также обратите внимание, что при переприсвоенииnode = currentExpression
может возникнуть путаница в типах.
68-68
: Проверка обработкиidentifier
.Сейчас
identifier
обрабатывается так же, какaccess
иproperty_access
. Убедитесь, что нет необходимости в отдельном сценарии, если где-то нужны дополнительные проверки наidentifier
.
176-176
: Будьте осторожны сaccessNode.firstChild
.Если
accessNode.firstChild
равенnull
, выражениеlet node: Node | null = ... ? ... : ...;
может стать неопределённым при дальнейшем использовании. Возможно, стоит добавить дополнительную проверку или fall-back логику.
178-178
: ОпределениеlastNode
выглядит понятным.Хранение предыдущего узла внутри цикла удобно для логики, которая анализирует контекст последнего узла.
202-202
: Проверка на точку'.'
выглядит уместной.Добавление пустой строки в токены важно для корректной обработки цепочки. Подход кажется верным.
src/bsl/scopeProvider.ts (3)
12-15
: ПараметрыresolveExpressionType
упрощают интерфейс.Передача
scope
вместоmodel
делает вызов более гибким.
42-58
: Учёт отсутствияmember
и асинхронности.Функция корректно обрабатывает сценарий, когда
member
может бытьundefined
, но проверьте случаи, гдеmember.type
возвращает синхронные/асинхронные значения.
95-107
: Поиск в глобальном скоупе выглядит корректным.Проверка
member.type
и последующий вызовGlobalScope.resolveType
покрывают стандартный случай.src/bsl-tree-sitter/symbols/expressions.ts (12)
1-2
: ИмпортscopeProvider
иScope
расширяет возможности типа.Добавление этих зависимостей выглядит целесообразным для передачи актуального скоупа в методы.
18-18
: Передачаscope
вgetResultTypeId
.Обновление интерфейса даёт гибкость для вычисления типа в контексте.
45-45
: Абстрактный методgetResultTypeId(scope: Scope | undefined)
.Чёткое объявление обеспечивает единообразие во всех наследниках.
55-55
: Локализация для константы выглядит согласованной.Отображение на русском языке соответствует остальным классам.
58-58
: Упрощённая реализацияgetResultTypeId
.Возвращение значения типа без дополнительной логики видится корректным для константы.
68-68
: Использование слова «Неизвестный».Язык локализован, соответствует остальным строкам.
70-70
: МетодgetResultTypeId
вNone
.Корректно возвращает
undefined
, так как тип отсутствует.
85-85
: Локализованное отображение конструктора.Формирование строки «Конструктор <имя>» делает код более понятным.
87-87
: Возврат типа конструктора.Возвращаете имя как тип. Убедитесь, что именованному типу действительно соответствует конструкция.
110-110
: ИспользованиеscopeProvider.resolveSymbolMember
вFieldAccess
.Логика асинхронного резолва типа выглядит согласованной с остальным кодом.
128-128
: Схожая реализация дляUnknown
.Аналогично выходит в
scopeProvider
для попытки определить тип.
149-149
: Асинхронный способ получения типа метод-вызова.Подход одинаков с
FieldAccess
иUnknown
, выглядит логично и согласованно.
Close #14
Close #13
Summary by CodeRabbit
Новые возможности
Рефакторинг