Skip to content

Commit 14eabe5

Browse files
committed
Исправлен выброс исключения диагностики DoubleNegatives при наборе кода/ошибках разбора кода
1 parent fc5bd74 commit 14eabe5

File tree

2 files changed

+46
-7
lines changed

2 files changed

+46
-7
lines changed

src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/expressiontree/ExpressionTreeBuildingVisitor.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,11 @@ public ParseTree visitExpression(BSLParser.ExpressionContext ctx) {
110110
}
111111

112112
var operation = operands.peek();
113-
assert operation != null; // для спокойствия сонара
113+
// В случае ошибок парсинга выражения, operation может быть null
114+
if (operation == null) {
115+
recursionLevel--;
116+
return ctx;
117+
}
114118

115119
if (operation.getRepresentingAst() == null) {
116120
operation.setRepresentingAst(ctx);
@@ -127,12 +131,18 @@ public ParseTree visitExpression(BSLParser.ExpressionContext ctx) {
127131
@Override
128132
public ParseTree visitMember(BSLParser.MemberContext ctx) {
129133

134+
// В случае ошибки парсинга member может быть пустой.
135+
if (ctx.getChildCount() == 0) {
136+
return ctx;
137+
}
138+
130139
// нужен ручной dispatch на конкретного child,
131140
// т.к. нет отдельного правила для подвыражения в скобках
132141
// constValue
133-
// | complexIdentifier
134-
// | (( LPAREN expression RPAREN ) modifier*) // нечего оверрайдить !
135-
// | (WAIT_KEYWORD (IDENTIFIER | globalMethodCall))
142+
// | complexIdentifier
143+
// | (( LPAREN expression RPAREN ) modifier*) // нечего оверрайдить !
144+
// | (IDENTIFIER | globalMethodCall) // нечего оверрайдить !
145+
// | waitExpression
136146

137147
var unaryModifier = ctx.unaryModifier();
138148
var childIndex = 0;
@@ -141,6 +151,10 @@ public ParseTree visitMember(BSLParser.MemberContext ctx) {
141151
childIndex = 1;
142152
}
143153

154+
if (ctx.waitExpression() != null) {
155+
return visitWaitExpression(ctx.waitExpression());
156+
}
157+
144158
var dispatchChild = ctx.getChild(childIndex);
145159
if (dispatchChild instanceof TerminalNode terminalNode) {
146160
var token = terminalNode.getSymbol().getType();
@@ -150,9 +164,6 @@ public ParseTree visitMember(BSLParser.MemberContext ctx) {
150164
case BSLLexer.LPAREN:
151165
visitParenthesis(ctx.expression(), ctx.modifier());
152166
break;
153-
case BSLLexer.AWAIT_KEYWORD:
154-
visitAwaitedMember(ctx.getChild(childIndex + 1));
155-
break;
156167
default:
157168
throw new IllegalStateException("Unexpected rule " + dispatchChild);
158169
}

src/test/resources/diagnostics/DoubleNegativesDiagnostic.bsl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,31 @@
3939
// NoSuchElementException
4040
Запись = РегистрыСведений.ЗаданияКПересчетуСтатуса.СоздатьМенеджерЗаписи();
4141
Запись.Записать(Истина);
42+
43+
// C ошибкой разбора
44+
// Вынесено в отдельную процедуру в блоке subAfterCodeBlock, т.к. иначе парсер ломается целиком и expression tree builder
45+
// ничего не строит
46+
Процедура Тест()
47+
48+
Если Истина Тогда
49+
50+
// C ошибкой разбора
51+
Если Тогда
52+
53+
КонецЕсли;
54+
55+
// С ошибкой разбора
56+
Пока А Цикл
57+
Если
58+
#Если Сервер Тогда
59+
F
60+
#Иначе
61+
G
62+
#КонецЕсли
63+
Тогда
64+
КонецЕсли;
65+
КонецЦикла;
66+
67+
КонецЕсли;
68+
69+
КонецПроцедуры

0 commit comments

Comments
 (0)