Skip to content

Commit 25aa9de

Browse files
authored
Merge pull request #1879 from artbear/async-1818
2 parents 9c17c50 + be73105 commit 25aa9de

File tree

4 files changed

+74
-14
lines changed

4 files changed

+74
-14
lines changed

.idea/codeStyles/Project.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CodeAfterAsyncCallDiagnostic.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import java.util.List;
3737
import java.util.Optional;
3838
import java.util.regex.Pattern;
39+
import java.util.stream.Collectors;
3940

4041
import static com.github._1c_syntax.bsl.parser.BSLParser.RULE_codeBlock;
4142
import static com.github._1c_syntax.bsl.parser.BSLParser.RULE_statement;
@@ -85,10 +86,24 @@ private static boolean checkNextBlocks(BSLParser.StatementContext statement) {
8586
if (codeBlock == null || codeBlock.statement().isEmpty()) {
8687
return false;
8788
}
88-
if (Trees.getNextNode(codeBlock, statement, RULE_statement) != null) {
89-
return true;
89+
final var asyncLine = statement.getStop().getLine();
90+
final var statements = codeBlock.statement().stream()
91+
.filter(statementContext -> statementContext != statement &&
92+
statementContext.getStart().getLine() > asyncLine)
93+
.collect(Collectors.toList());
94+
final var compoundCtx = statements.stream()
95+
.findFirst()
96+
.map(BSLParser.StatementContext::compoundStatement);
97+
final var returnAfterAsync = compoundCtx
98+
.map(BSLParser.CompoundStatementContext::returnStatement)
99+
.isPresent();
100+
if (returnAfterAsync){
101+
return false;
90102
}
91-
return checkParentBlock(codeBlock);
103+
final var breakAfterAsync = compoundCtx
104+
.map(BSLParser.CompoundStatementContext::breakStatement)
105+
.isPresent();
106+
return (!breakAfterAsync && !statements.isEmpty()) || checkParentBlock(codeBlock);
92107
}
93108

94109
private static boolean checkParentBlock(BSLParser.CodeBlockContext codeBlock) {

src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CodeAfterAsyncCallDiagnosticTest.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void test() {
3939
List<Diagnostic> diagnostics = getDiagnostics();
4040

4141
assertThat(diagnostics, true)
42-
.hasRange(4, 4, 96)
42+
.hasRange(4, 4, 96)
4343
.hasRange(21, 8, 100)
4444
.hasRange(34, 8, 100)
4545
.hasRange(48, 12, 104)
@@ -48,15 +48,8 @@ void test() {
4848
.hasRange(93, 12, 104)
4949
.hasRange(108, 12, 104)
5050
.hasRange(123, 12, 104)
51-
.hasRange(136, 4, 36)
52-
.hasRange(145, 8, 100)
53-
.hasRange(158, 12, 104)
54-
.hasRange(172, 12, 104)
55-
.hasRange(186, 12, 104)
56-
.hasRange(200, 12, 104)
57-
.hasRange(214, 12, 104)
58-
.hasRange(228, 12, 104)
59-
.hasSize(17);
51+
.hasRange(270, 12, 104)
52+
.hasSize(10);
6053

6154
}
6255
}

src/test/resources/diagnostics/CodeAfterAsyncCallDiagnostic.bsl

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,3 +235,55 @@
235235
КонецЕсли;
236236

237237
КонецПроцедуры
238+
239+
&НаКлиенте
240+
Процедура ВозвратПослеАсинхрона(Команда)
241+
Если Условие Тогда
242+
ДополнительныеПараметры = Новый Структура("Результат", 10);
243+
Оповещение = Новый ОписаниеОповещения("ПослеВводаКоличества1", ЭтотОбъект);
244+
ПоказатьВводЧисла(Оповещение, 1, "Введите количество", ДополнительныеПараметры.Результат, 2);
245+
Возврат; // не ошибка
246+
КонецЕсли;
247+
248+
КодВКонцеМетода(); // не ошибка
249+
250+
КонецПроцедуры
251+
252+
&НаКлиенте
253+
Процедура ПрерватьАсинхрона(Команда)
254+
Если Условие Тогда
255+
Для Каждого Элемент Из Коллекция Цикл
256+
ДополнительныеПараметры = Новый Структура("Результат", 10);
257+
Оповещение = Новый ОписаниеОповещения("ПослеВводаКоличества1", ЭтотОбъект);
258+
ПоказатьВводЧисла(Оповещение, 1, "Введите количество", ДополнительныеПараметры.Результат, 2);
259+
Прервать; // не ошибка
260+
КонецЦикла;
261+
КонецЕсли;
262+
263+
КонецПроцедуры
264+
265+
&НаКлиенте
266+
Процедура ПрерватьПослеАсинхронаИКодПослеЦикла(Команда)
267+
Если Условие Тогда
268+
Для Каждого Элемент Из Коллекция Цикл
269+
ДополнительныеПараметры = Новый Структура("Результат", 10);
270+
Оповещение = Новый ОписаниеОповещения("ПослеВводаКоличества1", ЭтотОбъект);
271+
ПоказатьВводЧисла(Оповещение, 1, "Введите количество", ДополнительныеПараметры.Результат, 2);
272+
Прервать; // не ошибка
273+
КонецЦикла;
274+
КонецЕсли;
275+
276+
КодПослеЦикла(); // ошибка
277+
КонецПроцедуры
278+
279+
&НаКлиенте
280+
Процедура ДваВызоваАсинхронаВоВзаимоисключащихВетках(Команда)
281+
ДополнительныеПараметры = Новый Структура("Результат", 10);
282+
Оповещение = Новый ОписаниеОповещения("ПослеВводаКоличества1", ЭтотОбъект);
283+
Если Условие Тогда
284+
ПоказатьВводЧисла(Оповещение, 1, "Введите количество", ДополнительныеПараметры.Результат, 2); // не ошибка
285+
Иначе
286+
ПоказатьВводЧисла(Оповещение, 1, "Введите количество", ДополнительныеПараметры.Результат, 2); // не ошибка
287+
КонецЕсли;
288+
289+
КонецПроцедуры

0 commit comments

Comments
 (0)