Skip to content

Conversation

qtLex
Copy link
Contributor

@qtLex qtLex commented Apr 3, 2021

Описание

Диагностика на неиспользуемые локальные переменные

В дерево символов добавлены переменные создаваемые внутри метода и параметрами методов
Добавлено хранение ссылок на использование переменных.

Работа еще ведется. Есть ряд мест которые хочется порефакторить. В основном они касаются добавления и использования ссылок. В частности ключи для методов и переменных получились разные. Думаю нужно от этого избавиться через использование информации о родителе переменной. Если не получится разделять на несколько мапов.

Выкладываю для оценки результата. Может где-то делаю вредное или пошел не туда. Или может еще какие идеи возникнут.

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

Closes: #15

Чеклист

Общие

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

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

  • Описание диагностики заполнено для обоих языков (перевод на английский не обязателен)

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

@qtLex
Copy link
Contributor Author

qtLex commented Apr 3, 2021

Во еще и оптимизировать нужно

* Ссылка на символ.
*/
@Value
@Builder
Copy link
Member

Choose a reason for hiding this comment

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

если честно, в одном классе странно выглядит и factory-метод of и билдер :)

@qtLex qtLex force-pushed the feature/unused-local-variable-ref-index branch from 2820d68 to 55ba9ef Compare April 10, 2021 21:19
@qtLex qtLex force-pushed the feature/unused-local-variable-ref-index branch from 55ba9ef to 77bda86 Compare April 18, 2021 10:27
* были вызваны из списка Location (URI + Range).
*/
private final Map<MultiKey<String>, MultiValuedMap<String, Location>> referencesTo = new HashMap<>();
private final Map<ReferenceDTO, List <Location>> referencesTo = new HashMap<>();
Copy link
Member

Choose a reason for hiding this comment

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

Возможно здесь стоит использовать concurrent map.

String symbolName;

//@EqualsAndHashCode.Exclude
boolean isWrite;
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.

Да, это была попытка избавиться от поиска по двум ключам без создания второго DTO. Но идея не прошла из-за getReferencesFrom. Reference формируется на основании ключа Map, а если при поиске не учитывается одно из полей, ссылка формируется не правильно. Для двух других коллекций такой проблемы не так как формирование ссылки проходит по значению Map.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Пока временно остановился на варианте, что для коллекции referencesTo isWrite всегда false.

* были вызваны из списка Location (URI + Range).
*/
private final Map<MultiKey<String>, MultiValuedMap<String, Location>> referencesTo = new HashMap<>();
private final Map<ReferenceDTO, List <Location>> referencesTo = new HashMap<>();
Copy link
Member

Choose a reason for hiding this comment

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

А здесь, случаем, не будет просадки производительности за счёт усложнения операции поиска по symbol name? Хотя без бенчей, наверное, и не понять...

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Думаю, нужно профайлить смотреть. без этого не понять где будет проседать

Copy link
Member

Choose a reason for hiding this comment

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

Да вот бенч-то с ума и сходит. при средних 82-83 секундах на пулл реквесте сейчас 283 - https://github.com/1c-syntax/bsl-language-server/pull/1611/checks?check_run_id=2374076050#step:10:54

referenceKey.getScopeName(),
referenceKey.getSymbolKind(),
referenceKey.getSymbolName(),
false
Copy link
Member

@nixel2007 nixel2007 Apr 18, 2021

Choose a reason for hiding this comment

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

ой как опасно. это ж copy/prototype constructor получается, а тут неожиданная мутация

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.

Это эксперимент был. Переделывать буду.

public void addReference(URI uri, Range range, ReferenceDTO referenceKey) {
Location location = new Location(uri.toString(), range);
referencesTo.computeIfAbsent(referenceKey, k -> new ArrayList<>()).add(location);
referencesTo.computeIfAbsent(ReferenceDTO.of(referenceKey), k -> new ArrayList<>()).add(location);
Copy link
Member

Choose a reason for hiding this comment

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

надо бы здесь конструкторы листов/мап заменить на метод-референсы. а то heap pollution дикий

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Я кажется в терминах запутался ((.
k -> new ArrayList<>() заменить на какой-то метод? Что бы абстрактными классами не засорять?

Copy link
Member

Choose a reason for hiding this comment

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

на ArrayList::new

лямбда срабатывает на каждый вызов computeIfAbsent и на каждое срабатывание создаст пустой эррэйлист, а метод-референс (с двумя двоеточиями) сработает только если собственно absent.

}

public Optional<Reference> getReference(URI uri, Range range) {
var t = referencesRanges.getOrDefault(uri, Collections.emptyMap()).get(range);
Copy link
Member

Choose a reason for hiding this comment

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

Optional.ofNullable

@qtLex qtLex force-pushed the feature/unused-local-variable-ref-index branch from 20cf882 to 80000ad Compare April 25, 2021 10:25
@artbear
Copy link
Contributor

artbear commented Aug 31, 2021

@qtLex @nixel2007 а что с этим зависшим ПР?
@qtLex будешь продолжать по нему работать?

правило очень важное и полезное, хочется быстрее в продуктив запустить

@nixel2007
Copy link
Member

По нему ведутся работы параллельно в нескольких ветках. Reference index - сложный механизм, и дорабатывать его нужно аккуратно.

@qtLex
Copy link
Contributor Author

qtLex commented Aug 31, 2021

@artbear Работы ведуться.

@qtLex
Copy link
Contributor Author

qtLex commented Sep 1, 2021

Новый pr #1772

@nixel2007 nixel2007 marked this pull request as draft October 8, 2021 17:42
@artbear
Copy link
Contributor

artbear commented Oct 10, 2021

#1772 смержен.

тогда этот ПР уже невалиден, да?

@nixel2007
Copy link
Member

эм. нет, #1772 не смержен, а просто почему-то закрыт.

@nixel2007
Copy link
Member

наверное потому что я удалил бранч, в который был нацелен PR. @qtLex перетаргетишь на develop тогда?

@qtLex
Copy link
Contributor Author

qtLex commented Oct 10, 2021

Тогда этот ПР уже невалиден, да?

Да. Это PR уже не актуален.

Наверное потому что я удалил бранч, в который был нацелен PR. @qtLex перетаргетишь на develop тогда?

Ага. Я создам новый PR на develop.

Текущее состояние

После оптимизаций немного подразвалились тесты. Так как вся конструкция стала слишком чувствительной к правильности разбора модуля.

Например будет падать на

Перем А;
Перем А;

Я вроде закончил адаптацию, тесты гоняю. Как закончу создам новый PR/

@qtLex qtLex closed this Oct 10, 2021
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.

Неиспользуемая локальная переменная

3 participants