-
Notifications
You must be signed in to change notification settings - Fork 109
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Выведение типов #3268
base: develop
Are you sure you want to change the base?
Выведение типов #3268
Conversation
ОбзорВнесены изменения в функциональность сервера языка BSL, включающие добавление провайдера Изменения
Поэма
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 as PR comments)
Additionally, you can add CodeRabbit Configration File (
|
Qodana Community for JVM18 new problems were found
💡 Qodana analysis was run in the pull request mode: only the changed files were checked Contact Qodana teamContact us at [email protected]
|
src/main/java/com/github/_1c_syntax/bsl/languageserver/types/TypeResolver.java
Fixed
Show fixed
Hide fixed
var maybeDescription = describableSymbol.getDescription(); | ||
if (maybeDescription.isPresent()) { | ||
var description = maybeDescription.get(); | ||
if (description instanceof VariableDescription variableDescription) { |
Check warning
Code scanning / QDJVMC
Statement with empty body
|
||
@Value | ||
public class Type { | ||
private final String name; |
Check warning
Code scanning / QDJVM
@Value modifiers Warning
|
||
@Value | ||
public class Type { | ||
private final String name; |
Check warning
Code scanning / QDJVM
@Value modifiers Warning
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: 2
private List<Type> calculateTypes(SourceDefinedSymbol symbol) { | ||
|
||
// variable description resolver | ||
if (symbol instanceof Describable describableSymbol) { | ||
var maybeDescription = describableSymbol.getDescription(); | ||
if (maybeDescription.isPresent()) { | ||
var description = maybeDescription.get(); | ||
if (description instanceof VariableDescription variableDescription) { | ||
// TODO: use new type information from new bsp-parser | ||
var purposeDescription = variableDescription.getPurposeDescription(); | ||
var typeName = Pattern.compile("^(\\S+)").matcher(purposeDescription).results() | ||
.findFirst() | ||
.map(MatchResult::group) | ||
.orElse(""); | ||
|
||
if (!typeName.isEmpty()) { | ||
return List.of(new Type(typeName)); | ||
} | ||
} | ||
} | ||
} |
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.
Метод calculateTypes
содержит сложную логику разрешения типов. Рассмотрите возможность рефакторинга для улучшения читаемости и использования предварительно скомпилированных шаблонов для регулярных выражений.
private List<Type> calculateTypes(URI uri, Reference reference) { | ||
|
||
// source defined symbol resolver | ||
if (reference.isSourceDefinedSymbolReference()) { | ||
return calculateTypes(reference.getSourceDefinedSymbol().orElseThrow()); | ||
} | ||
|
||
// expression tree resolver | ||
if (reference.getOccurrenceType() == OccurrenceType.DEFINITION) { | ||
var document = serverContext.getDocument(uri); | ||
var ast = document.getAst(); | ||
var position = reference.getSelectionRange().getStart(); | ||
return calculateTypes(uri, ast, position); | ||
} | ||
|
||
// no-op | ||
return Collections.emptyList(); | ||
} |
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.
Метод calculateTypes
корректно обрабатывает различные типы ссылок. Однако, следует обратить внимание на возможное возникновение NullPointerException
при вызове getAst
. Рекомендуется добавить проверку на null
.
- var ast = document.getAst();
+ var ast = document != null ? document.getAst() : null;
+ if (ast == null) return Collections.emptyList();
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
private List<Type> calculateTypes(URI uri, Reference reference) { | |
// source defined symbol resolver | |
if (reference.isSourceDefinedSymbolReference()) { | |
return calculateTypes(reference.getSourceDefinedSymbol().orElseThrow()); | |
} | |
// expression tree resolver | |
if (reference.getOccurrenceType() == OccurrenceType.DEFINITION) { | |
var document = serverContext.getDocument(uri); | |
var ast = document.getAst(); | |
var position = reference.getSelectionRange().getStart(); | |
return calculateTypes(uri, ast, position); | |
} | |
// no-op | |
return Collections.emptyList(); | |
} | |
private List<Type> calculateTypes(URI uri, Reference reference) { | |
// source defined symbol resolver | |
if (reference.isSourceDefinedSymbolReference()) { | |
return calculateTypes(reference.getSourceDefinedSymbol().orElseThrow()); | |
} | |
// expression tree resolver | |
if (reference.getOccurrenceType() == OccurrenceType.DEFINITION) { | |
var document = serverContext.getDocument(uri); | |
var ast = document != null ? document.getAst() : null; | |
if (ast == null) return Collections.emptyList(); | |
var position = reference.getSelectionRange().getStart(); | |
return calculateTypes(uri, ast, position); | |
} | |
// no-op | |
return Collections.emptyList(); | |
} |
3386cf2
to
872b84e
Compare
// expression tree resolver | ||
if (reference.getOccurrenceType() == OccurrenceType.DEFINITION) { | ||
var document = serverContext.getDocument(uri); | ||
var ast = document.getAst(); |
Check warning
Code scanning / QDJVM
Nullability and data flow problems Warning
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: 4
|
||
// TODO: Create LRU cache for calculated types. | ||
|
||
// TODO: Use reference instead of symbol. Refactor hover provider to pass references to markup content builders. |
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.
TODO: Использовать ссылку вместо символа. Рефакторинг поставщика всплывающих подсказок для передачи ссылок в построители содержимого разметки.
Могу ли я помочь с реализацией этого изменения или открыть задачу на GitHub для его отслеживания?
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: 1
7b21327
to
3cb6bbf
Compare
Qodana for JVM27 new problems were found
💡 Qodana analysis was run in the pull request mode: only the changed files were checked Detected 99 dependenciesThird-party software listThis page lists the third-party software dependencies used in bsl-language-server
Contact Qodana teamContact us at [email protected]
|
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: 3
Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Files selected for processing (18)
- src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServer.java (3 hunks)
- src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java (4 hunks)
- src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MarkupContentBuilder.java (2 hunks)
- src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilder.java (2 hunks)
- src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.java (5 hunks)
- src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProvider.java (1 hunks)
- src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/HoverProvider.java (1 hunks)
- src/main/java/com/github/_1c_syntax/bsl/languageserver/types/KnownTypes.java (1 hunks)
- src/main/java/com/github/_1c_syntax/bsl/languageserver/types/Type.java (1 hunks)
- src/main/java/com/github/_1c_syntax/bsl/languageserver/types/TypeResolver.java (1 hunks)
- src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java (2 hunks)
- src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilderTest.java (5 hunks)
- src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilderTest.java (7 hunks)
- src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProviderTest.java (1 hunks)
- src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeResolverTest.java (1 hunks)
- src/test/resources/metadata/oslib/Классы/МойКласс.os (1 hunks)
- src/test/resources/providers/completion.os (1 hunks)
- src/test/resources/types/TypeResolver.os (1 hunks)
Files skipped from review due to trivial changes (1)
- src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeResolverTest.java
Additional comments not posted (19)
src/test/resources/providers/completion.os (1)
1-4
: Код корректно импортирует необходимый модуль и создает экземпляр класса для тестирования функциональности автодополнения. Рекомендуется добавить комментарий к незавершенной строке, чтобы пояснить ее назначение в контексте теста.src/test/resources/metadata/oslib/Классы/МойКласс.os (1)
1-17
: Структура класса корректно разделяет экспортные и неэкспортные методы и процедуры. Убедитесь, что экспортные элементы используются в соответствии с требованиями проекта.src/test/resources/types/TypeResolver.os (1)
1-34
: Файл корректно демонстрирует объявления переменных и определения функций для тестирования разрешения типов. Рекомендуется улучшить четкость аннотаций для лучшего понимания их назначения.src/main/java/com/github/_1c_syntax/bsl/languageserver/types/Type.java (1)
28-28
: Учитывая предыдущие комментарии, аннотация@Value
уже обеспечивает необходимые модификаторы для поляname
. Убедитесь, что это соответствует вашим требованиям к иммутабельности и доступности поля.src/main/java/com/github/_1c_syntax/bsl/languageserver/types/KnownTypes.java (1)
13-38
: Класс корректно управляет типами и символами с использованием потокобезопасной коллекции. Рекомендуется перенести логику из метода обработчика событий в более подходящее место, как указано в комментарии TODO.src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MarkupContentBuilder.java (1)
Line range hint
25-42
: Добавление параметраReference
в методgetContent
улучшает функциональность построения контента для всплывающих окон, позволяя интегрировать больше контекста о символе. Убедитесь, что это изменение корректно интегрировано в остальную часть системы.src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProviderTest.java (2)
19-20
: Класс корректно аннотирован для интеграционного тестирования.
37-55
: ТестcompletionAfterDotOnOSClass
корректно проверяет функциональность автодополнения. Проверки адекватны ожидаемому поведению.src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/HoverProvider.java (1)
55-55
: МетодgetHover
корректно обрабатывает ссылки и генерирует содержимое всплывающей подсказки. ИспользованиеOptional
и лямбда-выражений улучшает читаемость и структуру кода.src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProvider.java (1)
33-67
: МетодgetCompletions
эффективно используетTypeResolver
иKnownTypes
для определения типов и генерации предложений автодополнения. Код хорошо структурирован и использует возможности Java для работы со стримами и опциональными значениями.src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.java (1)
Line range hint
53-81
: МетодgetContent
корректно генерирует разметку для символов переменных, включая сигнатуру, местоположение, описание и типы. Использование вспомогательных методов иTypeResolver
улучшает читаемость и функциональность кода.src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilderTest.java (2)
67-70
: ТестыtestContentFromDirectFile
иtestContentFromManagerModule
адекватно проверяют генерацию содержимого для символов методов из разных модулей. Проверки охватывают структуру и специфические секции содержимого.Also applies to: 134-134
156-159
: ТестtestMethodsFromCommonModule
корректно проверяет генерацию содержимого для методов из общего модуля. Проверки охватывают структуру и специфические секции содержимого.src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilderTest.java (1)
68-71
: ТестыtestFileVarContentFromDirectFile_NoComments
иtestContentFromObjectModule
адекватно проверяют генерацию содержимого для переменных из разных контекстов. Проверки охватывают структуру и специфические секции содержимого.Also applies to: 201-201
src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilder.java (1)
67-67
: Добавлен параметрReference
в методgetContent
. Убедитесь, что все вызовы этого метода обновлены с учетом нового параметра.Verification successful
Добавлен параметр
Reference
в методgetContent
. Убедитесь, что все вызовы этого метода обновлены с учетом нового параметра.
src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/HoverProvider.java
: вызов методаgetContent
обновлен.src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilderTest.java
: вызовы методаgetContent
обновлены.Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Описание: Проверка всех вызовов функции `getContent` на соответствие новой сигнатуре. # Тест: Поиск использования функции. Ожидаем: Только вхождения с новой сигнатурой. rg --type java $'getContent'Length of output: 4422
src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServer.java (1)
342-348
: Добавлен методgetCompletionProvider
для настройки параметров автодополнения. Убедитесь, что эти параметры соответствуют требованиям вашего проекта.src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java (1)
290-297
: Изменение сигнатуры методаgetRootParent
на принятиеRuleNode
вместоBSLParserRuleContext
может повлиять на использование этого метода в кодовой базе.src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java (2)
35-35
: Добавлены новые импорты, связанные с функциональностью автодополнения, что соответствует целям PR.Also applies to: 64-66
378-389
: Методcompletion
корректно реализован и соответствует целям PR, обрабатывая запросы автодополнения.
private final ReferenceResolver referenceResolver; | ||
private final ReferenceIndex referenceIndex; | ||
|
||
// TODO: Create LRU cache for calculated types. |
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.
TODO: Создать кэш LRU для вычисленных типов.
Хотите, чтобы я сгенерировал код для реализации этого кэша или создал задачу на GitHub для отслеживания этой задачи?
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.
Да, попробуй создать кэш
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.
@nixel2007, я предлагаю использовать библиотеку Guava для реализации LRU кэша, так как она предоставляет простой и надежный API для создания и управления кэшем. Вот пример кода, который можно добавить в класс TypeResolver
для интеграции LRU кэша:
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.Cache;
@Component
@RequiredArgsConstructor
public class TypeResolver {
private final ServerContext serverContext;
private final ReferenceResolver referenceResolver;
private final ReferenceIndex referenceIndex;
// Создаем кэш с максимальным размером 100 и автоматическим удалением записей после 10 минут неактивности
private final Cache<String, List<Type>> typesCache = CacheBuilder.newBuilder()
.maximumSize(100)
.expireAfterAccess(10, TimeUnit.MINUTES)
.build();
// Пример метода, использующего кэш
public List<Type> calculateTypes(URI uri, BSLParser.ExpressionContext expression) {
String key = uri.toString() + expression.getText();
return typesCache.get(key, () -> computeTypes(uri, expression));
}
// Метод для вычисления типов, который ранее был реализован
private List<Type> computeTypes(URI uri, BSLParser.ExpressionContext expression) {
// Логика вычисления типов
}
}
Этот код добавляет кэш для хранения вычисленных типов, где ключом является уникальное сочетание URI и текста выражения. Элементы кэша автоматически удаляются после 10 минут неактивности или когда количество элементов превышает 100. Это должно значительно улучшить производительность при повторных вычислениях типов для одних и тех же выражений.
Пожалуйста, дайте знать, если нужно что-то изменить или добавить.
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.
Не хочу использовать guava. Если что-то из библиотек apache?
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.
@nixel2007, для реализации LRU кэша без использования Guava, можно использовать LRUMap
из библиотеки Apache Commons Collections. Вот пример интеграции LRUMap
в класс TypeResolver
:
import org.apache.commons.collections4.map.LRUMap;
import com.github._1c_syntax.bsl.languageserver.context.ServerContext;
import com.github._1c_syntax.bsl.languageserver.context.symbol.Describable;
import com.github._1c_syntax.bsl.languageserver.context.symbol.SourceDefinedSymbol;
import com.github._1c_syntax.bsl.languageserver.context.symbol.Symbol;
import com.github._1c_syntax.bsl.languageserver.context.symbol.description.MethodDescription;
import com.github._1c_syntax.bsl.languageserver.context.symbol.description.TypeDescription;
import com.github._1c_syntax.bsl.languageserver.context.symbol.variable.VariableDescription;
import com.github._1c_syntax.bsl.languageserver.references.ReferenceIndex;
import com.github._1c_syntax.bsl.languageserver.references.ReferenceResolver;
import com.github._1c_syntax.bsl.languageserver.references.model.OccurrenceType;
import com.github._1c_syntax.bsl.languageserver.references.model.Reference;
import com.github._1c_syntax.bsl.languageserver.utils.Ranges;
import com.github._1c_syntax.bsl.languageserver.utils.Trees;
import com.github._1c_syntax.bsl.languageserver.utils.bsl.Constructors;
import com.github._1c_syntax.bsl.parser.BSLParser;
import lombok.RequiredArgsConstructor;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.eclipse.lsp4j.Position;
import org.springframework.stereotype.Component;
import java.net.URI;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;
import java.util.stream.Stream;
@Component
@RequiredArgsConstructor
public class TypeResolver {
private final ServerContext serverContext;
private final ReferenceResolver referenceResolver;
private final ReferenceIndex referenceIndex;
// Создаем LRU кэш с максимальным размером 100
private final LRUMap<String, List<Type>> typesCache = new LRUMap<>(100);
// Пример метода, использующего кэш
public List<Type> calculateTypes(URI uri, BSLParser.ExpressionContext expression) {
String key = uri.toString() + expression.getText();
return typesCache.computeIfAbsent(key, k -> computeTypes(uri, expression));
}
// Метод для вычисления типов, который ранее был реализован
private List<Type> computeTypes(URI uri, BSLParser.ExpressionContext expression) {
// Логика вычисления типов
}
}
Этот код использует LRUMap
для хранения вычисленных типов, где ключом является уникальное сочетание URI и текста выражения. Элементы кэша автоматически удаляются, когда количество элементов превышает 100. Это должно улучшить производительность при повторных вычислениях типов для одних и тех же выражений.
Пожалуйста, дайте знать, если нужно что-то изменить или добавить.
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.
@nixel2007, LRUMap
из Apache Commons Collections по умолчанию не является потокобезопасным. Это означает, что при использовании в многопоточной среде, как в вашем случае с TypeResolver
в качестве синглтона, необходимо предпринять дополнительные шаги для обеспечения потокобезопасности.
Один из подходов — использовать Collections.synchronizedMap
для обертывания LRUMap
, что обеспечит базовую синхронизацию. Вот пример:
import org.apache.commons.collections4.map.LRUMap;
import java.util.Collections;
import java.util.Map;
// Создаем потокобезопасный LRU кэш
private final Map<String, List<Type>> typesCache = Collections.synchronizedMap(new LRUMap<>(100));
Однако, если вы ищете более современное и эффективное решение, рекомендую рассмотреть использование библиотеки Caffeine, которая предоставляет высокопроизводительные потокобезопасные кэши. Caffeine предназначена для использования в многопоточных приложениях и предлагает гибкие стратегии управления кэшем.
Если вам интересно, я могу предоставить пример интеграции Caffeine в ваш TypeResolver
.
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.
Да, интересно, покажи
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.
@nixel2007, вот пример интеграции библиотеки Caffeine для потокобезопасного кэширования в классе TypeResolver
. Caffeine предоставляет высокопроизводительные кэши, подходящие для использования в многопоточных приложениях, и поддерживает различные стратегии управления кэшем.
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
@Component
@RequiredArgsConstructor
public class TypeResolver {
private final ServerContext serverContext;
private final ReferenceResolver referenceResolver;
private final ReferenceIndex referenceIndex;
// Создаем кэш с максимальным размером 100 и автоматическим удалением записей после 10 минут неактивности
private final Cache<String, List<Type>> typesCache = Caffeine.newBuilder()
.maximumSize(100)
.expireAfterAccess(10, TimeUnit.MINUTES)
.build();
// Пример метода, использующего кэш
public List<Type> calculateTypes(URI uri, BSLParser.ExpressionContext expression) {
String key = uri.toString() + expression.getText();
return typesCache.get(key, k -> computeTypes(uri, expression));
}
// Метод для вычисления типов, который ранее был реализован
private List<Type> computeTypes(URI uri, BSLParser.ExpressionContext expression) {
// Логика вычисления типов
}
}
Этот код использует Caffeine для создания кэша, который автоматически удаляет элементы после 10 минут неактивности или когда количество элементов превышает 100. Кэш потокобезопасен и идеально подходит для использования в многопоточной среде вашего TypeResolver
.
Пожалуйста, дайте знать, если нужно что-то изменить или добавить.
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.
Есть ли у Caffeine какая-то интеграция со spring boot? Или его можно свободно использовать через builder?
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.
@nixel2007, Caffeine does not have a dedicated Spring Boot starter or automatic configuration integration like some other libraries. However, it can be seamlessly integrated into a Spring Boot application by manually configuring the cache using its builder.
Here's a basic example of how you can define a Caffeine cache bean in a Spring Boot application:
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CacheConfig {
@Bean
public Cache<String, List<Type>> caffeineCache() {
return Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(100)
.build();
}
}
This configuration class defines a bean for the cache which you can autowire and use throughout your application. This approach gives you the flexibility to customize the cache settings as per your requirements.
Please let me know if you need further details or assistance with setting this up!
var maybeDescription = describableSymbol.getDescription(); | ||
if (maybeDescription.isPresent()) { | ||
var description = maybeDescription.get(); | ||
if (description instanceof VariableDescription variableDescription) { |
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.
Пустое тело условного оператора 'if'.
- if (description instanceof VariableDescription variableDescription) {
+ if (description instanceof VariableDescription variableDescription) {
+ // TODO: Добавить логику обработки
+ }
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
if (description instanceof VariableDescription variableDescription) { | |
if (description instanceof VariableDescription variableDescription) { | |
// TODO: Добавить логику обработки | |
} |
// expression tree resolver | ||
if (reference.getOccurrenceType() == OccurrenceType.DEFINITION) { | ||
var document = serverContext.getDocument(uri); | ||
var ast = document.getAst(); |
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.
В методе calculateTypes
вызов getAst
может привести к NullPointerException
. Рекомендуется добавить проверку на null
перед вызовом этого метода.
- var ast = document.getAst();
+ var ast = document != null ? document.getAst() : null;
+ if (ast == null) return Collections.emptyList();
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
var ast = document.getAst(); | |
var ast = document != null ? document.getAst() : null; | |
if (ast == null) return Collections.emptyList(); |
Описание
Черновик для вычислителя типов.
На данный момент вычисляет типы на лету, поддерживает вычисление для constValue и оператора Новый.
TODO:
Связанные задачи
Closes
Чеклист
Общие
gradlew precommit
)Для диагностик
Дополнительно