-
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
WIP Add diagnostic for AttachIdleHandler #1257
base: develop
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
# Использование метода ПодключитьОбработчикОжидания (AttachIdleHandler) | ||
|
||
| Тип | Поддерживаются<br/>языки | Важность | Включена<br/>по умолчанию | Время на<br/>исправление (мин) | Тэги | | ||
| :-: | :-: | :-: | :-: | :-: | :-: | | ||
| `Ошибка` | `BSL`<br/>`OS` | `Информационный` | `Да` | `1` | `error`<br/>`unpredictable` | | ||
|
||
<!-- Блоки выше заполняются автоматически, не трогать --> | ||
## Описание диагностики | ||
Подключение или отключение обработчика ожидания с указанием несуществующего метода | ||
|
||
## Примеры | ||
Неправильно | ||
|
||
```Bsl | ||
|
||
&НаКлиенте | ||
Процедура НайтиСтрокуСОшибкой(Команда) | ||
|
||
ПодключитьОбработчикОжидания("НеизвестныйМетод", 0.1, Истина); | ||
|
||
КонецПроцедуры | ||
|
||
``` | ||
|
||
Правильно | ||
|
||
```Bsl | ||
&НаКлиенте | ||
Процедура НайтиСтроку(Команда) | ||
|
||
ПодключитьОбработчикОжидания("ВыполнитьПоиск", 0.1, Истина); | ||
|
||
КонецПроцедуры | ||
|
||
&НаКлиенте | ||
Процедура ВыполнитьПоиск() | ||
|
||
КонецПроцедуры | ||
|
||
``` | ||
## Источники | ||
|
||
* Полезная информация: [Отложенная обработка события элемента управления в форме](https://its.1c.ru/db/metod8dev/content/1820/hdoc) | ||
|
||
## Сниппеты | ||
|
||
<!-- Блоки ниже заполняются автоматически, не трогать --> | ||
### Экранирование кода | ||
|
||
```bsl | ||
// BSLLS:AttachIdleHandler-off | ||
// BSLLS:AttachIdleHandler-on | ||
``` | ||
|
||
### Параметр конфигурационного файла | ||
|
||
```json | ||
"AttachIdleHandler": false | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
# Usage AttachIdleHandler (AttachIdleHandler) | ||
|
||
| Type | Scope | Severity | Activated<br/>by default | Minutes<br/>to fix | Tags | | ||
| :-: | :-: | :-: | :-: | :-: | :-: | | ||
| `Error` | `BSL`<br/>`OS` | `Info` | `Yes` | `1` | `error`<br/>`unpredictable` | | ||
|
||
<!-- Блоки выше заполняются автоматически, не трогать --> | ||
## Description | ||
Attach or detach idle handler with not existed method | ||
|
||
## Examples | ||
|
||
BAD | ||
|
||
```Bsl | ||
|
||
&НаКлиенте | ||
Процедура НайтиСтрокуСОшибкой(Команда) | ||
|
||
ПодключитьОбработчикОжидания("НеизвестныйМетод", 0.1, Истина); | ||
|
||
КонецПроцедуры | ||
|
||
``` | ||
|
||
GOOD | ||
|
||
```Bsl | ||
&НаКлиенте | ||
Процедура НайтиСтроку(Команда) | ||
|
||
ПодключитьОбработчикОжидания("ВыполнитьПоиск", 0.1, Истина); | ||
|
||
КонецПроцедуры | ||
|
||
&НаКлиенте | ||
Процедура ВыполнитьПоиск() | ||
|
||
КонецПроцедуры | ||
|
||
``` | ||
## Sources | ||
|
||
* Usage info: [Отложенная обработка события элемента управления в форме](https://its.1c.ru/db/metod8dev/content/1820/hdoc) | ||
|
||
## Snippets | ||
|
||
<!-- Блоки ниже заполняются автоматически, не трогать --> | ||
### Diagnostic ignorance in code | ||
|
||
```bsl | ||
// BSLLS:AttachIdleHandler-off | ||
// BSLLS:AttachIdleHandler-on | ||
``` | ||
|
||
### Parameter for config | ||
|
||
```json | ||
"AttachIdleHandler": false | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
/* | ||
* This file is a part of BSL Language Server. | ||
* | ||
* Copyright © 2018-2020 | ||
* Alexey Sosnoviy <[email protected]>, Nikita Gryzlov <[email protected]> and contributors | ||
* | ||
* SPDX-License-Identifier: LGPL-3.0-or-later | ||
* | ||
* BSL Language Server is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU Lesser General Public | ||
* License as published by the Free Software Foundation; either | ||
* version 3.0 of the License, or (at your option) any later version. | ||
* | ||
* BSL Language Server is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* Lesser General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU Lesser General Public | ||
* License along with BSL Language Server. | ||
*/ | ||
package com.github._1c_syntax.bsl.languageserver.diagnostics; | ||
|
||
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticInfo; | ||
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata; | ||
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity; | ||
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag; | ||
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType; | ||
import com.github._1c_syntax.bsl.languageserver.utils.variable.types.V8TypeHelper; | ||
import com.github._1c_syntax.bsl.parser.BSLParser; | ||
import com.github._1c_syntax.mdclasses.metadata.additional.ModuleType; | ||
import com.github._1c_syntax.utils.CaseInsensitivePattern; | ||
import org.antlr.v4.runtime.tree.ParseTree; | ||
|
||
import java.util.regex.Pattern; | ||
|
||
@DiagnosticMetadata( | ||
type = DiagnosticType.ERROR, | ||
severity = DiagnosticSeverity.INFO, | ||
minutesToFix = 1, | ||
modules = { | ||
ModuleType.FormModule | ||
}, | ||
tags = { | ||
DiagnosticTag.ERROR, | ||
DiagnosticTag.UNPREDICTABLE | ||
} | ||
MinimaJack marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
) | ||
public class AttachIdleHandlerDiagnostic extends AbstractVisitorDiagnostic { | ||
|
||
private static final Pattern MESSAGE_PATTERN_ATTACH = CaseInsensitivePattern.compile( | ||
"ПодключитьОбработчикОжидания|AttachIdleHandler" | ||
); | ||
private static final Pattern MESSAGE_PATTERN_DETACH = CaseInsensitivePattern.compile( | ||
"ОтключитьОбработчикОжидания|DetachIdleHandler" | ||
); | ||
|
||
public AttachIdleHandlerDiagnostic(DiagnosticInfo info) { | ||
super(info); | ||
} | ||
|
||
@Override | ||
public ParseTree visitGlobalMethodCall(BSLParser.GlobalMethodCallContext ctx) { | ||
|
||
if (checkGlobalMethodCall(ctx)) { | ||
diagnosticStorage.addDiagnostic(ctx.methodName(), getMessage(ctx)); | ||
} | ||
|
||
return super.visitGlobalMethodCall(ctx); | ||
} | ||
|
||
/** | ||
* Получает сообщение диагностики для пользователя | ||
* | ||
* @param ctx контекст узла | ||
* @return В случае если передан контекст метода, параметризованное сообщение, | ||
* первым параметром которого <b>всегда</b> будет имя метода. | ||
* В противном случае возвращается обычное сообщение без параметров. | ||
*/ | ||
protected String getMessage(BSLParser.GlobalMethodCallContext ctx) { | ||
return ctx.methodName().getText(); | ||
} | ||
|
||
protected boolean checkGlobalMethodCall(BSLParser.GlobalMethodCallContext ctx) { | ||
|
||
boolean isAttachHandler = MESSAGE_PATTERN_ATTACH.matcher(ctx.methodName().getText()).matches(); | ||
if (!(isAttachHandler | ||
|| MESSAGE_PATTERN_DETACH.matcher(ctx.methodName().getText()).matches())) { | ||
return false; | ||
} | ||
|
||
var callContext = ctx.doCall(); | ||
// Проверка на существование метода в текущем контексте без параметров | ||
boolean hasError = V8TypeHelper.getStringConstantFromFirstParam(callContext) | ||
.get().map(methodName -> documentContext.getSymbolTree().getMethods() | ||
.stream() | ||
.noneMatch(method -> method.getName().equalsIgnoreCase(methodName) && method.getParameters().size() == 0) | ||
).orElse(false); | ||
|
||
if (!isAttachHandler) { | ||
return hasError; | ||
} | ||
|
||
// Проверка что при таймауте меньше 1 секунды, третий параметр не равен Ложь | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ты решил все-таки смешать два моих ишуза в один ( и отсюда проблемы:
предлагаю рассмотреть возможность отдельной диагностики для 3го параметра ) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @artbear
на самом деле чуток сложнее, там может быть булево, выражение( вызов метода, ЛОЖЬ ИЛИ Истина ), а может вообще ничего не быть и тогда там используется параметр по умолчачнию равный
|
||
hasError = hasError || V8TypeHelper.getFloatNumberConstantFromParam(callContext, 1) | ||
.get() | ||
.filter(timeout -> timeout < 1.0f) | ||
// TODO change while got context | ||
.map(e -> V8TypeHelper.getBooleanConstantFromParam(callContext, 2, Boolean.FALSE) | ||
// .map(e -> V8TypeHelper.get(Boolean.FALSE, (constValue) -> constValue.TRUE() != null).apply(callContext,2) | ||
.get() | ||
.map(be -> be.equals(Boolean.FALSE)) | ||
.orElse(false) | ||
) | ||
.orElse(false); | ||
return hasError; | ||
} | ||
} | ||
|
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.
Можно просто на форме...
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.
В новой версии платформы управляемые формы переименованы в просто формы.