Skip to content

Commit 98c2d8e

Browse files
authored
Merge pull request #3228 from 1c-syntax/feature/extraEnffort
Наценка за сложность
2 parents 8522790 + 9503336 commit 98c2d8e

File tree

10 files changed

+45
-36
lines changed

10 files changed

+45
-36
lines changed

docs/contributing/DiagnosticStructure.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,13 @@
4545

4646
- Тип диагностики `type` и ее важность `severity`, для каждой диагностики обязательно их определение. Для того, чтобы правильно выбрать тип и важность диагностики, можно обратиться к [статье](DiagnosticTypeAndSeverity.md).
4747
- Время на исправление замечания `minutesToFix` (по умолчанию 0). Данное значение используется при расчете общего техдолга проекта в трудозатрах на исправление всех замечаний (сумма времени на исправление по всем обнаруженным замечаниям). Стоит указывать время, максимально реалистичное, которое разработчик должен потратить на исправление.
48+
- С помощью параметра `extraMinForComplexity` можно динамически увеличивать время на исправление замечания для диагностик, в которых учитывается несколько нарушающих правило мест, например при расчете сложности метода.
4849
- Набор тэгов `tag` диагностики, указывающих группы, к котором она относится. Подробнее о тэга в [статье](DiagnosticTag.md).
4950
- Границы применимости `scope` (по умолчанию `ALL`, т.е. без ограничения). BSL LS поддерживает несколько языков (oscript и bsl) и диагностики могут применяться как к одному конкретному языку, так и ко всем сразу.
5051
- Активность правила по-умолчанию `activatedByDefault` (по умолчанию `Истина`). При разработке экспериментальных, спорных либо не применимых в большинстве проектов, стоит по умолчанию отключать диагностику, активацию выполнит конечный пользователь решения.
5152
- Режим совместимости `compatibilityMode`, по которому фильтруются диагностики при использовании метаданных. По умолчанию `UNDEFINED`.
52-
53+
- Список типов модулей `modules` для возможности ограничить анализируемую диагностикой область
54+
- Признак возможности установить замечания на весь проект `canLocateOnProject`. Используется для диагностик не связанных с модулем исходного кода. На данный момент опция воспринимается только SonarQube, остальные инструменты игнорируют.
5355
Последние два могут быть опущены.
5456

