Skip to content
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

Доработка ReferenceIndex - Исправлен расчет ссылок на символы-методы + падение анализа #2833

Merged
merged 23 commits into from
Jul 22, 2022

Conversation

artbear
Copy link
Contributor

@artbear artbear commented Jul 1, 2022

Описание

Связанные задачи

Closes #2832

Чеклист

Общие

  • Ветка PR обновлена из develop
  • Отладочные, закомментированные и прочие, не имеющие смысла участки кода удалены
  • Изменения покрыты тестами
  • Обязательные действия перед коммитом выполнены (запускал команду gradlew precommit)

Для диагностик

  • Описание диагностики заполнено для обоих языков (присутствуют файлы для обоих языков, для русского заполнено все подробно, перевод на английский можно опустить)

Дополнительно

@artbear artbear changed the title Доработка ReferenceIndex Доработка ReferenceIndex - Исправлен расчет ссылок на символы-методы Jul 3, 2022
- когда имя параметра совпадает с именем общего модуля
- слегка уточнил тест
@@ -46,6 +50,8 @@ class ReferenceIndexTest {

@Autowired
private ReferenceIndex referenceIndex;
@Autowired
private LocationRepository locationRepository;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не понимаю, зачем здесь этот импорт. И не хотелось бы здесь его иметь.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

другого способа сделать проверку поведения я не нашел.

пробовал через referenceIndex получать информацию, но не удалось сделать падающий тест.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nixel2007 понял, почему у меня не получалось.
в тесте я указывал ссылки на несуществующие методы обшего модуля, поэтому и не получилось.
указал существующие, упал тест, в котором достаточно refIndex

сейчас закоммичу пару коммитов - 1й падающий тест, чтобы была видна разница, и 2й - исправление падения

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

с падающим тестом "неудача" ))

  • ведь исправление падения уже закоммичено.

в общем, теперь все верно - использую только публичный АПИ refIndex

обращение к существующим методам общего модуля
@artbear artbear marked this pull request as ready for review July 3, 2022 11:29
@artbear
Copy link
Contributor Author

artbear commented Jul 3, 2022

МР готов, обе проблемы исправлены.
все тесты проходят.

@artbear
Copy link
Contributor Author

artbear commented Jul 3, 2022

Только Сонар что-то обозлился (
ругается на единственную проблему

image

@artbear
Copy link
Contributor Author

artbear commented Jul 3, 2022

@nixel2007 посмотри, плиз.

жду мержа )
соседнее правило #2827 также ждет

continue;
}
addMethodCall(mdoRef, moduleType, methodNameText, Ranges.create(methodName));
}
}

private boolean isParamNameEqualCommonModule(String mdoRef, Configuration configuration) {
return subParameters.stream()
.map(configuration::getCommonModule)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Думаю, можно выиграть немного вынеся преобразование имен в общие модули в инициализацию subParameters. И тогда конфигурацию можно будет убрать из параметров

Copy link
Contributor Author

@artbear artbear Jul 3, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

согласен.
в коллекции теперь mdoRef

    private Collection<String> calcParams(@Nullable BSLParser.ParamListContext paramList) {
      if (paramList == null) {
        return Collections.emptySet();
      }
      final var configuration = documentContext.getServerContext().getConfiguration();
      return paramList.param().stream()
        .map(BSLParser.ParamContext::IDENTIFIER)
        .filter(Objects::nonNull)
        .map(ParseTree::getText)
        .map(configuration::getCommonModule)
        .filter(Optional::isPresent)
        .flatMap(Optional::stream)
        .map(mdCommonModule -> mdCommonModule.getMdoReference().getMdoRef())
        .collect(Collectors.toSet());
    }

assertThat(referencesTo).hasSize(3);
}

// TODO еще нужен тест для параметра, совпадающего с именем общего модуля, ссылки на общий модуль при этом не должны получаться
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ниже разве тест не это проверяет?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

устаревший коммент. удаляю.

