Skip to content

Commit 2bfeb16

Browse files
committed
refactor(diagnostics): simplify expression handling in AbstractMagicValueDiagnostic and related classes
- Updated methods to accept non-optional parameters for expression contexts, improving clarity and reducing unnecessary optional handling. - Enhanced logic in methods to check context and structure, ensuring null safety and better readability. - Refactored MagicDateDiagnostic and MagicNumberDiagnostic to align with changes in AbstractMagicValueDiagnostic, streamlining diagnostic checks.
1 parent 7e5499d commit 2bfeb16

File tree

3 files changed

+63
-43
lines changed

3 files changed

+63
-43
lines changed

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

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,14 @@ protected static Optional<BSLParser.ExpressionContext> getExpression(BSLParserRu
6161
* Получить ExpressionContext из Optional узла.
6262
* Используется для ConstValueContext.
6363
*
64-
* @param constValue Optional с ConstValueContext
64+
* @param constValue ConstValueContext
6565
* @return Optional с ExpressionContext, если найден
6666
*/
67-
protected static Optional<BSLParser.ExpressionContext> getExpression(Optional<BSLParser.ConstValueContext> constValue) {
68-
return constValue
67+
protected static Optional<BSLParser.ExpressionContext> getExpression(BSLParser.ConstValueContext constValue) {
68+
if (constValue == null) {
69+
return Optional.empty();
70+
}
71+
return Optional.of(constValue)
6972
.map(BSLParserRuleContext::getParent)
7073
.filter(context -> context.getChildCount() == 1)
7174
.map(BSLParserRuleContext::getParent)
@@ -86,11 +89,11 @@ protected static Optional<BSLParser.ExpressionContext> getExpression(Optional<BS
8689
* @param expression выражение для проверки
8790
* @return true, если выражение находится внутри структуры или соответствия
8891
*/
89-
protected boolean insideStructureOrCorrespondence(Optional<BSLParser.ExpressionContext> expression) {
90-
if (expression.isEmpty()) {
92+
protected boolean insideStructureOrCorrespondence(BSLParser.ExpressionContext expression) {
93+
if (expression == null) {
9194
return false;
9295
}
93-
var expr = expression.get();
96+
var expr = expression;
9497

9598
if (checkInsideStructureInsertOrAdd(expr)) {
9699
return true;
@@ -328,7 +331,7 @@ && isAssignmentForVariable(assignmentContext, variableName)) {
328331
* @param variableName имя переменной
329332
* @return AssignmentContext или null, если не найден
330333
*/
331-
private BSLParser.AssignmentContext findAssignmentInCodeBlock(
334+
private static BSLParser.AssignmentContext findAssignmentInCodeBlock(
332335
BSLParser.CodeBlockContext codeBlock,
333336
BSLParserRuleContext beforeNode,
334337
String variableName
@@ -610,7 +613,7 @@ private boolean checkInsideCorrespondenceInsertFirstParam(BSLParser.ExpressionCo
610613
return false;
611614
}
612615

613-
private boolean isFirstParameterOfInsertMethod(BSLParser.ExpressionContext expression) {
616+
private static boolean isFirstParameterOfInsertMethod(BSLParser.ExpressionContext expression) {
614617
var callParamInfo = getCallParamInfo(expression);
615618
if (callParamInfo.length == 0) {
616619
return false;
@@ -634,7 +637,7 @@ private boolean isFirstParameterOfInsertMethod(BSLParser.ExpressionContext expre
634637
* @param expression выражение для проверки
635638
* @return true, если выражение находится в простом присваивании
636639
*/
637-
protected static boolean insideSimpleAssignment(Optional<BSLParser.ExpressionContext> expression) {
640+
protected static boolean insideSimpleAssignment(BSLParser.ExpressionContext expression) {
638641
return insideContext(expression, BSLParser.AssignmentContext.class);
639642
}
640643

@@ -644,7 +647,7 @@ protected static boolean insideSimpleAssignment(Optional<BSLParser.ExpressionCon
644647
* @param expression выражение для проверки
645648
* @return true, если выражение находится в return statement
646649
*/
647-
protected static boolean insideReturnStatement(Optional<BSLParser.ExpressionContext> expression) {
650+
protected static boolean insideReturnStatement(BSLParser.ExpressionContext expression) {
648651
return insideContext(expression, BSLParser.ReturnStatementContext.class);
649652
}
650653

@@ -655,12 +658,13 @@ protected static boolean insideReturnStatement(Optional<BSLParser.ExpressionCont
655658
* @param contextClass класс контекста для проверки
656659
* @return true, если выражение находится в указанном контексте
657660
*/
658-
protected static boolean insideContext(Optional<BSLParser.ExpressionContext> expression,
661+
protected static boolean insideContext(BSLParser.ExpressionContext expression,
659662
Class<? extends BSLParserRuleContext> contextClass) {
660-
return expression
661-
.map(BSLParserRuleContext::getParent)
662-
.filter(contextClass::isInstance)
663-
.isPresent();
663+
if (expression == null) {
664+
return false;
665+
}
666+
var parent = expression.getParent();
667+
return parent != null && contextClass.isInstance(parent);
664668
}
665669
}
666670

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

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import java.util.Arrays;
2525
import java.util.HashSet;
2626
import java.util.Map;
27-
import java.util.Optional;
2827
import java.util.Set;
2928
import java.util.regex.Pattern;
3029
import java.util.stream.Collectors;
@@ -37,7 +36,6 @@
3736
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag;
3837
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType;
3938
import com.github._1c_syntax.bsl.parser.BSLParser;
40-
import com.github._1c_syntax.bsl.parser.BSLParserRuleContext;
4139
import com.github._1c_syntax.utils.CaseInsensitivePattern;
4240

4341
@DiagnosticMetadata(
@@ -97,11 +95,12 @@ public ParseTree visitConstValue(BSLParser.ConstValueContext ctx) {
9795
return defaultResult();
9896
}
9997

100-
final var expressionContext = getExpression(Optional.of(ctx));
101-
if (insideStructureOrCorrespondence(expressionContext)) {
98+
final var expressionContext = getExpression(ctx);
99+
if (expressionContext.isPresent() && insideStructureOrCorrespondence(expressionContext.get())) {
102100
return defaultResult();
103101
}
104-
if (shouldAddDiagnostic(expressionContext)) {
102+
var expr = expressionContext.orElse(null);
103+
if (shouldAddDiagnostic(expr)) {
105104
diagnosticStorage.addDiagnostic(ctx, info.getMessage(ctx.getText()));
106105
}
107106
}
@@ -120,7 +119,7 @@ private static boolean isInsideDefaultValue(BSLParser.ConstValueContext ctx) {
120119
return false;
121120
}
122121

123-
private static boolean shouldAddDiagnostic(Optional<BSLParser.ExpressionContext> expressionContext) {
122+
private static boolean shouldAddDiagnostic(BSLParser.ExpressionContext expressionContext) {
124123
return !insideSimpleAssignment(expressionContext)
125124
&& !insideReturnStatement(expressionContext)
126125
&& !insideAssignmentWithDateMethodForSimpleDate(expressionContext);
@@ -174,25 +173,42 @@ private boolean isExcluded(String text) {
174173
}
175174

176175

177-
private static boolean insideAssignmentWithDateMethodForSimpleDate(Optional<BSLParser.ExpressionContext> expression) {
178-
return expression
179-
.map(BSLParserRuleContext::getParent) // callParam
180-
.filter(context -> context.getChildCount() == 1)
181-
.map(BSLParserRuleContext::getParent) // callParamList
182-
.filter(context -> context.getChildCount() == 1)
183-
.map(BSLParserRuleContext::getParent) // doCall
184-
.map(BSLParserRuleContext::getParent) // globalCall - метод Дата(ХХХ)
185-
.filter(BSLParser.GlobalMethodCallContext.class::isInstance)
186-
.map(BSLParser.GlobalMethodCallContext.class::cast)
187-
.filter(context -> METHOD_PATTERN.matcher(context.methodName().getText()).matches())
188-
.map(BSLParserRuleContext::getParent) // complexId
189-
.filter(context -> context.getChildCount() == 1)
190-
.map(BSLParserRuleContext::getParent) // member
191-
.filter(context -> context.getChildCount() == 1)
192-
.map(BSLParserRuleContext::getParent) // expression
193-
.filter(context -> context.getChildCount() == 1)
194-
.map(BSLParserRuleContext::getParent)
195-
.filter(BSLParser.AssignmentContext.class::isInstance)
196-
.isPresent();
176+
private static boolean insideAssignmentWithDateMethodForSimpleDate(BSLParser.ExpressionContext expression) {
177+
if (expression == null) {
178+
return false;
179+
}
180+
var callParam = expression.getParent(); // callParam
181+
if (callParam == null || callParam.getChildCount() != 1) {
182+
return false;
183+
}
184+
var callParamList = callParam.getParent(); // callParamList
185+
if (callParamList == null || callParamList.getChildCount() != 1) {
186+
return false;
187+
}
188+
var doCall = callParamList.getParent(); // doCall
189+
if (doCall == null) {
190+
return false;
191+
}
192+
var globalCall = doCall.getParent(); // globalCall - метод Дата(ХХХ)
193+
if (!(globalCall instanceof BSLParser.GlobalMethodCallContext globalMethodCall)) {
194+
return false;
195+
}
196+
if (!METHOD_PATTERN.matcher(globalMethodCall.methodName().getText()).matches()) {
197+
return false;
198+
}
199+
var complexId = globalCall.getParent(); // complexId
200+
if (complexId == null || complexId.getChildCount() != 1) {
201+
return false;
202+
}
203+
var member = complexId.getParent(); // member
204+
if (member == null || member.getChildCount() != 1) {
205+
return false;
206+
}
207+
var expr = member.getParent(); // expression
208+
if (expr == null || expr.getChildCount() != 1) {
209+
return false;
210+
}
211+
var assignment = expr.getParent();
212+
return assignment instanceof BSLParser.AssignmentContext;
197213
}
198214
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,10 @@ private boolean isWrongExpression(BSLParser.NumericContext ctx, BSLParserRuleCon
120120
}
121121

122122
var expression = getExpression(numericContextParent);
123-
if (expression.isPresent() && insideStructureOrCorrespondence(expression)) {
123+
if (expression.isPresent() && insideStructureOrCorrespondence(expression.get())) {
124124
return false;
125125
}
126-
if (expression.isPresent() && insideReturnStatement(expression)) {
126+
if (expression.isPresent() && insideReturnStatement(expression.get())) {
127127
return true;
128128
}
129129
return expression

0 commit comments

Comments
 (0)