5557
Пример аннотации
@@ -64,8 +66,14 @@
6466
compatibilityMode = DiagnosticCompatibilityMode.COMPATIBILITY_MODE_8_3_3, // Режим проверки совместимости с 8.3.3
6567
tags = {
6668
DiagnosticTag.STANDARD // Относится к диагностикам нарушения стандарта 1С
67-
}
69+
},
70+
modules = {
71+
ModuleType.CommonModule // Анализируются только общие модули
72+
},
73+
canLocateOnProject = false, // Замечание будет размещено только в привязке к модулю
74+
extraMinForComplexity = 1 // За каждую дополнительную позицию замечания (`DiagnosticRelatedInformation`) будет добавлено по одной минуте
6875
)
76+
6977
```
7078

7179
Класс должен реализовывать интерфейс `BSLDiagnostic`. Если диагностика основывается на AST дереве, то класс реализации должен быть унаследован от одного из классов ниже, реализующих `BSLDiagnostic`:

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

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@
4646
minutesToFix = 15,
4747
tags = {
4848
DiagnosticTag.BRAINOVERLOAD
49-
}
49+
},
50+
extraMinForComplexity = 1
5051
)
5152
public class CognitiveComplexityDiagnostic extends AbstractVisitorDiagnostic {
5253

@@ -99,28 +100,6 @@ public ParseTree visitSub(BSLParser.SubContext ctx) {
99100
Integer methodComplexity = documentContext.getCognitiveComplexityData().getMethodsComplexity().get(methodSymbol);
100101

101102
if (methodComplexity > complexityThreshold) {
102-
103-
List<DiagnosticRelatedInformation> relatedInformation = new ArrayList<>();
104-
105-
relatedInformation.add(RelatedInformation.create(
106-
documentContext.getUri(),
107-
methodSymbol.getSubNameRange(),
108-
info.getMessage(methodSymbol.getName(), methodComplexity, complexityThreshold)
109-
));
110-
111-
List<ComplexitySecondaryLocation> secondaryLocations =
112-
documentContext.getCognitiveComplexityData().getMethodsComplexitySecondaryLocations().get(methodSymbol);
113-
114-
secondaryLocations.stream()
115-
.map((ComplexitySecondaryLocation secondaryLocation) ->
116-
RelatedInformation.create(
117-
documentContext.getUri(),
118-
secondaryLocation.getRange(),
119-
secondaryLocation.getMessage()
120-
)
121-
)
122-
.collect(Collectors.toCollection(() -> relatedInformation));
123-
124103
diagnosticStorage.addDiagnostic(
125104
methodSymbol.getSubNameRange(),
126105
info.getMessage(methodSymbol.getName(), methodComplexity, complexityThreshold),

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@
4646
minutesToFix = 25,
4747
tags = {
4848
DiagnosticTag.BRAINOVERLOAD
49-
}
49+
},
50+
extraMinForComplexity = 1
5051
)
5152
public class CyclomaticComplexityDiagnostic extends AbstractVisitorDiagnostic {
5253
private static final int COMPLEXITY_THRESHOLD = 20;

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -209,10 +209,10 @@ public void addDiagnostic(
209209
}
210210

211211
public void addDiagnostic(ParseTree tree) {
212-
if (tree instanceof BSLParserRuleContext) {
213-
addDiagnostic((BSLParserRuleContext) tree);
214-
} else if (tree instanceof TerminalNode) {
215-
addDiagnostic((TerminalNode) tree);
212+
if (tree instanceof BSLParserRuleContext parserRuleContext) {
213+
addDiagnostic(parserRuleContext);
214+
} else if (tree instanceof TerminalNode terminalNode) {
215+
addDiagnostic(terminalNode);
216216
} else {
217217
throw new IllegalArgumentException("Unsupported parameter type " + tree);
218218
}
@@ -253,5 +253,4 @@ private static Diagnostic createDiagnostic(
253253
}
254254
return diagnostic;
255255
}
256-
257256
}

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,11 @@ private List<ParameterDefinition> calcNotAssignedParams(MethodSymbol method) {
106106
return calcNotAssignedParams(method, parameterDefinitions);
107107
}
108108

109-
private List<ParameterDefinition> calcNotAssignedParams(MethodSymbol method, List<ParameterDefinition> parameterDefinitions) {
109+
private List<ParameterDefinition> calcNotAssignedParams(MethodSymbol method,
110+
List<ParameterDefinition> parameterDefinitions) {
110111
return parameterDefinitions.stream()
111112
.filter(parameterDefinition -> isAssignedParam(method, parameterDefinition))
112-
.collect(Collectors.toUnmodifiableList());
113+
.toList();
113114
}
114115

115116
private boolean isAssignedParam(MethodSymbol method, ParameterDefinition parameterDefinition) {
@@ -118,7 +119,8 @@ private boolean isAssignedParam(MethodSymbol method, ParameterDefinition paramet
118119
.anyMatch(ref -> ref.getOccurrenceType() == OccurrenceType.DEFINITION));
119120
}
120121

121-
private static Stream<VariableSymbol> getVariableByParameter(MethodSymbol method, ParameterDefinition parameterDefinition) {
122+
private static Stream<VariableSymbol> getVariableByParameter(MethodSymbol method,
123+
ParameterDefinition parameterDefinition) {
122124
return method.getChildren().stream()
123125
// в будущем могут появиться и другие символы, подчиненные методам
124126
.filter(sourceDefinedSymbol -> sourceDefinedSymbol.getSymbolKind() == SymbolKind.Variable)
@@ -159,7 +161,7 @@ private static boolean isEqualCompilerDirective(MethodSymbol method) {
159161
private static List<ParameterDefinition> getMethodParamsByRef(MethodSymbol methodSymbol) {
160162
return methodSymbol.getParameters().stream()
161163
.filter(parameterDefinition -> !parameterDefinition.isByValue())
162-
.collect(Collectors.toUnmodifiableList());
164+
.toList();
163165
}
164166

165167
private static List<DiagnosticRelatedInformation> getRelatedInformation(List<Reference> references) {

src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/metadata/DiagnosticInfo.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,10 @@ public boolean canLocateOnProject() {
198198
return diagnosticMetadata.canLocateOnProject();
199199
}
200200

201+
public double getExtraMinForComplexity() {
202+
return diagnosticMetadata.extraMinForComplexity();
203+
}
204+
201205
public Map<String, Object> getDefaultConfiguration() {
202206
return diagnosticParameters.stream()
203207
.collect(Collectors.toMap(DiagnosticParameterInfo::getName, DiagnosticParameterInfo::getDefaultValue));

src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/metadata/DiagnosticMetadata.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,9 @@
8383
* Замечания диагностики могут быть прикреплены на уровень анализируемого проекта (в частности в SonarQube)
8484
*/
8585
boolean canLocateOnProject() default false;
86+
87+
/**
88+
* Надбавка ко времени исправления замечания за повышенную сложность
89+
*/
90+
double extraMinForComplexity() default 0;
8691
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ class CyclomaticComplexityDiagnosticTest extends AbstractDiagnosticTest<Cyclomat
3737
@Test
3838
void test() {
3939

40+
assertThat(diagnosticInstance.getInfo().getExtraMinForComplexity()).isEqualTo(1);
41+
4042
// when
4143
List<Diagnostic> diagnostics = getDiagnostics();
4244

@@ -45,7 +47,6 @@ void test() {
4547
assertThat(diagnostics, true)
4648
.hasRange(0, 8, 0, 32);
4749
assertThat(diagnostics.get(0).getRelatedInformation()).hasSize(21);
48-
4950
}
5051

5152
@Test

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,4 +143,13 @@ void testIAllDiagnostics() {
143143
assertThat(diagnosticErrors).isEmpty();
144144
}
145145

146+
@Test
147+
void testExtraMinForComplexity() {
148+
// нельзя ставить отрицательное значение
149+
diagnosticInfos.forEach(diagnosticInfo ->
150+
assertThat(diagnosticInfo.getExtraMinForComplexity())
151+
.as(diagnosticInfo.getCode().getStringValue())
152+
.isNotNegative()
153+
);
154+
}
146155
}

src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/metadata/DiagnosticInfoTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ void testCanLocateOnProject() {
155155
Assertions.assertThat(diagnosticInfo.isActivatedByDefault()).isTrue();
156156
Assertions.assertThat(diagnosticInfo.getTags()).isNotEmpty();
157157
Assertions.assertThat(diagnosticInfo.canLocateOnProject()).isTrue();
158+
Assertions.assertThat(diagnosticInfo.getExtraMinForComplexity()).isZero();
158159
}
159160

160161
@Test

0 commit comments

Comments
 (0)