if (!DEFAULT_MODULE_TYPES.contains(moduleType)) {
var moduleType = e.getKey();
if (!DEFAULT_MODULE_TYPES.contains(moduleType)
|| (moduleType == ModuleType.CommonModule && isParamNameEqualCommonModule(mdoRef, configuration))) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сравнение имени общего модуля с именами параметров кажется более эффективным.
В этом цикле у нс есть uri в значении итератора. По нему можно их коллекции configuration.modulesByObject() получить описание общего модуля с именем. И это имя сравнить с subParameters.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тут ИМХО лучше сделать по-другому, не вычисляю uri, а использую уже переданный mdoRef общего модуля
private boolean isParamNameEqualCommonModule(String mdoRef) {
return сommonModuleMdoRefFromSubParams.stream()
.anyMatch(commonModuleMdoRef -> commonModuleMdoRef.equals(mdoRef));
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Даже еще лучше
тип commonModuleMdoRefFromSubParams будет Set

и эта проверка будет выглядеть так (moduleType == ModuleType.CommonModule && commonModuleMdoRefFromSubParams.contains(mdoRef))

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше или хуже тут мерить, нужно.

@artbear
Copy link
Contributor Author

artbear commented Jul 5, 2022

Упал один этап сборки, глюк ГА.

if (!DEFAULT_MODULE_TYPES.contains(moduleType)) {
final var configuration = documentContext.getServerContext().getConfiguration();
Map<ModuleType, URI> modules = configuration.getModulesByMDORef(mdoRef);
for (Map.Entry<ModuleType, URI> e : modules.entrySet()) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ранее в этом месте перешли к обходу только ключей, чтоб уйти от лишнего

var moduleType = e.getKey();

А сейчас затираем эти изменения.
Нужно изменить.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

исправлено.

@nixel2007
Copy link
Member

кстати, с новым mdclasses в девелопе теперь есть двуязычные mdoRef. не помню, тут это надо было или нет.

…ces/ReferenceIndexFiller.java

Co-authored-by: Nikita Fedkin <nixel2007@gmail.com>
@artbear
Copy link
Contributor Author

artbear commented Jul 20, 2022

Последние коммиты исправили падение анализа ветки девелоп на КА 2.5

image

@@ -172,6 +209,9 @@ private void addMethodCall(String mdoRef, ModuleType moduleType, String methodNa
}

private void addCallbackMethodCall(BSLParser.CallParamContext methodName, String mdoRef) {
if (mdoRef.isEmpty()){
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а в каком случае сюда может прилететь пустой mdoRef?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а в каком случае сюда может прилететь пустой mdoRef?

в этот параметр передается результат getModule, который теперь может возвращать пустую строку, если не может получить модуль.

  • важно, чтобы случайно не обработать неподдерживаемую ссылку виды ОбщийМодуль("Имя") или ОбщегоНазначения.ОбщийМодуль("Имя")

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

мне самому не нравится проверка mdoRef на пустоту.
но другой вариант с выносом этой проверки на уровень выше также не очень - дубль проверки на пустоту будет.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не совсем понимаю. Где? В какой строке? Я не могу припомнить ситуации, чтобы мдореф был пуст. Если MdoRefBuilder не может построить mdoRef, он возвращает uri

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

посмотри код вызова вызовов getModule и сам метод getModule и увидишь.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Посмотрел. мне не нравится, что у метода addCallbackMethodCall появилось право не добавлять вызов метода. лучше все же продублировать проверку на пустоту, но не размазывать ответственность. Либо сделать, чтобы getModule возвращал Optional, например.

@artbear artbear changed the title Доработка ReferenceIndex - Исправлен расчет ссылок на символы-методы Доработка ReferenceIndex - Исправлен расчет ссылок на символы-методы + падение анализа Jul 20, 2022
@nixel2007 nixel2007 merged commit 1d57fde into 1c-syntax:develop Jul 22, 2022
@sonarcloud
Copy link

sonarcloud bot commented Jul 22, 2022

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 0 Code Smells

No Coverage information No Coverage information
No Duplication information No Duplication information

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[BUG] Неверно работает расчет ссылок на символы-методы
3 participants