-
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
Feature/in memory db references to variables #1871
Feature/in memory db references to variables #1871
Conversation
...n/java/com/github/_1c_syntax/bsl/languageserver/context/computer/VariableSymbolComputer.java
Outdated
Show resolved
Hide resolved
...n/java/com/github/_1c_syntax/bsl/languageserver/context/computer/VariableSymbolComputer.java
Outdated
Show resolved
Hide resolved
...n/java/com/github/_1c_syntax/bsl/languageserver/context/computer/VariableSymbolComputer.java
Show resolved
Hide resolved
...n/java/com/github/_1c_syntax/bsl/languageserver/context/computer/VariableSymbolComputer.java
Outdated
Show resolved
Hide resolved
...n/java/com/github/_1c_syntax/bsl/languageserver/context/computer/VariableSymbolComputer.java
Outdated
Show resolved
Hide resolved
...n/java/com/github/_1c_syntax/bsl/languageserver/context/computer/VariableSymbolComputer.java
Outdated
Show resolved
Hide resolved
src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/SymbolTree.java
Outdated
Show resolved
Hide resolved
...om/github/_1c_syntax/bsl/languageserver/diagnostics/DeprecatedTypeManagedFormDiagnostic.java
Outdated
Show resolved
Hide resolved
src/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndex.java
Outdated
Show resolved
Hide resolved
); | ||
} | ||
|
||
private boolean isErrorNode(BSLParser.SubContext ctx) { |
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.
Trees.nodeContainsError не подошла?
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.
Я еще сомневаюсь в этом решении. Вызов isErrorNode нужен для определения методов без символов из-за ошибок разбора. Я выбирал между Trees.nodeContainsError и реализацией в MethodSymbolComputer.visitFunction. Остановился на втором варианте так как хотелось получить одинаковое поведение в любой ситуации.
Возможно Trees.nodeContainsError не был реализован когда создавался MethodSymbolComputer, тогда можно заменить в обоих местах на Trees.nodeContainsError.
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.
Проверил. Trees.nodeContainsError и isErrorNode результат выдают разный. Trees.nodeContainsError не подошла.
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.
а сложилось понимание, в чем отличие? возможно в methodSymbolComputer старое поведение, которое писалось еще на старом ANTLR, который был менее толерантен к ошибкам разбора внутри метода.
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.
Я не посмотрел ((. "Вонзил" в Trees.nodeContainsError вместо isErrorNode и стало валится. Сейчас на свежую голову попробовал - работает!? Может какие изменения повлияли, а может что неправильно делал. Тесты вроде не менял.
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.
Нашел свою старую заметку из первого подхода. Перепроверю:
Метод SymbolTree.getMethodSymbol(BSLParserRuleContext ctx) не может найти метод в дереве символов.
Код содержится в тесте на проверку ошибки разбора в фикстуре src/test/resources/context/computer/MethodSymbolComputerTestParseError.bsl.
Процедура Выполнить()
КонецПроцедуры
При этом проверка Trees.nodeContainsErrors(ctx) ошибку разбора не видит. При поиске получается ренж с именем в котором позиция конца раньше начала.
Spring-boot смотрит на интерфейсы
индексы, derived queries, EAGER чтение символа
Добавлена возможность отличить ссылку на переопределение переменной от использования
для ускорения поиска по ренжам
Основное закончил. Можно кидаться тапками. Еще ковыряюсь с производительностью, но кажется ищу где-то не там. Понемногу получается выиграть, но на больших конфигурациях. На БСП не заметно почти. Если будет, что то толковое получаться, думаю, будет лучше отдельный pr организовать. |
@@ -57,6 +64,16 @@ | |||
@Getter(lazy = true) | |||
List<MethodSymbol> methods = createMethods(); | |||
|
|||
/** | |||
* Список переменных документа |
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.
Мне кажется, или у нас нет готового метода для переменных верхнего уровня? может быть этот метод переименовать в getVariablesFlat, а в пару к нему добавить getModuleLevelVariables, по аналогии с regions?
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.
Не уверен, что это хорошая идея.
Переменные уровня модуля по стандарту, если его конечно соблюдать, будут завернуты в область, а может и не одну. Чтоб его получить придется построить весь список переменных и его фильтрануть по виду переменной. Выигрыша в производительности не получиться как с regions, когда смотрится только первый уровень.
Плюс не вижу диагностик где это может понадобиться.
...java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UnusedLocalVariableDiagnostic.java
Outdated
Show resolved
Hide resolved
...java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UnusedLocalVariableDiagnostic.java
Outdated
Show resolved
Hide resolved
src/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndex.java
Outdated
Show resolved
Hide resolved
Nikita Gryzlov, [05.11.2021 11:58] Nikita Gryzlov, [05.11.2021 11:59] Nikita Gryzlov, [05.11.2021 12:00] Nikita Gryzlov, [05.11.2021 12:01] |
Посмотрел на описанную конструкцию. Понял как-то так. Тут могу на долго засесть. Я бы предложил заняться этим в отдельной ветке. |
Хм... Возможно ошибка не в этом узле, а где-то глубже, и её отловит tree
Contains Error. А что за ctx у тебя на входе? Какой узел?
ср, 10 нояб. 2021 г., 18:43 Eduard Ivanov ***@***.***>:
… ***@***.**** commented on this pull request.
------------------------------
In
src/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndexFiller.java
<#1871 (comment)>
:
> + }
+
+ private SourceDefinedSymbol getVariableScope(BSLParserRuleContext ctx) {
+ var sub = (BSLParser.SubContext) Trees.getRootParent(ctx, BSLParser.RULE_sub);
+ if (sub == null || isErrorNode(sub)) {
+ return documentContext.getSymbolTree().getModule();
+ }
+
+ return scopeCache.computeIfAbsent(sub, subContext -> documentContext
+ .getSymbolTree()
+ .getMethodSymbol(subContext)
+ .orElseThrow()
+ );
+ }
+
+ private boolean isErrorNode(BSLParser.SubContext ctx) {
Нашел свою старую заметку из первого подхода. Перепроверю:
Метод SymbolTree.getMethodSymbol(BSLParserRuleContext ctx) не может найти
метод в дереве символов.
Код содержится в тесте на проверку ошибки разбора в фикстуре
src/test/resources/context/computer/MethodSymbolComputerTestParseError.bsl.
Процедура Выполнить()
КонецПроцедуры
При этом проверка Trees.nodeContainsErrors(ctx) ошибку разбора не видит.
При поиске получается ренж с именем в котором позиция конца раньше начала.
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<#1871 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AAIUSKBB2PYF54I2Z6HVJN3ULKHKZANCNFSM5F2NWZSA>
.
|
Я переносил место поиска после скоупа в Тестируемый кодКод содержит ошибку разбора. Процедура Выполнить()
А = 10;
КонецПроцедуры MethodSymbolComputerctx на входе
VariableSymbolReferenceIndexFinderctx на входе
SymbolTreeСейчас добрался до того, что при поиске формируется subNameNode = ((BSLParser.SubContext) ctx).procedure().procDeclaration().subName();
Range subNameRange = Ranges.create(subNameNode); Проблема не в |
/rebase |
07da734
to
445342e
Compare
stfu, benchmark |
Титанически. спасибо, @qtLex! |
Описание
Неиспользуемые переменные на ссылках
Связанные задачи
Closes #15
Чеклист
Общие
gradlew precommit
)Для диагностик
Дополнительно