Skip to content

Commit 1ef1764

Browse files
authored
Merge pull request #1664 from huxuxuya/feature/IncorrectLineBreakAddingParameters
2 parents 0ac7638 + 58cada4 commit 1ef1764

File tree

7 files changed

+185
-11
lines changed

7 files changed

+185
-11
lines changed

docs/diagnostics/IncorrectLineBreak.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@
44
:-: | :-: | :-: | :-: | :-: | :-:
55
`Дефект кода` | `BSL`<br>`OS` | `Информационный` | `Да` | `2` | `standard`<br>`badpractice`
66

7+
## Параметры
8+
9+
Имя | Тип | Описание | Значение по умолчанию
10+
:-: | :-: | :-- | :-:
11+
`checkFirstSymbol` | `Булево` | ```Проверять начало строки на некорректные символы``` | ```true```
12+
`listOfIncorrectFirstSymbol` | `Строка` | ```Символы через вертикальную черту, с которых не должна начинаться строка (специальные символы должны быть экранированы)``` | ```\)|;|,|\);```
13+
`checkLastSymbol` | `Булево` | ```Проверять конец строки на некорректные символы``` | ```true```
14+
`listOfIncorrectLastSymbol` | `Строка` | ```Символы через вертикальную черту, на которые не должна заканчиваться строка (специальные символы должны быть экранированы)``` | ```ИЛИ|И|OR|AND|\+|-|/|%|\*```
15+
716
<!-- Блоки выше заполняются автоматически, не трогать -->
817
## Описание диагностики
918
<!-- Описание диагностики заполняется вручную. Необходимо понятным языком описать смысл и схему работу -->
@@ -52,5 +61,10 @@
5261
### Параметр конфигурационного файла
5362

5463
```json
55-
"IncorrectLineBreak": false
64+
"IncorrectLineBreak": {
65+
"checkFirstSymbol": true,
66+
"listOfIncorrectFirstSymbol": "\\)|;|,|\\);",
67+
"checkLastSymbol": true,
68+
"listOfIncorrectLastSymbol": "ИЛИ|И|OR|AND|\\+|-|/|%|\\*"
69+
}
5670
```

docs/en/diagnostics/IncorrectLineBreak.md

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

7+
## Parameters
8+
9+
Name | Type | Description | Default value
10+
:-: | :-: | :-- | :-:
11+
`checkFirstSymbol` | `Boolean` | ```Check beginning of line for invalid characters``` | ```true```
12+
`listOfIncorrectFirstSymbol` | `String` | ```Vertical bar-separated characters that should not start the line (special characters must be escaped)``` | ```\)|;|,|\);```
13+
`checkLastSymbol` | `Boolean` | ```Check end of line for invalid characters``` | ```true```
14+
`listOfIncorrectLastSymbol` | `String` | ```Vertical bar-separated characters that must not end in the line (special characters must be escaped)``` | ```ИЛИ|И|OR|AND|\+|-|/|%|\*```
15+
716
<!-- Блоки выше заполняются автоматически, не трогать -->
817
## Description
918

@@ -51,5 +60,10 @@ AmountDocument = AmountWithoutDiscount +
5160
### Parameter for config
5261

5362
```json
54-
"IncorrectLineBreak": false
63+
"IncorrectLineBreak": {
64+
"checkFirstSymbol": true,
65+
"listOfIncorrectFirstSymbol": "\\)|;|,|\\);",
66+
"checkLastSymbol": true,
67+
"listOfIncorrectLastSymbol": "ИЛИ|И|OR|AND|\\+|-|/|%|\\*"
68+
}
5569
```

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

Lines changed: 74 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,15 @@
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;
29+
import com.github._1c_syntax.bsl.languageserver.utils.DiagnosticHelper;
2830
import com.github._1c_syntax.utils.CaseInsensitivePattern;
2931

3032
import java.util.HashSet;
33+
import java.util.Map;
3134
import java.util.Set;
3235
import java.util.regex.Pattern;
3336

