Skip to content

Commit a9ac745

Browse files
authored
Merge pull request #1845 from 1c-syntax/feature/NestedFunctionInParametersDiagnostic
NestedFunctionInParametersDiagnostic mod
2 parents 653471e + 40bef56 commit a9ac745

File tree

8 files changed

+105
-25
lines changed

8 files changed

+105
-25
lines changed

docs/diagnostics/NestedFunctionInParameters.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@
44
|:-------------:|:-----------------------------:|:----------------:|:------------------------------:|:-----------------------------------:|:----------------------------------------------------------:|
55
| `Дефект кода` | `BSL`<br>`OS` | `Незначительный` | `Да` | `2` | `standard`<br>`brainoverload`<br>`badpractice` |
66

7+
## Параметры
8+
9+
10+
| Имя | Тип | Описание | Значение<br>по умолчанию |
11+
|:---------------:|:--------:|:----------------------------------:|:------------------------------:|
12+
| `allowOneliner` | `Булево` | `Разрешить однострочные выражения` | `true` |
713
<!-- Блоки выше заполняются автоматически, не трогать -->
814
## Описание диагностики
915
<!-- Описание диагностики заполняется вручную. Необходимо понятным языком описать смысл и схему работу -->
@@ -52,5 +58,7 @@
5258
### Параметр конфигурационного файла
5359

5460
```json
55-
"NestedFunctionInParameters": false
61+
"NestedFunctionInParameters": {
62+
"allowOneliner": true
63+
}
5664
```

docs/en/diagnostics/NestedFunctionInParameters.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@
44
|:------------:|:-------------------:|:--------:|:-----------------------------:|:-----------------------:|:----------------------------------------------------------:|
55
| `Code smell` | `BSL`<br>`OS` | `Minor` | `Yes` | `2` | `standard`<br>`brainoverload`<br>`badpractice` |
66

7+
## Parameters
8+
9+
10+
| Name | Type | Description | Default value |
11+
|:---------------:|:---------:|:---------------------------:|:-------------:|
12+
| `allowOneliner` | `Boolean` | `Allow oneliner expression` | `true` |
713
<!-- Блоки выше заполняются автоматически, не трогать -->
814
## Description
915
<!-- Описание диагностики заполняется вручную. Необходимо понятным языком описать смысл и схему работу -->
@@ -47,5 +53,7 @@ FileImageHRef = AttachedFiles.GetFileData(AttachedFile.Ref).RefToFileBinaryData;
4753
### Parameter for config
4854

4955
```json
50-
"NestedFunctionInParameters": false
56+
"NestedFunctionInParameters": {
57+
"allowOneliner": true
58+
}
5159
```

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

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
package com.github._1c_syntax.bsl.languageserver.diagnostics;
2323

