Skip to content

Commit a73b562

Browse files
committed
fix(diagnostics): улучшена диагностика MagicDate для исключений
- Добавлены условия, при которых диагностика не срабатывает: присваивание к свойствам структуры и вызовы методов. - Обновлена логика в классе MagicDateDiagnostic для обработки новых исключений. - Обновлена документация на русском и английском языках с примерами кода.
1 parent 272df6a commit a73b562

File tree

3 files changed

+80
-2
lines changed

3 files changed

+80
-2
lines changed

docs/diagnostics/MagicDate.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,26 @@
3535
ХоверБордБудетИзобретен = Неопределено;
3636
КонецЕсли;
3737
```
38+
39+
## Исключения
40+
41+
Диагностика не срабатывает в следующих случаях:
42+
43+
### Присваивание к свойствам структуры
44+
45+
```bsl
46+
// НЕ срабатывает - осмысленное имя свойства
47+
СтруктураДанных.ДатаНачала = '20230101';
48+
СтруктураДанных.ДатаОкончания = '20241231';
49+
50+
// НЕ срабатывает - присваивание к свойству структуры
51+
НоваяСтруктура = Новый Структура("ДатаСоздания");
52+
НоваяСтруктура.ДатаСоздания = '20240101';
53+
```
54+
55+
### Вызовы методов
56+
57+
```bsl
58+
// НЕ срабатывает - вызов метода
59+
НоваяСтруктура.Вставить("ДатаСоздания", '20240101');
60+
```

docs/en/diagnostics/MagicDate.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,26 @@ If CurrentDate < DateInventionHover() Then
3535
HoverBoardWillBeInvented = Undefined;
3636
EndIf;
3737
```
38+
39+
## Exceptions
40+
41+
The diagnostic does not trigger in the following cases:
42+
43+
### Structure property assignment
44+
45+
```bsl
46+
// Does NOT trigger - meaningful property name
47+
DataStructure.StartDate = '20230101';
48+
DataStructure.EndDate = '20241231';
49+
50+
// Does NOT trigger - structure property assignment
51+
NewStructure = New Structure("CreationDate");
52+
NewStructure.CreationDate = '20240101';
53+
```
54+
55+
### Method calls
56+
57+
```bsl
58+
// Does NOT trigger - method call
59+
NewStructure.Insert("CreationDate", '20240101');
60+
```

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

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.util.Arrays;
3535
import java.util.HashSet;
3636
import java.util.Map;
37+
import java.util.Objects;
3738
import java.util.Optional;
3839
import java.util.Set;
3940
import java.util.regex.Pattern;
@@ -93,8 +94,9 @@ public ParseTree visitConstValue(BSLParser.ConstValueContext ctx) {
9394
}
9495

9596
final var expressionContext = getExpression(Optional.of(ctx));
96-
if (!insideSimpleDateAssignment(expressionContext) && !insideReturnSimpleDate(expressionContext)
97-
&& !insideAssignmentWithDateMethodForSimpleDate(expressionContext)) {
97+
if (!insideSimpleDateAssignment(expressionContext)
98+
&& !insideReturnSimpleDate(expressionContext)
99+
&& !insideAssignmentWithDateMethodForSimpleDate(expressionContext)) {
98100
diagnosticStorage.addDiagnostic(ctx, info.getMessage(ctx.getText()));
99101
}
100102
}
@@ -196,4 +198,34 @@ private static boolean insideAssignmentWithDateMethodForSimpleDate(Optional<BSLP
196198
.filter(BSLParser.AssignmentContext.class::isInstance)
197199
.isPresent();
198200
}
201+
202+
private static boolean insideStructurePropertyAssignment(BSLParser.ExpressionContext expression) {
203+
var assignment = findAssignmentContext(expression);
204+
if (assignment == null) {
205+
return false;
206+
}
207+
208+
var lValue = assignment.lValue();
209+
if (lValue == null || lValue.isEmpty()) {
210+
return false;
211+
}
212+
213+
var acceptor = lValue.acceptor();
214+
if (acceptor == null) {
215+
return false;
216+
}
217+
218+
return acceptor.accessProperty() != null;
219+
}
220+
221+
private static BSLParser.AssignmentContext findAssignmentContext(BSLParserRuleContext ctx) {
222+
var current = ctx.getParent();
223+
while (current != null) {
224+
if (current instanceof BSLParser.AssignmentContext assignmentContext) {
225+
return assignmentContext;
226+
}
227+
current = current.getParent();
228+
}
229+
return null;
230+
}
199231
}

0 commit comments

Comments
 (0)