@@ -42,25 +45,67 @@
4245
)
4346
public class IncorrectLineBreakDiagnostic extends AbstractDiagnostic {
4447

45-
private static final Pattern INCORRECT_START_LINE_PATTERN = CaseInsensitivePattern.compile(
46-
"^\\s*(:?\\)|;|,|\\);)"
47-
);
48-
49-
private static final Pattern INCORRECT_END_LINE_PATTERN = CaseInsensitivePattern.compile(
50-
"\\s+(:?ИЛИ|И|OR|AND|\\+|-|/|%|\\*)\\s*(?://.*)?$"
51-
);
48+
// check first symbol
49+
private static final boolean DEFAULT_CHECK_START = true;
50+
// forbidden characters at the beginning of the line
51+
private static final String DEFAULT_LIST_FOR_CHECK_START = "\\)|;|,|\\);";
52+
// check last symbol
53+
private static final boolean DEFAULT_CHECK_END = true;
54+
// forbidden end-of-line characters
55+
private static final String DEFAULT_LIST_FOR_CHECK_END = "ИЛИ|И|OR|AND|\\+|-|/|%|\\*";
5256

5357
// +1 for next line and +1 for 1..n based line numbers.
5458
private static final int QUERY_START_LINE_OFFSET = 2;
5559

5660
private final Set<Integer> queryFirstLines = new HashSet<>();
5761

62+
@DiagnosticParameter(
63+
type = Boolean.class,
64+
defaultValue = "" + DEFAULT_CHECK_START
65+
)
66+
private boolean checkFirstSymbol = DEFAULT_CHECK_START;
67+
68+
@DiagnosticParameter(
69+
type = String.class,
70+
defaultValue = "" + DEFAULT_LIST_FOR_CHECK_START
71+
)
72+
private Pattern listOfIncorrectFirstSymbol = createPatternIncorrectStartLine(DEFAULT_LIST_FOR_CHECK_START);
73+
74+
@DiagnosticParameter(
75+
type = Boolean.class,
76+
defaultValue = "" + DEFAULT_CHECK_END
77+
)
78+
private boolean checkLastSymbol = DEFAULT_CHECK_END;
79+
80+
@DiagnosticParameter(
81+
type = String.class,
82+
defaultValue = "" + DEFAULT_LIST_FOR_CHECK_END
83+
)
84+
private Pattern listOfIncorrectLastSymbol = createPatternIncorrectEndLine(DEFAULT_LIST_FOR_CHECK_END);
85+
86+
@Override
87+
public void configure(Map<String, Object> configuration) {
88+
DiagnosticHelper.configureDiagnostic(this, configuration, "checkFirstSymbol", "checkLastSymbol");
89+
90+
listOfIncorrectFirstSymbol = createPatternIncorrectStartLine(
91+
(String) configuration.getOrDefault("listOfIncorrectFirstSymbol", DEFAULT_LIST_FOR_CHECK_START)
92+
);
93+
listOfIncorrectLastSymbol = createPatternIncorrectEndLine(
94+
(String) configuration.getOrDefault("listOfIncorrectLastSymbol", DEFAULT_LIST_FOR_CHECK_END)
95+
);
96+
}
97+
5898
@Override
5999
protected void check() {
100+
60101
findQueryFirstLines();
61102

62-
checkContent(INCORRECT_START_LINE_PATTERN);
63-
checkContent(INCORRECT_END_LINE_PATTERN);
103+
if (checkFirstSymbol){
104+
checkContent(listOfIncorrectFirstSymbol);
105+
}
106+
if (checkLastSymbol) {
107+
checkContent(listOfIncorrectLastSymbol);
108+
}
64109
}
65110

66111
private void findQueryFirstLines() {
@@ -81,4 +126,24 @@ private void checkContent(Pattern pattern) {
81126
}
82127
}
83128
}
129+
130+
private static Pattern getPatternSearch(String startPattern, String searchSymbols, String endPattern) {
131+
return CaseInsensitivePattern.compile(startPattern + searchSymbols + endPattern);
132+
}
133+
134+
private static Pattern createPatternIncorrectStartLine(String listOfSymbols) {
135+
return getPatternSearch(
136+
"^\\s*(:?",
137+
listOfSymbols,
138+
")"
139+
);
140+
}
141+
142+
private static Pattern createPatternIncorrectEndLine(String listOfSymbols) {
143+
return getPatternSearch(
144+
"\\s+(:?",
145+
listOfSymbols,
146+
")\\s*(?://.*)?$"
147+
);
148+
}
84149
}

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,32 @@
690690
"object"
691691
],
692692
"title": "Incorrect expression line break",
693+
"properties": {
694+
"checkFirstSymbol": {
695+
"description": "Check beginning of line for invalid characters",
696+
"default": true,
697+
"type": "boolean",
698+
"title": "Check beginning of line for invalid characters"
699+
},
700+
"checkLastSymbol": {
701+
"description": "Check end of line for invalid characters",
702+
"default": true,
703+
"type": "boolean",
704+
"title": "Check end of line for invalid characters"
705+
},
706+
"listOfIncorrectLastSymbol": {
707+
"description": "Vertical bar-separated characters that must not end in the line (special characters must be escaped)",
708+
"default": "\u0418\u041b\u0418|\u0418|OR|AND|\\+|-|/|%|\\*",
709+
"type": "string",
710+
"title": "Vertical bar-separated characters that must not end in the line (special characters must be escaped)"
711+
},
712+
"listOfIncorrectFirstSymbol": {
713+
"description": "Vertical bar-separated characters that should not start the line (special characters must be escaped)",
714+
"default": "\\)|;|,|\\);",
715+
"type": "string",
716+
"title": "Vertical bar-separated characters that should not start the line (special characters must be escaped)"
717+
}
718+
},
693719
"$id": "#/definitions/IncorrectLineBreak"
694720
},
695721
"IncorrectUseLikeInQuery": {
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
11
diagnosticMessage=Check for line break of operands, operators and parameters
22
diagnosticName=Incorrect expression line break
3+
checkFirstSymbol=Check beginning of line for invalid characters
4+
listOfIncorrectFirstSymbol=Vertical bar-separated characters that should not start the line (special characters must be escaped)
5+
checkLastSymbol=Check end of line for invalid characters
6+
listOfIncorrectLastSymbol=Vertical bar-separated characters that must not end in the line (special characters must be escaped)
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
11
diagnosticMessage=Проверьте правильность переноса операндов, операторов и параметров
22
diagnosticName=Неправильный перенос выражения
3+
checkFirstSymbol=Проверять начало строки на некорректные символы
4+
listOfIncorrectFirstSymbol=Символы через вертикальную черту, с которых не должна начинаться строка (специальные символы должны быть экранированы)
5+
checkLastSymbol=Проверять конец строки на некорректные символы
6+
listOfIncorrectLastSymbol=Символы через вертикальную черту, на которые не должна заканчиваться строка (специальные символы должны быть экранированы)

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

Lines changed: 47 additions & 0 deletions
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

@@ -36,6 +37,8 @@ class IncorrectLineBreakDiagnosticTest extends AbstractDiagnosticTest<IncorrectL
3637
@Test
3738
void test() {
3839

40+
Map<String, Object> configuration = diagnosticInstance.getInfo().getDefaultConfiguration();
41+
diagnosticInstance.configure(configuration);
3942
List<Diagnostic> diagnostics = getDiagnostics();
4043

4144
assertThat(diagnostics).hasSize(14);
@@ -57,4 +60,48 @@ void test() {
5760
;
5861

5962
}
63+
64+
@Test
65+
void testDisableDiagnostics() {
66+
67+
Map<String, Object> configuration = diagnosticInstance.getInfo().getDefaultConfiguration();
68+
configuration.put("checkFirstSymbol", false);
69+
configuration.put("listOfIncorrectFirstSymbol", "\\)|;|,|\\);");
70+
configuration.put("checkLastSymbol", false);
71+
configuration.put("listOfIncorrectLastSymbol", "ИЛИ|И|OR|AND|\\+|-|/|%|\\*");
72+
diagnosticInstance.configure(configuration);
73+
74+
List<Diagnostic> diagnostics = getDiagnostics();
75+
76+
assertThat(diagnostics).isEmpty();
77+
}
78+
79+
@Test
80+
void testTrailingBraceCodestyle() {
81+
82+
Map<String, Object> configuration = diagnosticInstance.getInfo().getDefaultConfiguration();
83+
configuration.put("checkFirstSymbol", true);
84+
configuration.put("listOfIncorrectFirstSymbol", ";|,|\\);");
85+
configuration.put("checkLastSymbol", true);
86+
configuration.put("listOfIncorrectLastSymbol", "ИЛИ|И|OR|AND|\\+|-|/|%|\\*");
87+
diagnosticInstance.configure(configuration);
88+
89+
List<Diagnostic> diagnostics = getDiagnostics();
90+
91+
assertThat(diagnostics).hasSize(11);
92+
assertThat(diagnostics, true)
93+
.hasRange(6, 32, 33)
94+
.hasRange(7, 35, 36)
95+
.hasRange(15, 32, 33)
96+
.hasRange(16, 22, 23)
97+
.hasRange(20, 49, 50)
98+
.hasRange(69, 80, 83)
99+
.hasRange(82, 89, 92)
100+
.hasRange(44, 25, 26)
101+
.hasRange(46, 25, 26)
102+
.hasRange(58, 4, 5)
103+
.hasRange(60, 4, 5)
104+
;
105+
106+
}
60107
}

0 commit comments

Comments
 (0)