2424
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata;
25+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticParameter;
2526
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity;
2627
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag;
2728
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType;
@@ -42,6 +43,14 @@
4243
)
4344
public class NestedFunctionInParametersDiagnostic extends AbstractVisitorDiagnostic {
4445

46+
private static final boolean DEFAULT_ALLOW_ONELINER = true;
47+
48+
@DiagnosticParameter(
49+
type = Boolean.class,
50+
defaultValue = "" + DEFAULT_ALLOW_ONELINER
51+
)
52+
private boolean allowOneliner = DEFAULT_ALLOW_ONELINER;
53+
4554
@Override
4655
public ParseTree visitMethodCall(BSLParser.MethodCallContext ctx) {
4756
checkMethodCall(ctx, ctx.doCall(), ctx.methodName());
@@ -57,34 +66,41 @@ public ParseTree visitGlobalMethodCall(BSLParser.GlobalMethodCallContext ctx) {
5766
@Override
5867
public ParseTree visitNewExpression(BSLParser.NewExpressionContext ctx) {
5968

60-
if (findNestedCall(ctx, ctx.doCall())) {
61-
if (ctx.typeName() != null) {
62-
diagnosticStorage.addDiagnostic(
63-
ctx.typeName(),
64-
info.getMessage(
65-
info.getResourceString("diagnosticMessageConstructor"),
66-
ctx.typeName().getText()));
67-
} else { // для констукторов через параметр New
68-
diagnosticStorage.addDiagnostic(
69-
ctx.getStart(),
70-
info.getResourceString("diagnosticMessageWithoutName",
71-
info.getResourceString("diagnosticMessageConstructor")));
72-
}
69+
if (!findNestedCall(ctx, ctx.doCall())) {
70+
return super.visitNewExpression(ctx);
71+
}
72+
73+
if (ctx.typeName() != null) {
74+
diagnosticStorage.addDiagnostic(
75+
ctx.typeName(),
76+
info.getMessage(
77+
info.getResourceString("diagnosticMessageConstructor"),
78+
ctx.typeName().getText()));
79+
} else { // для конструкторов через параметр New
80+
diagnosticStorage.addDiagnostic(
81+
ctx.getStart(),
82+
info.getResourceString("diagnosticMessageWithoutName",
83+
info.getResourceString("diagnosticMessageConstructor")));
7384
}
7485

7586
return super.visitNewExpression(ctx);
7687
}
7788

78-
private static boolean findNestedCall(BSLParserRuleContext ctx, BSLParser.DoCallContext ctxDoCall) {
89+
private boolean findNestedCall(BSLParserRuleContext ctx, BSLParser.DoCallContext ctxDoCall) {
7990
if (ctxDoCall == null
80-
|| ctxDoCall.callParamList() == null) {
91+
|| ctxDoCall.callParamList() == null
92+
|| ctxDoCall.callParamList().isEmpty()) {
8193
return false;
8294
}
8395

84-
// если есть параметры и вызов не в одной строке, то найдем вызовы методов
85-
return !ctxDoCall.callParamList().isEmpty()
86-
&& ctx.getStart().getLine() != ctx.getStop().getLine()
87-
&& Trees.nodeContains(ctx, ctxDoCall, BSLParser.RULE_doCall);
96+
return ctx.getStart().getLine() != ctx.getStop().getLine()
97+
&& Trees.nodeContains(ctx, ctxDoCall, BSLParser.RULE_doCall)
98+
&& multilineParam(ctxDoCall);
99+
}
100+
101+
private boolean multilineParam(BSLParser.DoCallContext ctxDoCall) {
102+
return !allowOneliner || ctxDoCall.callParamList().callParam().stream()
103+
.anyMatch(callParamContext -> callParamContext.getStop().getLine() > callParamContext.getStart().getLine());
88104
}
89105

90106
private void checkMethodCall(BSLParserRuleContext ctx,

src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/parameters-schema.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,6 +1148,14 @@
11481148
"object"
11491149
],
11501150
"title": "Initialization of method and constructor parameters by calling nested methods",
1151+
"properties": {
1152+
"allowOneliner": {
1153+
"description": "Allow oneliner expression",
1154+
"default": true,
1155+
"type": "boolean",
1156+
"title": "Allow oneliner expression"
1157+
}
1158+
},
11511159
"$id": "#/definitions/NestedFunctionInParameters"
11521160
},
11531161
"NestedStatements": {

src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/NestedFunctionInParametersDiagnostic_en.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ diagnosticMessageWithoutName=Remove parameter initialization for %s by nested me
33
diagnosticName=Initialization of method and constructor parameters by calling nested methods
44
diagnosticMessageMethod=method
55
diagnosticMessageConstructor=constructor
6+
allowOneliner=Allow oneliner expression

src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/NestedFunctionInParametersDiagnostic_ru.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ diagnosticMessageWithoutName=Уберите инициализацию пара
33
diagnosticName=Инициализация параметров методов и конструкторов вызовом вложенных методов
44
diagnosticMessageMethod=метода
55
diagnosticMessageConstructor=конструктора
6+
allowOneliner=Разрешить однострочные выражения

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

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.junit.jupiter.api.Test;
2626

2727
import java.util.List;
28+
import java.util.Map;
2829

2930
import static com.github._1c_syntax.bsl.languageserver.util.Assertions.assertThat;
3031

@@ -38,7 +39,24 @@ void test() {
3839

3940
List<Diagnostic> diagnostics = getDiagnostics();
4041

41-
assertThat(diagnostics).hasSize(7);
42+
assertThat(diagnostics).hasSize(3);
43+
assertThat(diagnostics, true)
44+
.hasRange(1, 22, 30)
45+
.hasRange(3, 11, 19)
46+
.hasRange(51, 72, 94)
47+
;
48+
}
49+
50+
@Test
51+
void testConfigure() {
52+
53+
Map<String, Object> configuration = diagnosticInstance.getInfo().getDefaultConfiguration();
54+
configuration.put("allowOneliner", false);
55+
diagnosticInstance.configure(configuration);
56+
57+
List<Diagnostic> diagnostics = getDiagnostics();
58+
59+
assertThat(diagnostics).hasSize(10);
4260
assertThat(diagnostics, true)
4361
.hasRange(1, 22, 30)
4462
.hasRange(3, 11, 19)
@@ -47,6 +65,9 @@ void test() {
4765
.hasRange(13, 35, 42)
4866
.hasRange(17, 22, 31)
4967
.hasRange(36, 14, 19)
68+
.hasRange(47, 72, 94)
69+
.hasRange(51, 72, 94)
70+
.hasRange(56, 4, 28)
5071
;
5172

5273
}

src/test/resources/diagnostics/NestedFunctionInParametersDiagnostic.bsl

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Процедура Тест()
1+
Процедура Тест() // Все комментарии про allowOneliner=false
22
СтруктураВложений.Вставить( // <-- Ошибка, т.к. есть вложенный конструктов и метод
33
ПрисоединенныйФайл.Наименование,
44
Новый Картинка(ПолучитьИзВременногоХранилища( // <-- 2 ошибки, т.к. есть вложенный метод м в конструкторе и в методе
@@ -8,8 +8,8 @@
88

99
Сообщить(СуммаСтрокой("77"), // <-- ошибка для Сообщить, т.к есть вложенный метод в параметрах
1010
СуммаСтрокой(СуммаНДС(Перечисление.ВтораяСумма))); // <-- не ошибка для СуммаСтрокой, т.к. в одной строке
11-
12-
11+
А = Новый Массив;
12+
Сообщить();
1313
Объект.Метод().Метод2(Объект2.Метод2()); // <-- не ошибка, все в одной строке
1414
Объект.Метод(Объект2.Метод2()).Метод21( // <-- ошибка для Метод21, т.к. есть вложенный метод
1515
Объект2.Метод22());
@@ -44,3 +44,20 @@
4444
ОткрытьФорму("РегистрСведений.ОчередьРассылок.ФормаЗаписи", ПараметрыФормыЗаписи);
4545

4646
КонецПроцедуры
47+
48+
СсылкаНаОбъект = РегистрыСведений.СоответствиеСсылокИдентификаторам.ПолучитьСсылкуНаОбъект(
49+
Новый УникальныйИдентификатор(ИдентификаторОбъекта)
50+
);
51+
52+
СсылкаНаОбъект = РегистрыСведений.СоответствиеСсылокИдентификаторам.ПолучитьСсылкуНаОбъект(
53+
Новый УникальныйИдентификатор(ИдентификаторОбъекта,
54+
Истина)
55+
);
56+
57+
ЗаписьЖурналаРегистрации(
58+
НСтр("ru = 'WMS.InDeliverySetEndReceiving'", ОбщегоНазначения.КодОсновногоЯзыка()),
59+
УровеньЖурналаРегистрации.Ошибка,
60+
,
61+
,
62+
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
63+
);

0 commit comments

Comments
 (0)